diff --git a/.github/actions/deploy-docs-site/main.js b/.github/actions/deploy-docs-site/main.js index d9fd5a52cdf8..2498aa70f5cc 100644 --- a/.github/actions/deploy-docs-site/main.js +++ b/.github/actions/deploy-docs-site/main.js @@ -351,44 +351,44 @@ var require_tunnel = __commonJS({ return agent; } function TunnelingAgent(options) { - var self = this; - self.options = options || {}; - self.proxyOptions = self.options.proxy || {}; - self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; - self.requests = []; - self.sockets = []; - self.on("free", function onFree(socket, host, port, localAddress) { + var self2 = this; + self2.options = options || {}; + self2.proxyOptions = self2.options.proxy || {}; + self2.maxSockets = self2.options.maxSockets || http.Agent.defaultMaxSockets; + self2.requests = []; + self2.sockets = []; + self2.on("free", function onFree(socket, host, port, localAddress) { var options2 = toOptions(host, port, localAddress); - for (var i = 0, len = self.requests.length; i < len; ++i) { - var pending = self.requests[i]; + for (var i = 0, len = self2.requests.length; i < len; ++i) { + var pending = self2.requests[i]; if (pending.host === options2.host && pending.port === options2.port) { - self.requests.splice(i, 1); + self2.requests.splice(i, 1); pending.request.onSocket(socket); return; } } socket.destroy(); - self.removeSocket(socket); + self2.removeSocket(socket); }); } util.inherits(TunnelingAgent, events.EventEmitter); TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { - var self = this; - var options = mergeOptions({ request: req }, self.options, toOptions(host, port, localAddress)); - if (self.sockets.length >= this.maxSockets) { - self.requests.push(options); + var self2 = this; + var options = mergeOptions({ request: req }, self2.options, toOptions(host, port, localAddress)); + if (self2.sockets.length >= this.maxSockets) { + self2.requests.push(options); return; } - self.createSocket(options, function(socket) { + self2.createSocket(options, function(socket) { socket.on("free", onFree); socket.on("close", onCloseOrRemove); socket.on("agentRemove", onCloseOrRemove); req.onSocket(socket); function onFree() { - self.emit("free", socket, options); + self2.emit("free", socket, options); } function onCloseOrRemove(err) { - self.removeSocket(socket); + self2.removeSocket(socket); socket.removeListener("free", onFree); socket.removeListener("close", onCloseOrRemove); socket.removeListener("agentRemove", onCloseOrRemove); @@ -396,10 +396,10 @@ var require_tunnel = __commonJS({ }); }; TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { - var self = this; + var self2 = this; var placeholder = {}; - self.sockets.push(placeholder); - var connectOptions = mergeOptions({}, self.proxyOptions, { + self2.sockets.push(placeholder); + var connectOptions = mergeOptions({}, self2.proxyOptions, { method: "CONNECT", path: options.host + ":" + options.port, agent: false, @@ -415,7 +415,7 @@ var require_tunnel = __commonJS({ connectOptions.headers["Proxy-Authorization"] = "Basic " + new Buffer(connectOptions.proxyAuth).toString("base64"); } debug("making CONNECT request"); - var connectReq = self.request(connectOptions); + var connectReq = self2.request(connectOptions); connectReq.useChunkedEncodingByDefault = false; connectReq.once("response", onResponse); connectReq.once("upgrade", onUpgrade); @@ -442,7 +442,7 @@ var require_tunnel = __commonJS({ var error = new Error("tunneling socket could not be established, statusCode=" + res.statusCode); error.code = "ECONNRESET"; options.request.emit("error", error); - self.removeSocket(placeholder); + self2.removeSocket(placeholder); return; } if (head.length > 0) { @@ -451,11 +451,11 @@ var require_tunnel = __commonJS({ var error = new Error("got illegal response body from proxy"); error.code = "ECONNRESET"; options.request.emit("error", error); - self.removeSocket(placeholder); + self2.removeSocket(placeholder); return; } debug("tunneling connection has established"); - self.sockets[self.sockets.indexOf(placeholder)] = socket; + self2.sockets[self2.sockets.indexOf(placeholder)] = socket; return cb(socket); } function onError(cause) { @@ -468,7 +468,7 @@ var require_tunnel = __commonJS({ var error = new Error("tunneling socket could not be established, cause=" + cause.message); error.code = "ECONNRESET"; options.request.emit("error", error); - self.removeSocket(placeholder); + self2.removeSocket(placeholder); } }; TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { @@ -485,15 +485,15 @@ var require_tunnel = __commonJS({ } }; function createSecureSocket(options, cb) { - var self = this; - TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { + var self2 = this; + TunnelingAgent.prototype.createSocket.call(self2, options, function(socket) { var hostHeader = options.request.getHeader("host"); - var tlsOptions = mergeOptions({}, self.options, { + var tlsOptions = mergeOptions({}, self2.options, { socket, servername: hostHeader ? hostHeader.replace(/:.*$/, "") : options.host }); var secureSocket = tls.connect(0, tlsOptions); - self.sockets[self.sockets.indexOf(socket)] = secureSocket; + self2.sockets[self2.sockets.indexOf(socket)] = secureSocket; cb(secureSocket); }); } @@ -1875,13 +1875,13 @@ var require_io = __commonJS({ }); } exports.mkdirP = mkdirP; - function which(tool, check) { + function which2(tool, check) { return __awaiter(this, void 0, void 0, function* () { if (!tool) { throw new Error("parameter 'tool' is required"); } if (check) { - const result = yield which(tool, false); + const result = yield which2(tool, false); if (!result) { if (ioUtil.IS_WINDOWS) { throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`); @@ -1898,7 +1898,7 @@ var require_io = __commonJS({ return ""; }); } - exports.which = which; + exports.which = which2; function findInPath(tool) { return __awaiter(this, void 0, void 0, function* () { if (!tool) { @@ -3283,7 +3283,7 @@ var require_dist_node2 = __commonJS({ }); module.exports = __toCommonJS(dist_src_exports); var import_universal_user_agent7 = require_dist_node(); - var VERSION11 = "9.0.5"; + var VERSION11 = "9.0.6"; var userAgent3 = `octokit-endpoint.js/${VERSION11} ${(0, import_universal_user_agent7.getUserAgent)()}`; var DEFAULTS3 = { method: "GET", @@ -3373,9 +3373,9 @@ var require_dist_node2 = __commonJS({ return `${name}=${encodeURIComponent(parameters[name])}`; }).join("&"); } - var urlVariableRegex3 = /\{[^}]+\}/g; + var urlVariableRegex3 = /\{[^{}}]+\}/g; function removeNonChars3(variableName) { - return variableName.replace(/^\W+|\W+$/g, "").split(/,/); + return variableName.replace(/(?:^\W+)|(?:(? { const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; return `application/vnd.github.${preview}-preview${format}`; @@ -4158,13 +4158,13 @@ var require_dist_node7 = __commonJS({ createTokenAuth: () => createTokenAuth3 }); module.exports = __toCommonJS(dist_src_exports); - var REGEX_IS_INSTALLATION_LEGACY2 = /^v1\./; - var REGEX_IS_INSTALLATION2 = /^ghs_/; - var REGEX_IS_USER_TO_SERVER2 = /^ghu_/; + var REGEX_IS_INSTALLATION_LEGACY = /^v1\./; + var REGEX_IS_INSTALLATION = /^ghs_/; + var REGEX_IS_USER_TO_SERVER = /^ghu_/; async function auth2(token) { const isApp = token.split(/\./).length === 3; - const isInstallation = REGEX_IS_INSTALLATION_LEGACY2.test(token) || REGEX_IS_INSTALLATION2.test(token); - const isUserToServer = REGEX_IS_USER_TO_SERVER2.test(token); + const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token); + const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token); const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth"; return { type: "token", @@ -7376,6 +7376,7 @@ var require_re = __commonJS({ var re = exports.re = []; var safeRe = exports.safeRe = []; var src = exports.src = []; + var safeSrc = exports.safeSrc = []; var t = exports.t = {}; var R = 0; var LETTERDASHNUMBER = "[a-zA-Z0-9-]"; @@ -7396,6 +7397,7 @@ var require_re = __commonJS({ debug(name, index, value); t[name] = index; src[index] = value; + safeSrc[index] = safe; re[index] = new RegExp(value, isGlobal ? "g" : void 0); safeRe[index] = new RegExp(safe, isGlobal ? "g" : void 0); }; @@ -7492,7 +7494,7 @@ var require_semver = __commonJS({ ""(exports, module) { var debug = require_debug(); var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants(); - var { safeRe: re, t } = require_re(); + var { safeRe: re, safeSrc: src, t } = require_re(); var parseOptions = require_parse_options(); var { compareIdentifiers } = require_identifiers(); var SemVer = class { @@ -7630,6 +7632,18 @@ var require_semver = __commonJS({ } while (++i); } inc(release, identifier, identifierBase) { + if (release.startsWith("pre")) { + if (!identifier && identifierBase === false) { + throw new Error("invalid increment argument: identifier is empty"); + } + if (identifier) { + const r = new RegExp(`^${this.options.loose ? src[t.PRERELEASELOOSE] : src[t.PRERELEASE]}$`); + const match = `-${identifier}`.match(r); + if (!match || match[1] !== identifier) { + throw new Error(`invalid identifier: ${identifier}`); + } + } + } switch (release) { case "premajor": this.prerelease.length = 0; @@ -7655,6 +7669,12 @@ var require_semver = __commonJS({ } this.inc("pre", identifier, identifierBase); break; + case "release": + if (this.prerelease.length === 0) { + throw new Error(`version ${this.raw} is not a prerelease`); + } + this.prerelease.length = 0; + break; case "major": if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) { this.major++; @@ -7678,9 +7698,6 @@ var require_semver = __commonJS({ break; case "pre": { const base = Number(identifierBase) ? 1 : 0; - if (!identifier && identifierBase === false) { - throw new Error("invalid increment argument: identifier is empty"); - } if (this.prerelease.length === 0) { this.prerelease = [base]; } else { @@ -7815,13 +7832,12 @@ var require_diff = __commonJS({ if (!lowVersion.patch && !lowVersion.minor) { return "major"; } - if (highVersion.patch) { + if (lowVersion.compareMain(highVersion) === 0) { + if (lowVersion.minor && !lowVersion.patch) { + return "minor"; + } return "patch"; } - if (highVersion.minor) { - return "minor"; - } - return "major"; } const prefix = highHasPre ? "pre" : ""; if (v1.major !== v2.major) { @@ -9468,82 +9484,15032 @@ var require_fast_content_type_parse = __commonJS({ if (typeof header !== "string") { throw new TypeError("argument header is required and must be a string"); } - let index = header.indexOf(";"); - const type = index !== -1 ? header.slice(0, index).trim() : header.trim(); - if (mediaTypeRE.test(type) === false) { - throw new TypeError("invalid media type"); + let index = header.indexOf(";"); + const type = index !== -1 ? header.slice(0, index).trim() : header.trim(); + if (mediaTypeRE.test(type) === false) { + throw new TypeError("invalid media type"); + } + const result = { + type: type.toLowerCase(), + parameters: new NullObject() + }; + if (index === -1) { + return result; + } + let key; + let match; + let value; + paramRE.lastIndex = index; + while (match = paramRE.exec(header)) { + if (match.index !== index) { + throw new TypeError("invalid parameter format"); + } + index += match[0].length; + key = match[1].toLowerCase(); + value = match[2]; + if (value[0] === '"') { + value = value.slice(1, value.length - 1); + quotedPairRE.test(value) && (value = value.replace(quotedPairRE, "$1")); + } + result.parameters[key] = value; + } + if (index !== header.length) { + throw new TypeError("invalid parameter format"); + } + return result; + } + function safeParse3(header) { + if (typeof header !== "string") { + return defaultContentType; + } + let index = header.indexOf(";"); + const type = index !== -1 ? header.slice(0, index).trim() : header.trim(); + if (mediaTypeRE.test(type) === false) { + return defaultContentType; + } + const result = { + type: type.toLowerCase(), + parameters: new NullObject() + }; + if (index === -1) { + return result; + } + let key; + let match; + let value; + paramRE.lastIndex = index; + while (match = paramRE.exec(header)) { + if (match.index !== index) { + return defaultContentType; + } + index += match[0].length; + key = match[1].toLowerCase(); + value = match[2]; + if (value[0] === '"') { + value = value.slice(1, value.length - 1); + quotedPairRE.test(value) && (value = value.replace(quotedPairRE, "$1")); + } + result.parameters[key] = value; + } + if (index !== header.length) { + return defaultContentType; + } + return result; + } + module.exports.default = { parse: parse3, safeParse: safeParse3 }; + module.exports.parse = parse3; + module.exports.safeParse = safeParse3; + module.exports.defaultContentType = defaultContentType; + } +}); + +// +var require_posix = __commonJS({ + ""(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.sync = exports.isexe = void 0; + var fs_1 = __require("fs"); + var promises_1 = __require("fs/promises"); + var isexe = async (path, options = {}) => { + const { ignoreErrors = false } = options; + try { + return checkStat(await (0, promises_1.stat)(path), options); + } catch (e) { + const er = e; + if (ignoreErrors || er.code === "EACCES") + return false; + throw er; + } + }; + exports.isexe = isexe; + var sync = (path, options = {}) => { + const { ignoreErrors = false } = options; + try { + return checkStat((0, fs_1.statSync)(path), options); + } catch (e) { + const er = e; + if (ignoreErrors || er.code === "EACCES") + return false; + throw er; + } + }; + exports.sync = sync; + var checkStat = (stat, options) => stat.isFile() && checkMode(stat, options); + var checkMode = (stat, options) => { + var _a, _b, _c; + const myUid = options.uid ?? ((_a = process.getuid) == null ? void 0 : _a.call(process)); + const myGroups = options.groups ?? ((_b = process.getgroups) == null ? void 0 : _b.call(process)) ?? []; + const myGid = options.gid ?? ((_c = process.getgid) == null ? void 0 : _c.call(process)) ?? myGroups[0]; + if (myUid === void 0 || myGid === void 0) { + throw new Error("cannot get uid or gid"); + } + const groups = /* @__PURE__ */ new Set([myGid, ...myGroups]); + const mod = stat.mode; + const uid = stat.uid; + const gid = stat.gid; + const u = parseInt("100", 8); + const g = parseInt("010", 8); + const o = parseInt("001", 8); + const ug = u | g; + return !!(mod & o || mod & g && groups.has(gid) || mod & u && uid === myUid || mod & ug && myUid === 0); + }; + } +}); + +// +var require_win32 = __commonJS({ + ""(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.sync = exports.isexe = void 0; + var fs_1 = __require("fs"); + var promises_1 = __require("fs/promises"); + var isexe = async (path, options = {}) => { + const { ignoreErrors = false } = options; + try { + return checkStat(await (0, promises_1.stat)(path), path, options); + } catch (e) { + const er = e; + if (ignoreErrors || er.code === "EACCES") + return false; + throw er; + } + }; + exports.isexe = isexe; + var sync = (path, options = {}) => { + const { ignoreErrors = false } = options; + try { + return checkStat((0, fs_1.statSync)(path), path, options); + } catch (e) { + const er = e; + if (ignoreErrors || er.code === "EACCES") + return false; + throw er; + } + }; + exports.sync = sync; + var checkPathExt = (path, options) => { + const { pathExt = process.env.PATHEXT || "" } = options; + const peSplit = pathExt.split(";"); + if (peSplit.indexOf("") !== -1) { + return true; + } + for (let i = 0; i < peSplit.length; i++) { + const p = peSplit[i].toLowerCase(); + const ext = path.substring(path.length - p.length).toLowerCase(); + if (p && ext === p) { + return true; + } + } + return false; + }; + var checkStat = (stat, path, options) => stat.isFile() && checkPathExt(path, options); + } +}); + +// +var require_options = __commonJS({ + ""(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + } +}); + +// +var require_cjs = __commonJS({ + ""(exports) { + "use strict"; + var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __exportStar = exports && exports.__exportStar || function(m, exports2) { + for (var p in m) + if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p)) + __createBinding(exports2, m, p); + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.sync = exports.isexe = exports.posix = exports.win32 = void 0; + var posix = __importStar(require_posix()); + exports.posix = posix; + var win32 = __importStar(require_win32()); + exports.win32 = win32; + __exportStar(require_options(), exports); + var platform = process.env._ISEXE_TEST_PLATFORM_ || process.platform; + var impl = platform === "win32" ? win32 : posix; + exports.isexe = impl.isexe; + exports.sync = impl.sync; + } +}); + +// +var require_lib2 = __commonJS({ + ""(exports, module) { + var { isexe, sync: isexeSync } = require_cjs(); + var { join: join3, delimiter, sep: sep2, posix } = __require("path"); + var isWindows = process.platform === "win32"; + var rSlash = new RegExp(`[${posix.sep}${sep2 === posix.sep ? "" : sep2}]`.replace(/(\\)/g, "\\$1")); + var rRel = new RegExp(`^\\.${rSlash.source}`); + var getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: "ENOENT" }); + var getPathInfo = (cmd, { + path: optPath = process.env.PATH, + pathExt: optPathExt = process.env.PATHEXT, + delimiter: optDelimiter = delimiter + }) => { + const pathEnv = cmd.match(rSlash) ? [""] : [ + ...isWindows ? [process.cwd()] : [], + ...(optPath || "").split(optDelimiter) + ]; + if (isWindows) { + const pathExtExe = optPathExt || [".EXE", ".CMD", ".BAT", ".COM"].join(optDelimiter); + const pathExt = pathExtExe.split(optDelimiter).flatMap((item) => [item, item.toLowerCase()]); + if (cmd.includes(".") && pathExt[0] !== "") { + pathExt.unshift(""); + } + return { pathEnv, pathExt, pathExtExe }; + } + return { pathEnv, pathExt: [""] }; + }; + var getPathPart = (raw, cmd) => { + const pathPart = /^".*"$/.test(raw) ? raw.slice(1, -1) : raw; + const prefix = !pathPart && rRel.test(cmd) ? cmd.slice(0, 2) : ""; + return prefix + join3(pathPart, cmd); + }; + var which2 = async (cmd, opt = {}) => { + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt); + const found = []; + for (const envPart of pathEnv) { + const p = getPathPart(envPart, cmd); + for (const ext of pathExt) { + const withExt = p + ext; + const is = await isexe(withExt, { pathExt: pathExtExe, ignoreErrors: true }); + if (is) { + if (!opt.all) { + return withExt; + } + found.push(withExt); + } + } + } + if (opt.all && found.length) { + return found; + } + if (opt.nothrow) { + return null; + } + throw getNotFoundError(cmd); + }; + var whichSync = (cmd, opt = {}) => { + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt); + const found = []; + for (const pathEnvPart of pathEnv) { + const p = getPathPart(pathEnvPart, cmd); + for (const ext of pathExt) { + const withExt = p + ext; + const is = isexeSync(withExt, { pathExt: pathExtExe, ignoreErrors: true }); + if (is) { + if (!opt.all) { + return withExt; + } + found.push(withExt); + } + } + } + if (opt.all && found.length) { + return found; + } + if (opt.nothrow) { + return null; + } + throw getNotFoundError(cmd); + }; + module.exports = which2; + which2.sync = whichSync; + } +}); + +// +var require_lockfile = __commonJS({ + ""(exports, module) { + module.exports = function(modules) { + var installedModules = {}; + function __webpack_require__(moduleId) { + if (installedModules[moduleId]) { + return installedModules[moduleId].exports; + } + var module2 = installedModules[moduleId] = { + i: moduleId, + l: false, + exports: {} + }; + modules[moduleId].call(module2.exports, module2, module2.exports, __webpack_require__); + module2.l = true; + return module2.exports; + } + __webpack_require__.m = modules; + __webpack_require__.c = installedModules; + __webpack_require__.i = function(value) { + return value; + }; + __webpack_require__.d = function(exports2, name, getter) { + if (!__webpack_require__.o(exports2, name)) { + Object.defineProperty(exports2, name, { + configurable: false, + enumerable: true, + get: getter + }); + } + }; + __webpack_require__.n = function(module2) { + var getter = module2 && module2.__esModule ? function getDefault() { + return module2["default"]; + } : function getModuleExports() { + return module2; + }; + __webpack_require__.d(getter, "a", getter); + return getter; + }; + __webpack_require__.o = function(object, property) { + return Object.prototype.hasOwnProperty.call(object, property); + }; + __webpack_require__.p = ""; + return __webpack_require__(__webpack_require__.s = 14); + }([ + function(module2, exports2) { + module2.exports = __require("path"); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + exports2.__esModule = true; + var _promise = __webpack_require__(173); + var _promise2 = _interopRequireDefault(_promise); + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + exports2.default = function(fn) { + return function() { + var gen = fn.apply(this, arguments); + return new _promise2.default(function(resolve, reject) { + function step(key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + if (info.done) { + resolve(value); + } else { + return _promise2.default.resolve(value).then(function(value2) { + step("next", value2); + }, function(err) { + step("throw", err); + }); + } + } + return step("next"); + }); + }; + }; + }, + function(module2, exports2) { + module2.exports = __require("util"); + }, + function(module2, exports2) { + module2.exports = __require("fs"); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + class MessageError extends Error { + constructor(msg, code) { + super(msg); + this.code = code; + } + } + exports2.MessageError = MessageError; + class ProcessSpawnError extends MessageError { + constructor(msg, code, process4) { + super(msg, code); + this.process = process4; + } + } + exports2.ProcessSpawnError = ProcessSpawnError; + class SecurityError extends MessageError { + } + exports2.SecurityError = SecurityError; + class ProcessTermError extends MessageError { + } + exports2.ProcessTermError = ProcessTermError; + class ResponseError extends Error { + constructor(msg, responseCode) { + super(msg); + this.responseCode = responseCode; + } + } + exports2.ResponseError = ResponseError; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.getFirstSuitableFolder = exports2.readFirstAvailableStream = exports2.makeTempDir = exports2.hardlinksWork = exports2.writeFilePreservingEol = exports2.getFileSizeOnDisk = exports2.walk = exports2.symlink = exports2.find = exports2.readJsonAndFile = exports2.readJson = exports2.readFileAny = exports2.hardlinkBulk = exports2.copyBulk = exports2.unlink = exports2.glob = exports2.link = exports2.chmod = exports2.lstat = exports2.exists = exports2.mkdirp = exports2.stat = exports2.access = exports2.rename = exports2.readdir = exports2.realpath = exports2.readlink = exports2.writeFile = exports2.open = exports2.readFileBuffer = exports2.lockQueue = exports2.constants = void 0; + var _asyncToGenerator2; + function _load_asyncToGenerator() { + return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(1)); + } + let buildActionsForCopy = (() => { + var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, events, possibleExtraneous, reporter) { + let build = (() => { + var _ref5 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + const src = data.src, dest = data.dest, type = data.type; + const onFresh = data.onFresh || noop2; + const onDone = data.onDone || noop2; + if (files.has(dest.toLowerCase())) { + reporter.verbose(`The case-insensitive file ${dest} shouldn't be copied twice in one bulk copy`); + } else { + files.add(dest.toLowerCase()); + } + if (type === "symlink") { + yield mkdirp((_path || _load_path()).default.dirname(dest)); + onFresh(); + actions.symlink.push({ + dest, + linkname: src + }); + onDone(); + return; + } + if (events.ignoreBasenames.indexOf((_path || _load_path()).default.basename(src)) >= 0) { + return; + } + const srcStat = yield lstat(src); + let srcFiles; + if (srcStat.isDirectory()) { + srcFiles = yield readdir(src); + } + let destStat; + try { + destStat = yield lstat(dest); + } catch (e) { + if (e.code !== "ENOENT") { + throw e; + } + } + if (destStat) { + const bothSymlinks = srcStat.isSymbolicLink() && destStat.isSymbolicLink(); + const bothFolders = srcStat.isDirectory() && destStat.isDirectory(); + const bothFiles = srcStat.isFile() && destStat.isFile(); + if (bothFiles && artifactFiles.has(dest)) { + onDone(); + reporter.verbose(reporter.lang("verboseFileSkipArtifact", src)); + return; + } + if (bothFiles && srcStat.size === destStat.size && (0, (_fsNormalized || _load_fsNormalized()).fileDatesEqual)(srcStat.mtime, destStat.mtime)) { + onDone(); + reporter.verbose(reporter.lang("verboseFileSkip", src, dest, srcStat.size, +srcStat.mtime)); + return; + } + if (bothSymlinks) { + const srcReallink = yield readlink(src); + if (srcReallink === (yield readlink(dest))) { + onDone(); + reporter.verbose(reporter.lang("verboseFileSkipSymlink", src, dest, srcReallink)); + return; + } + } + if (bothFolders) { + const destFiles = yield readdir(dest); + invariant(srcFiles, "src files not initialised"); + for (var _iterator4 = destFiles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator](); ; ) { + var _ref6; + if (_isArray4) { + if (_i4 >= _iterator4.length) + break; + _ref6 = _iterator4[_i4++]; + } else { + _i4 = _iterator4.next(); + if (_i4.done) + break; + _ref6 = _i4.value; + } + const file = _ref6; + if (srcFiles.indexOf(file) < 0) { + const loc = (_path || _load_path()).default.join(dest, file); + possibleExtraneous.add(loc); + if ((yield lstat(loc)).isDirectory()) { + for (var _iterator5 = yield readdir(loc), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator](); ; ) { + var _ref7; + if (_isArray5) { + if (_i5 >= _iterator5.length) + break; + _ref7 = _iterator5[_i5++]; + } else { + _i5 = _iterator5.next(); + if (_i5.done) + break; + _ref7 = _i5.value; + } + const file2 = _ref7; + possibleExtraneous.add((_path || _load_path()).default.join(loc, file2)); + } + } + } + } + } + } + if (destStat && destStat.isSymbolicLink()) { + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dest); + destStat = null; + } + if (srcStat.isSymbolicLink()) { + onFresh(); + const linkname = yield readlink(src); + actions.symlink.push({ + dest, + linkname + }); + onDone(); + } else if (srcStat.isDirectory()) { + if (!destStat) { + reporter.verbose(reporter.lang("verboseFileFolder", dest)); + yield mkdirp(dest); + } + const destParts = dest.split((_path || _load_path()).default.sep); + while (destParts.length) { + files.add(destParts.join((_path || _load_path()).default.sep).toLowerCase()); + destParts.pop(); + } + invariant(srcFiles, "src files not initialised"); + let remaining = srcFiles.length; + if (!remaining) { + onDone(); + } + for (var _iterator6 = srcFiles, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator](); ; ) { + var _ref8; + if (_isArray6) { + if (_i6 >= _iterator6.length) + break; + _ref8 = _iterator6[_i6++]; + } else { + _i6 = _iterator6.next(); + if (_i6.done) + break; + _ref8 = _i6.value; + } + const file = _ref8; + queue.push({ + dest: (_path || _load_path()).default.join(dest, file), + onFresh, + onDone: function(_onDone) { + function onDone2() { + return _onDone.apply(this, arguments); + } + onDone2.toString = function() { + return _onDone.toString(); + }; + return onDone2; + }(function() { + if (--remaining === 0) { + onDone(); + } + }), + src: (_path || _load_path()).default.join(src, file) + }); + } + } else if (srcStat.isFile()) { + onFresh(); + actions.file.push({ + src, + dest, + atime: srcStat.atime, + mtime: srcStat.mtime, + mode: srcStat.mode + }); + onDone(); + } else { + throw new Error(`unsure how to copy this: ${src}`); + } + }); + return function build2(_x5) { + return _ref5.apply(this, arguments); + }; + })(); + const artifactFiles = new Set(events.artifactFiles || []); + const files = /* @__PURE__ */ new Set(); + for (var _iterator = queue, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); ; ) { + var _ref2; + if (_isArray) { + if (_i >= _iterator.length) + break; + _ref2 = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) + break; + _ref2 = _i.value; + } + const item = _ref2; + const onDone = item.onDone; + item.onDone = function() { + events.onProgress(item.dest); + if (onDone) { + onDone(); + } + }; + } + events.onStart(queue.length); + const actions = { + file: [], + symlink: [], + link: [] + }; + while (queue.length) { + const items = queue.splice(0, CONCURRENT_QUEUE_ITEMS); + yield Promise.all(items.map(build)); + } + for (var _iterator2 = artifactFiles, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator](); ; ) { + var _ref3; + if (_isArray2) { + if (_i2 >= _iterator2.length) + break; + _ref3 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) + break; + _ref3 = _i2.value; + } + const file = _ref3; + if (possibleExtraneous.has(file)) { + reporter.verbose(reporter.lang("verboseFilePhantomExtraneous", file)); + possibleExtraneous.delete(file); + } + } + for (var _iterator3 = possibleExtraneous, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator](); ; ) { + var _ref4; + if (_isArray3) { + if (_i3 >= _iterator3.length) + break; + _ref4 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) + break; + _ref4 = _i3.value; + } + const loc = _ref4; + if (files.has(loc.toLowerCase())) { + possibleExtraneous.delete(loc); + } + } + return actions; + }); + return function buildActionsForCopy2(_x, _x2, _x3, _x4) { + return _ref.apply(this, arguments); + }; + })(); + let buildActionsForHardlink = (() => { + var _ref9 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, events, possibleExtraneous, reporter) { + let build = (() => { + var _ref13 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + const src = data.src, dest = data.dest; + const onFresh = data.onFresh || noop2; + const onDone = data.onDone || noop2; + if (files.has(dest.toLowerCase())) { + onDone(); + return; + } + files.add(dest.toLowerCase()); + if (events.ignoreBasenames.indexOf((_path || _load_path()).default.basename(src)) >= 0) { + return; + } + const srcStat = yield lstat(src); + let srcFiles; + if (srcStat.isDirectory()) { + srcFiles = yield readdir(src); + } + const destExists = yield exists(dest); + if (destExists) { + const destStat = yield lstat(dest); + const bothSymlinks = srcStat.isSymbolicLink() && destStat.isSymbolicLink(); + const bothFolders = srcStat.isDirectory() && destStat.isDirectory(); + const bothFiles = srcStat.isFile() && destStat.isFile(); + if (srcStat.mode !== destStat.mode) { + try { + yield access(dest, srcStat.mode); + } catch (err) { + reporter.verbose(err); + } + } + if (bothFiles && artifactFiles.has(dest)) { + onDone(); + reporter.verbose(reporter.lang("verboseFileSkipArtifact", src)); + return; + } + if (bothFiles && srcStat.ino !== null && srcStat.ino === destStat.ino) { + onDone(); + reporter.verbose(reporter.lang("verboseFileSkip", src, dest, srcStat.ino)); + return; + } + if (bothSymlinks) { + const srcReallink = yield readlink(src); + if (srcReallink === (yield readlink(dest))) { + onDone(); + reporter.verbose(reporter.lang("verboseFileSkipSymlink", src, dest, srcReallink)); + return; + } + } + if (bothFolders) { + const destFiles = yield readdir(dest); + invariant(srcFiles, "src files not initialised"); + for (var _iterator10 = destFiles, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator](); ; ) { + var _ref14; + if (_isArray10) { + if (_i10 >= _iterator10.length) + break; + _ref14 = _iterator10[_i10++]; + } else { + _i10 = _iterator10.next(); + if (_i10.done) + break; + _ref14 = _i10.value; + } + const file = _ref14; + if (srcFiles.indexOf(file) < 0) { + const loc = (_path || _load_path()).default.join(dest, file); + possibleExtraneous.add(loc); + if ((yield lstat(loc)).isDirectory()) { + for (var _iterator11 = yield readdir(loc), _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator](); ; ) { + var _ref15; + if (_isArray11) { + if (_i11 >= _iterator11.length) + break; + _ref15 = _iterator11[_i11++]; + } else { + _i11 = _iterator11.next(); + if (_i11.done) + break; + _ref15 = _i11.value; + } + const file2 = _ref15; + possibleExtraneous.add((_path || _load_path()).default.join(loc, file2)); + } + } + } + } + } + } + if (srcStat.isSymbolicLink()) { + onFresh(); + const linkname = yield readlink(src); + actions.symlink.push({ + dest, + linkname + }); + onDone(); + } else if (srcStat.isDirectory()) { + reporter.verbose(reporter.lang("verboseFileFolder", dest)); + yield mkdirp(dest); + const destParts = dest.split((_path || _load_path()).default.sep); + while (destParts.length) { + files.add(destParts.join((_path || _load_path()).default.sep).toLowerCase()); + destParts.pop(); + } + invariant(srcFiles, "src files not initialised"); + let remaining = srcFiles.length; + if (!remaining) { + onDone(); + } + for (var _iterator12 = srcFiles, _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator](); ; ) { + var _ref16; + if (_isArray12) { + if (_i12 >= _iterator12.length) + break; + _ref16 = _iterator12[_i12++]; + } else { + _i12 = _iterator12.next(); + if (_i12.done) + break; + _ref16 = _i12.value; + } + const file = _ref16; + queue.push({ + onFresh, + src: (_path || _load_path()).default.join(src, file), + dest: (_path || _load_path()).default.join(dest, file), + onDone: function(_onDone2) { + function onDone2() { + return _onDone2.apply(this, arguments); + } + onDone2.toString = function() { + return _onDone2.toString(); + }; + return onDone2; + }(function() { + if (--remaining === 0) { + onDone(); + } + }) + }); + } + } else if (srcStat.isFile()) { + onFresh(); + actions.link.push({ + src, + dest, + removeDest: destExists + }); + onDone(); + } else { + throw new Error(`unsure how to copy this: ${src}`); + } + }); + return function build2(_x10) { + return _ref13.apply(this, arguments); + }; + })(); + const artifactFiles = new Set(events.artifactFiles || []); + const files = /* @__PURE__ */ new Set(); + for (var _iterator7 = queue, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator](); ; ) { + var _ref10; + if (_isArray7) { + if (_i7 >= _iterator7.length) + break; + _ref10 = _iterator7[_i7++]; + } else { + _i7 = _iterator7.next(); + if (_i7.done) + break; + _ref10 = _i7.value; + } + const item = _ref10; + const onDone = item.onDone || noop2; + item.onDone = function() { + events.onProgress(item.dest); + onDone(); + }; + } + events.onStart(queue.length); + const actions = { + file: [], + symlink: [], + link: [] + }; + while (queue.length) { + const items = queue.splice(0, CONCURRENT_QUEUE_ITEMS); + yield Promise.all(items.map(build)); + } + for (var _iterator8 = artifactFiles, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator](); ; ) { + var _ref11; + if (_isArray8) { + if (_i8 >= _iterator8.length) + break; + _ref11 = _iterator8[_i8++]; + } else { + _i8 = _iterator8.next(); + if (_i8.done) + break; + _ref11 = _i8.value; + } + const file = _ref11; + if (possibleExtraneous.has(file)) { + reporter.verbose(reporter.lang("verboseFilePhantomExtraneous", file)); + possibleExtraneous.delete(file); + } + } + for (var _iterator9 = possibleExtraneous, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator](); ; ) { + var _ref12; + if (_isArray9) { + if (_i9 >= _iterator9.length) + break; + _ref12 = _iterator9[_i9++]; + } else { + _i9 = _iterator9.next(); + if (_i9.done) + break; + _ref12 = _i9.value; + } + const loc = _ref12; + if (files.has(loc.toLowerCase())) { + possibleExtraneous.delete(loc); + } + } + return actions; + }); + return function buildActionsForHardlink2(_x6, _x7, _x8, _x9) { + return _ref9.apply(this, arguments); + }; + })(); + let copyBulk = exports2.copyBulk = (() => { + var _ref17 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, reporter, _events) { + const events = { + onStart: _events && _events.onStart || noop2, + onProgress: _events && _events.onProgress || noop2, + possibleExtraneous: _events ? _events.possibleExtraneous : /* @__PURE__ */ new Set(), + ignoreBasenames: _events && _events.ignoreBasenames || [], + artifactFiles: _events && _events.artifactFiles || [] + }; + const actions = yield buildActionsForCopy(queue, events, events.possibleExtraneous, reporter); + events.onStart(actions.file.length + actions.symlink.length + actions.link.length); + const fileActions = actions.file; + const currentlyWriting = /* @__PURE__ */ new Map(); + yield (_promise || _load_promise()).queue(fileActions, (() => { + var _ref18 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + let writePromise; + while (writePromise = currentlyWriting.get(data.dest)) { + yield writePromise; + } + reporter.verbose(reporter.lang("verboseFileCopy", data.src, data.dest)); + const copier = (0, (_fsNormalized || _load_fsNormalized()).copyFile)(data, function() { + return currentlyWriting.delete(data.dest); + }); + currentlyWriting.set(data.dest, copier); + events.onProgress(data.dest); + return copier; + }); + return function(_x14) { + return _ref18.apply(this, arguments); + }; + })(), CONCURRENT_QUEUE_ITEMS); + const symlinkActions = actions.symlink; + yield (_promise || _load_promise()).queue(symlinkActions, function(data) { + const linkname = (_path || _load_path()).default.resolve((_path || _load_path()).default.dirname(data.dest), data.linkname); + reporter.verbose(reporter.lang("verboseFileSymlink", data.dest, linkname)); + return symlink(linkname, data.dest); + }); + }); + return function copyBulk2(_x11, _x12, _x13) { + return _ref17.apply(this, arguments); + }; + })(); + let hardlinkBulk = exports2.hardlinkBulk = (() => { + var _ref19 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, reporter, _events) { + const events = { + onStart: _events && _events.onStart || noop2, + onProgress: _events && _events.onProgress || noop2, + possibleExtraneous: _events ? _events.possibleExtraneous : /* @__PURE__ */ new Set(), + artifactFiles: _events && _events.artifactFiles || [], + ignoreBasenames: [] + }; + const actions = yield buildActionsForHardlink(queue, events, events.possibleExtraneous, reporter); + events.onStart(actions.file.length + actions.symlink.length + actions.link.length); + const fileActions = actions.link; + yield (_promise || _load_promise()).queue(fileActions, (() => { + var _ref20 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + reporter.verbose(reporter.lang("verboseFileLink", data.src, data.dest)); + if (data.removeDest) { + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(data.dest); + } + yield link(data.src, data.dest); + }); + return function(_x18) { + return _ref20.apply(this, arguments); + }; + })(), CONCURRENT_QUEUE_ITEMS); + const symlinkActions = actions.symlink; + yield (_promise || _load_promise()).queue(symlinkActions, function(data) { + const linkname = (_path || _load_path()).default.resolve((_path || _load_path()).default.dirname(data.dest), data.linkname); + reporter.verbose(reporter.lang("verboseFileSymlink", data.dest, linkname)); + return symlink(linkname, data.dest); + }); + }); + return function hardlinkBulk2(_x15, _x16, _x17) { + return _ref19.apply(this, arguments); + }; + })(); + let readFileAny = exports2.readFileAny = (() => { + var _ref21 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (files) { + for (var _iterator13 = files, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator](); ; ) { + var _ref22; + if (_isArray13) { + if (_i13 >= _iterator13.length) + break; + _ref22 = _iterator13[_i13++]; + } else { + _i13 = _iterator13.next(); + if (_i13.done) + break; + _ref22 = _i13.value; + } + const file = _ref22; + if (yield exists(file)) { + return readFile2(file); + } + } + return null; + }); + return function readFileAny2(_x19) { + return _ref21.apply(this, arguments); + }; + })(); + let readJson = exports2.readJson = (() => { + var _ref23 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) { + return (yield readJsonAndFile(loc)).object; + }); + return function readJson2(_x20) { + return _ref23.apply(this, arguments); + }; + })(); + let readJsonAndFile = exports2.readJsonAndFile = (() => { + var _ref24 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) { + const file = yield readFile2(loc); + try { + return { + object: (0, (_map || _load_map()).default)(JSON.parse(stripBOM(file))), + content: file + }; + } catch (err) { + err.message = `${loc}: ${err.message}`; + throw err; + } + }); + return function readJsonAndFile2(_x21) { + return _ref24.apply(this, arguments); + }; + })(); + let find = exports2.find = (() => { + var _ref25 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (filename, dir) { + const parts = dir.split((_path || _load_path()).default.sep); + while (parts.length) { + const loc = parts.concat(filename).join((_path || _load_path()).default.sep); + if (yield exists(loc)) { + return loc; + } else { + parts.pop(); + } + } + return false; + }); + return function find2(_x22, _x23) { + return _ref25.apply(this, arguments); + }; + })(); + let symlink = exports2.symlink = (() => { + var _ref26 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (src, dest) { + try { + const stats = yield lstat(dest); + if (stats.isSymbolicLink()) { + const resolved = yield realpath(dest); + if (resolved === src) { + return; + } + } + } catch (err) { + if (err.code !== "ENOENT") { + throw err; + } + } + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dest); + if (process.platform === "win32") { + yield fsSymlink(src, dest, "junction"); + } else { + let relative; + try { + relative = (_path || _load_path()).default.relative((_fs || _load_fs()).default.realpathSync((_path || _load_path()).default.dirname(dest)), (_fs || _load_fs()).default.realpathSync(src)); + } catch (err) { + if (err.code !== "ENOENT") { + throw err; + } + relative = (_path || _load_path()).default.relative((_path || _load_path()).default.dirname(dest), src); + } + yield fsSymlink(relative || ".", dest); + } + }); + return function symlink2(_x24, _x25) { + return _ref26.apply(this, arguments); + }; + })(); + let walk = exports2.walk = (() => { + var _ref27 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (dir, relativeDir, ignoreBasenames = /* @__PURE__ */ new Set()) { + let files = []; + let filenames = yield readdir(dir); + if (ignoreBasenames.size) { + filenames = filenames.filter(function(name) { + return !ignoreBasenames.has(name); + }); + } + for (var _iterator14 = filenames, _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator](); ; ) { + var _ref28; + if (_isArray14) { + if (_i14 >= _iterator14.length) + break; + _ref28 = _iterator14[_i14++]; + } else { + _i14 = _iterator14.next(); + if (_i14.done) + break; + _ref28 = _i14.value; + } + const name = _ref28; + const relative = relativeDir ? (_path || _load_path()).default.join(relativeDir, name) : name; + const loc = (_path || _load_path()).default.join(dir, name); + const stat2 = yield lstat(loc); + files.push({ + relative, + basename: name, + absolute: loc, + mtime: +stat2.mtime + }); + if (stat2.isDirectory()) { + files = files.concat(yield walk(loc, relative, ignoreBasenames)); + } + } + return files; + }); + return function walk2(_x26, _x27) { + return _ref27.apply(this, arguments); + }; + })(); + let getFileSizeOnDisk = exports2.getFileSizeOnDisk = (() => { + var _ref29 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) { + const stat2 = yield lstat(loc); + const size = stat2.size, blockSize = stat2.blksize; + return Math.ceil(size / blockSize) * blockSize; + }); + return function getFileSizeOnDisk2(_x28) { + return _ref29.apply(this, arguments); + }; + })(); + let getEolFromFile = (() => { + var _ref30 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (path) { + if (!(yield exists(path))) { + return void 0; + } + const buffer = yield readFileBuffer(path); + for (let i = 0; i < buffer.length; ++i) { + if (buffer[i] === cr) { + return "\r\n"; + } + if (buffer[i] === lf) { + return "\n"; + } + } + return void 0; + }); + return function getEolFromFile2(_x29) { + return _ref30.apply(this, arguments); + }; + })(); + let writeFilePreservingEol = exports2.writeFilePreservingEol = (() => { + var _ref31 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (path, data) { + const eol = (yield getEolFromFile(path)) || (_os || _load_os()).default.EOL; + if (eol !== "\n") { + data = data.replace(/\n/g, eol); + } + yield writeFile2(path, data); + }); + return function writeFilePreservingEol2(_x30, _x31) { + return _ref31.apply(this, arguments); + }; + })(); + let hardlinksWork = exports2.hardlinksWork = (() => { + var _ref32 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (dir) { + const filename = "test-file" + Math.random(); + const file = (_path || _load_path()).default.join(dir, filename); + const fileLink = (_path || _load_path()).default.join(dir, filename + "-link"); + try { + yield writeFile2(file, "test"); + yield link(file, fileLink); + } catch (err) { + return false; + } finally { + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(file); + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(fileLink); + } + return true; + }); + return function hardlinksWork2(_x32) { + return _ref32.apply(this, arguments); + }; + })(); + let makeTempDir = exports2.makeTempDir = (() => { + var _ref33 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (prefix) { + const dir = (_path || _load_path()).default.join((_os || _load_os()).default.tmpdir(), `yarn-${prefix || ""}-${Date.now()}-${Math.random()}`); + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dir); + yield mkdirp(dir); + return dir; + }); + return function makeTempDir2(_x33) { + return _ref33.apply(this, arguments); + }; + })(); + let readFirstAvailableStream = exports2.readFirstAvailableStream = (() => { + var _ref34 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (paths) { + for (var _iterator15 = paths, _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator](); ; ) { + var _ref35; + if (_isArray15) { + if (_i15 >= _iterator15.length) + break; + _ref35 = _iterator15[_i15++]; + } else { + _i15 = _iterator15.next(); + if (_i15.done) + break; + _ref35 = _i15.value; + } + const path = _ref35; + try { + const fd = yield open(path, "r"); + return (_fs || _load_fs()).default.createReadStream(path, { fd }); + } catch (err) { + } + } + return null; + }); + return function readFirstAvailableStream2(_x34) { + return _ref34.apply(this, arguments); + }; + })(); + let getFirstSuitableFolder = exports2.getFirstSuitableFolder = (() => { + var _ref36 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (paths, mode = constants.W_OK | constants.X_OK) { + const result = { + skipped: [], + folder: null + }; + for (var _iterator16 = paths, _isArray16 = Array.isArray(_iterator16), _i16 = 0, _iterator16 = _isArray16 ? _iterator16 : _iterator16[Symbol.iterator](); ; ) { + var _ref37; + if (_isArray16) { + if (_i16 >= _iterator16.length) + break; + _ref37 = _iterator16[_i16++]; + } else { + _i16 = _iterator16.next(); + if (_i16.done) + break; + _ref37 = _i16.value; + } + const folder = _ref37; + try { + yield mkdirp(folder); + yield access(folder, mode); + result.folder = folder; + return result; + } catch (error) { + result.skipped.push({ + error, + folder + }); + } + } + return result; + }); + return function getFirstSuitableFolder2(_x35) { + return _ref36.apply(this, arguments); + }; + })(); + exports2.copy = copy; + exports2.readFile = readFile2; + exports2.readFileRaw = readFileRaw; + exports2.normalizeOS = normalizeOS; + var _fs; + function _load_fs() { + return _fs = _interopRequireDefault(__webpack_require__(3)); + } + var _glob; + function _load_glob() { + return _glob = _interopRequireDefault(__webpack_require__(75)); + } + var _os; + function _load_os() { + return _os = _interopRequireDefault(__webpack_require__(36)); + } + var _path; + function _load_path() { + return _path = _interopRequireDefault(__webpack_require__(0)); + } + var _blockingQueue; + function _load_blockingQueue() { + return _blockingQueue = _interopRequireDefault(__webpack_require__(84)); + } + var _promise; + function _load_promise() { + return _promise = _interopRequireWildcard(__webpack_require__(40)); + } + var _promise2; + function _load_promise2() { + return _promise2 = __webpack_require__(40); + } + var _map; + function _load_map() { + return _map = _interopRequireDefault(__webpack_require__(20)); + } + var _fsNormalized; + function _load_fsNormalized() { + return _fsNormalized = __webpack_require__(164); + } + function _interopRequireWildcard(obj) { + if (obj && obj.__esModule) { + return obj; + } else { + var newObj = {}; + if (obj != null) { + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) + newObj[key] = obj[key]; + } + } + newObj.default = obj; + return newObj; + } + } + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + const constants = exports2.constants = typeof (_fs || _load_fs()).default.constants !== "undefined" ? (_fs || _load_fs()).default.constants : { + R_OK: (_fs || _load_fs()).default.R_OK, + W_OK: (_fs || _load_fs()).default.W_OK, + X_OK: (_fs || _load_fs()).default.X_OK + }; + const lockQueue = exports2.lockQueue = new (_blockingQueue || _load_blockingQueue()).default("fs lock"); + const readFileBuffer = exports2.readFileBuffer = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.readFile); + const open = exports2.open = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.open); + const writeFile2 = exports2.writeFile = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.writeFile); + const readlink = exports2.readlink = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.readlink); + const realpath = exports2.realpath = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.realpath); + const readdir = exports2.readdir = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.readdir); + const rename = exports2.rename = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.rename); + const access = exports2.access = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.access); + const stat = exports2.stat = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.stat); + const mkdirp = exports2.mkdirp = (0, (_promise2 || _load_promise2()).promisify)(__webpack_require__(116)); + const exists = exports2.exists = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.exists, true); + const lstat = exports2.lstat = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.lstat); + const chmod = exports2.chmod = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.chmod); + const link = exports2.link = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.link); + const glob = exports2.glob = (0, (_promise2 || _load_promise2()).promisify)((_glob || _load_glob()).default); + exports2.unlink = (_fsNormalized || _load_fsNormalized()).unlink; + const CONCURRENT_QUEUE_ITEMS = (_fs || _load_fs()).default.copyFile ? 128 : 4; + const fsSymlink = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.symlink); + const invariant = __webpack_require__(7); + const stripBOM = __webpack_require__(122); + const noop2 = () => { + }; + function copy(src, dest, reporter) { + return copyBulk([{ src, dest }], reporter); + } + function _readFile(loc, encoding) { + return new Promise((resolve, reject) => { + (_fs || _load_fs()).default.readFile(loc, encoding, function(err, content) { + if (err) { + reject(err); + } else { + resolve(content); + } + }); + }); + } + function readFile2(loc) { + return _readFile(loc, "utf8").then(normalizeOS); + } + function readFileRaw(loc) { + return _readFile(loc, "binary"); + } + function normalizeOS(body) { + return body.replace(/\r\n/g, "\n"); + } + const cr = "\r".charCodeAt(0); + const lf = "\n".charCodeAt(0); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.getPathKey = getPathKey; + const os3 = __webpack_require__(36); + const path = __webpack_require__(0); + const userHome = __webpack_require__(45).default; + var _require = __webpack_require__(171); + const getCacheDir = _require.getCacheDir, getConfigDir = _require.getConfigDir, getDataDir = _require.getDataDir; + const isWebpackBundle = __webpack_require__(227); + const DEPENDENCY_TYPES = exports2.DEPENDENCY_TYPES = ["devDependencies", "dependencies", "optionalDependencies", "peerDependencies"]; + const RESOLUTIONS = exports2.RESOLUTIONS = "resolutions"; + const MANIFEST_FIELDS = exports2.MANIFEST_FIELDS = [RESOLUTIONS, ...DEPENDENCY_TYPES]; + const SUPPORTED_NODE_VERSIONS = exports2.SUPPORTED_NODE_VERSIONS = "^4.8.0 || ^5.7.0 || ^6.2.2 || >=8.0.0"; + const YARN_REGISTRY = exports2.YARN_REGISTRY = "https://registry.yarnpkg.com"; + const YARN_DOCS = exports2.YARN_DOCS = "https://yarnpkg.com/en/docs/cli/"; + const YARN_INSTALLER_SH = exports2.YARN_INSTALLER_SH = "https://yarnpkg.com/install.sh"; + const YARN_INSTALLER_MSI = exports2.YARN_INSTALLER_MSI = "https://yarnpkg.com/latest.msi"; + const SELF_UPDATE_VERSION_URL = exports2.SELF_UPDATE_VERSION_URL = "https://yarnpkg.com/latest-version"; + const CACHE_VERSION = exports2.CACHE_VERSION = 2; + const LOCKFILE_VERSION = exports2.LOCKFILE_VERSION = 1; + const NETWORK_CONCURRENCY = exports2.NETWORK_CONCURRENCY = 8; + const NETWORK_TIMEOUT = exports2.NETWORK_TIMEOUT = 30 * 1e3; + const CHILD_CONCURRENCY = exports2.CHILD_CONCURRENCY = 5; + const REQUIRED_PACKAGE_KEYS = exports2.REQUIRED_PACKAGE_KEYS = ["name", "version", "_uid"]; + function getPreferredCacheDirectories() { + const preferredCacheDirectories = [getCacheDir()]; + if (process.getuid) { + preferredCacheDirectories.push(path.join(os3.tmpdir(), `.yarn-cache-${process.getuid()}`)); + } + preferredCacheDirectories.push(path.join(os3.tmpdir(), `.yarn-cache`)); + return preferredCacheDirectories; + } + const PREFERRED_MODULE_CACHE_DIRECTORIES = exports2.PREFERRED_MODULE_CACHE_DIRECTORIES = getPreferredCacheDirectories(); + const CONFIG_DIRECTORY = exports2.CONFIG_DIRECTORY = getConfigDir(); + const DATA_DIRECTORY = exports2.DATA_DIRECTORY = getDataDir(); + const LINK_REGISTRY_DIRECTORY = exports2.LINK_REGISTRY_DIRECTORY = path.join(DATA_DIRECTORY, "link"); + const GLOBAL_MODULE_DIRECTORY = exports2.GLOBAL_MODULE_DIRECTORY = path.join(DATA_DIRECTORY, "global"); + const NODE_BIN_PATH = exports2.NODE_BIN_PATH = process.execPath; + const YARN_BIN_PATH = exports2.YARN_BIN_PATH = getYarnBinPath(); + function getYarnBinPath() { + if (isWebpackBundle) { + return __filename; + } else { + return path.join(__dirname, "..", "bin", "yarn.js"); + } + } + const NODE_MODULES_FOLDER = exports2.NODE_MODULES_FOLDER = "node_modules"; + const NODE_PACKAGE_JSON = exports2.NODE_PACKAGE_JSON = "package.json"; + const POSIX_GLOBAL_PREFIX = exports2.POSIX_GLOBAL_PREFIX = `${process.env.DESTDIR || ""}/usr/local`; + const FALLBACK_GLOBAL_PREFIX = exports2.FALLBACK_GLOBAL_PREFIX = path.join(userHome, ".yarn"); + const META_FOLDER = exports2.META_FOLDER = ".yarn-meta"; + const INTEGRITY_FILENAME = exports2.INTEGRITY_FILENAME = ".yarn-integrity"; + const LOCKFILE_FILENAME = exports2.LOCKFILE_FILENAME = "yarn.lock"; + const METADATA_FILENAME = exports2.METADATA_FILENAME = ".yarn-metadata.json"; + const TARBALL_FILENAME = exports2.TARBALL_FILENAME = ".yarn-tarball.tgz"; + const CLEAN_FILENAME = exports2.CLEAN_FILENAME = ".yarnclean"; + const NPM_LOCK_FILENAME = exports2.NPM_LOCK_FILENAME = "package-lock.json"; + const NPM_SHRINKWRAP_FILENAME = exports2.NPM_SHRINKWRAP_FILENAME = "npm-shrinkwrap.json"; + const DEFAULT_INDENT = exports2.DEFAULT_INDENT = " "; + const SINGLE_INSTANCE_PORT = exports2.SINGLE_INSTANCE_PORT = 31997; + const SINGLE_INSTANCE_FILENAME = exports2.SINGLE_INSTANCE_FILENAME = ".yarn-single-instance"; + const ENV_PATH_KEY = exports2.ENV_PATH_KEY = getPathKey(process.platform, process.env); + function getPathKey(platform, env3) { + let pathKey = "PATH"; + if (platform === "win32") { + pathKey = "Path"; + for (const key in env3) { + if (key.toLowerCase() === "path") { + pathKey = key; + } + } + } + return pathKey; + } + const VERSION_COLOR_SCHEME = exports2.VERSION_COLOR_SCHEME = { + major: "red", + premajor: "red", + minor: "yellow", + preminor: "yellow", + patch: "green", + prepatch: "green", + prerelease: "red", + unchanged: "white", + unknown: "red" + }; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var NODE_ENV = process.env.NODE_ENV; + var invariant = function(condition, format, a, b, c, d, e, f) { + if (NODE_ENV !== "production") { + if (format === void 0) { + throw new Error("invariant requires an error message argument"); + } + } + if (!condition) { + var error; + if (format === void 0) { + error = new Error( + "Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings." + ); + } else { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + error = new Error( + format.replace(/%s/g, function() { + return args[argIndex++]; + }) + ); + error.name = "Invariant Violation"; + } + error.framesToPop = 1; + throw error; + } + }; + module2.exports = invariant; + }, + , + function(module2, exports2) { + module2.exports = __require("crypto"); + }, + , + function(module2, exports2) { + var global = module2.exports = typeof window != "undefined" && window.Math == Math ? window : typeof self != "undefined" && self.Math == Math ? self : Function("return this")(); + if (typeof __g == "number") + __g = global; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.sortAlpha = sortAlpha; + exports2.entries = entries; + exports2.removePrefix = removePrefix; + exports2.removeSuffix = removeSuffix; + exports2.addSuffix = addSuffix; + exports2.hyphenate = hyphenate; + exports2.camelCase = camelCase; + exports2.compareSortedArrays = compareSortedArrays; + exports2.sleep = sleep; + const _camelCase = __webpack_require__(176); + function sortAlpha(a, b) { + const shortLen = Math.min(a.length, b.length); + for (let i = 0; i < shortLen; i++) { + const aChar = a.charCodeAt(i); + const bChar = b.charCodeAt(i); + if (aChar !== bChar) { + return aChar - bChar; + } + } + return a.length - b.length; + } + function entries(obj) { + const entries2 = []; + if (obj) { + for (const key in obj) { + entries2.push([key, obj[key]]); + } + } + return entries2; + } + function removePrefix(pattern, prefix) { + if (pattern.startsWith(prefix)) { + pattern = pattern.slice(prefix.length); + } + return pattern; + } + function removeSuffix(pattern, suffix) { + if (pattern.endsWith(suffix)) { + return pattern.slice(0, -suffix.length); + } + return pattern; + } + function addSuffix(pattern, suffix) { + if (!pattern.endsWith(suffix)) { + return pattern + suffix; + } + return pattern; + } + function hyphenate(str) { + return str.replace(/[A-Z]/g, (match) => { + return "-" + match.charAt(0).toLowerCase(); + }); + } + function camelCase(str) { + if (/[A-Z]/.test(str)) { + return null; + } else { + return _camelCase(str); + } + } + function compareSortedArrays(array1, array2) { + if (array1.length !== array2.length) { + return false; + } + for (let i = 0, len = array1.length; i < len; i++) { + if (array1[i] !== array2[i]) { + return false; + } + } + return true; + } + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + }, + function(module2, exports2, __webpack_require__) { + var store = __webpack_require__(107)("wks"); + var uid = __webpack_require__(111); + var Symbol2 = __webpack_require__(11).Symbol; + var USE_SYMBOL = typeof Symbol2 == "function"; + var $exports = module2.exports = function(name) { + return store[name] || (store[name] = USE_SYMBOL && Symbol2[name] || (USE_SYMBOL ? Symbol2 : uid)("Symbol." + name)); + }; + $exports.store = store; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.stringify = exports2.parse = void 0; + var _asyncToGenerator2; + function _load_asyncToGenerator() { + return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(1)); + } + var _parse; + function _load_parse() { + return _parse = __webpack_require__(81); + } + Object.defineProperty(exports2, "parse", { + enumerable: true, + get: function get() { + return _interopRequireDefault(_parse || _load_parse()).default; + } + }); + var _stringify; + function _load_stringify() { + return _stringify = __webpack_require__(150); + } + Object.defineProperty(exports2, "stringify", { + enumerable: true, + get: function get() { + return _interopRequireDefault(_stringify || _load_stringify()).default; + } + }); + exports2.implodeEntry = implodeEntry; + exports2.explodeEntry = explodeEntry; + var _misc; + function _load_misc() { + return _misc = __webpack_require__(12); + } + var _normalizePattern; + function _load_normalizePattern() { + return _normalizePattern = __webpack_require__(29); + } + var _parse2; + function _load_parse2() { + return _parse2 = _interopRequireDefault(__webpack_require__(81)); + } + var _constants; + function _load_constants() { + return _constants = __webpack_require__(6); + } + var _fs; + function _load_fs() { + return _fs = _interopRequireWildcard(__webpack_require__(5)); + } + function _interopRequireWildcard(obj) { + if (obj && obj.__esModule) { + return obj; + } else { + var newObj = {}; + if (obj != null) { + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) + newObj[key] = obj[key]; + } + } + newObj.default = obj; + return newObj; + } + } + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + const invariant = __webpack_require__(7); + const path = __webpack_require__(0); + const ssri = __webpack_require__(55); + function getName(pattern) { + return (0, (_normalizePattern || _load_normalizePattern()).normalizePattern)(pattern).name; + } + function blankObjectUndefined(obj) { + return obj && Object.keys(obj).length ? obj : void 0; + } + function keyForRemote(remote) { + return remote.resolved || (remote.reference && remote.hash ? `${remote.reference}#${remote.hash}` : null); + } + function serializeIntegrity(integrity) { + return integrity.toString().split(" ").sort().join(" "); + } + function implodeEntry(pattern, obj) { + const inferredName = getName(pattern); + const integrity = obj.integrity ? serializeIntegrity(obj.integrity) : ""; + const imploded = { + name: inferredName === obj.name ? void 0 : obj.name, + version: obj.version, + uid: obj.uid === obj.version ? void 0 : obj.uid, + resolved: obj.resolved, + registry: obj.registry === "npm" ? void 0 : obj.registry, + dependencies: blankObjectUndefined(obj.dependencies), + optionalDependencies: blankObjectUndefined(obj.optionalDependencies), + permissions: blankObjectUndefined(obj.permissions), + prebuiltVariants: blankObjectUndefined(obj.prebuiltVariants) + }; + if (integrity) { + imploded.integrity = integrity; + } + return imploded; + } + function explodeEntry(pattern, obj) { + obj.optionalDependencies = obj.optionalDependencies || {}; + obj.dependencies = obj.dependencies || {}; + obj.uid = obj.uid || obj.version; + obj.permissions = obj.permissions || {}; + obj.registry = obj.registry || "npm"; + obj.name = obj.name || getName(pattern); + const integrity = obj.integrity; + if (integrity && integrity.isIntegrity) { + obj.integrity = ssri.parse(integrity); + } + return obj; + } + class Lockfile { + constructor({ cache, source, parseResultType } = {}) { + this.source = source || ""; + this.cache = cache; + this.parseResultType = parseResultType; + } + hasEntriesExistWithoutIntegrity() { + if (!this.cache) { + return false; + } + for (const key in this.cache) { + if (!/^.*@(file:|http)/.test(key) && this.cache[key] && !this.cache[key].integrity) { + return true; + } + } + return false; + } + static fromDirectory(dir, reporter) { + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const lockfileLoc = path.join(dir, (_constants || _load_constants()).LOCKFILE_FILENAME); + let lockfile2; + let rawLockfile = ""; + let parseResult; + if (yield (_fs || _load_fs()).exists(lockfileLoc)) { + rawLockfile = yield (_fs || _load_fs()).readFile(lockfileLoc); + parseResult = (0, (_parse2 || _load_parse2()).default)(rawLockfile, lockfileLoc); + if (reporter) { + if (parseResult.type === "merge") { + reporter.info(reporter.lang("lockfileMerged")); + } else if (parseResult.type === "conflict") { + reporter.warn(reporter.lang("lockfileConflict")); + } + } + lockfile2 = parseResult.object; + } else if (reporter) { + reporter.info(reporter.lang("noLockfileFound")); + } + return new Lockfile({ cache: lockfile2, source: rawLockfile, parseResultType: parseResult && parseResult.type }); + })(); + } + getLocked(pattern) { + const cache = this.cache; + if (!cache) { + return void 0; + } + const shrunk = pattern in cache && cache[pattern]; + if (typeof shrunk === "string") { + return this.getLocked(shrunk); + } else if (shrunk) { + explodeEntry(pattern, shrunk); + return shrunk; + } + return void 0; + } + removePattern(pattern) { + const cache = this.cache; + if (!cache) { + return; + } + delete cache[pattern]; + } + getLockfile(patterns) { + const lockfile2 = {}; + const seen = /* @__PURE__ */ new Map(); + const sortedPatternsKeys = Object.keys(patterns).sort((_misc || _load_misc()).sortAlpha); + for (var _iterator = sortedPatternsKeys, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); ; ) { + var _ref; + if (_isArray) { + if (_i >= _iterator.length) + break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) + break; + _ref = _i.value; + } + const pattern = _ref; + const pkg = patterns[pattern]; + const remote = pkg._remote, ref = pkg._reference; + invariant(ref, "Package is missing a reference"); + invariant(remote, "Package is missing a remote"); + const remoteKey = keyForRemote(remote); + const seenPattern = remoteKey && seen.get(remoteKey); + if (seenPattern) { + lockfile2[pattern] = seenPattern; + if (!seenPattern.name && getName(pattern) !== pkg.name) { + seenPattern.name = pkg.name; + } + continue; + } + const obj = implodeEntry(pattern, { + name: pkg.name, + version: pkg.version, + uid: pkg._uid, + resolved: remote.resolved, + integrity: remote.integrity, + registry: remote.registry, + dependencies: pkg.dependencies, + peerDependencies: pkg.peerDependencies, + optionalDependencies: pkg.optionalDependencies, + permissions: ref.permissions, + prebuiltVariants: pkg.prebuiltVariants + }); + lockfile2[pattern] = obj; + if (remoteKey) { + seen.set(remoteKey, obj); + } + } + return lockfile2; + } + } + exports2.default = Lockfile; + }, + , + , + function(module2, exports2) { + module2.exports = __require("stream"); + }, + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.default = nullify; + function nullify(obj = {}) { + if (Array.isArray(obj)) { + for (var _iterator = obj, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); ; ) { + var _ref; + if (_isArray) { + if (_i >= _iterator.length) + break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) + break; + _ref = _i.value; + } + const item = _ref; + nullify(item); + } + } else if (obj !== null && typeof obj === "object" || typeof obj === "function") { + Object.setPrototypeOf(obj, null); + if (typeof obj === "object") { + for (const key in obj) { + nullify(obj[key]); + } + } + } + return obj; + } + }, + , + function(module2, exports2) { + module2.exports = __require("assert"); + }, + function(module2, exports2) { + var core = module2.exports = { version: "2.5.7" }; + if (typeof __e == "number") + __e = core; + }, + , + , + , + function(module2, exports2, __webpack_require__) { + var isObject = __webpack_require__(34); + module2.exports = function(it) { + if (!isObject(it)) + throw TypeError(it + " is not an object!"); + return it; + }; + }, + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.normalizePattern = normalizePattern; + function normalizePattern(pattern) { + let hasVersion = false; + let range = "latest"; + let name = pattern; + let isScoped = false; + if (name[0] === "@") { + isScoped = true; + name = name.slice(1); + } + const parts = name.split("@"); + if (parts.length > 1) { + name = parts.shift(); + range = parts.join("@"); + if (range) { + hasVersion = true; + } else { + range = "*"; + } + } + if (isScoped) { + name = `@${name}`; + } + return { name, range, hasVersion }; + } + }, + , + function(module2, exports2, __webpack_require__) { + var dP = __webpack_require__(50); + var createDesc = __webpack_require__(106); + module2.exports = __webpack_require__(33) ? function(object, key, value) { + return dP.f(object, key, createDesc(1, value)); + } : function(object, key, value) { + object[key] = value; + return object; + }; + }, + function(module2, exports2, __webpack_require__) { + var buffer = __webpack_require__(63); + var Buffer2 = buffer.Buffer; + function copyProps(src, dst) { + for (var key in src) { + dst[key] = src[key]; + } + } + if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) { + module2.exports = buffer; + } else { + copyProps(buffer, exports2); + exports2.Buffer = SafeBuffer; + } + function SafeBuffer(arg, encodingOrOffset, length) { + return Buffer2(arg, encodingOrOffset, length); + } + copyProps(Buffer2, SafeBuffer); + SafeBuffer.from = function(arg, encodingOrOffset, length) { + if (typeof arg === "number") { + throw new TypeError("Argument must not be a number"); + } + return Buffer2(arg, encodingOrOffset, length); + }; + SafeBuffer.alloc = function(size, fill, encoding) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + var buf = Buffer2(size); + if (fill !== void 0) { + if (typeof encoding === "string") { + buf.fill(fill, encoding); + } else { + buf.fill(fill); + } + } else { + buf.fill(0); + } + return buf; + }; + SafeBuffer.allocUnsafe = function(size) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + return Buffer2(size); + }; + SafeBuffer.allocUnsafeSlow = function(size) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + return buffer.SlowBuffer(size); + }; + }, + function(module2, exports2, __webpack_require__) { + module2.exports = !__webpack_require__(85)(function() { + return Object.defineProperty({}, "a", { get: function() { + return 7; + } }).a != 7; + }); + }, + function(module2, exports2) { + module2.exports = function(it) { + return typeof it === "object" ? it !== null : typeof it === "function"; + }; + }, + function(module2, exports2) { + module2.exports = {}; + }, + function(module2, exports2) { + module2.exports = __require("os"); + }, + , + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.wait = wait; + exports2.promisify = promisify; + exports2.queue = queue; + function wait(delay) { + return new Promise((resolve) => { + setTimeout(resolve, delay); + }); + } + function promisify(fn, firstData) { + return function(...args) { + return new Promise(function(resolve, reject) { + args.push(function(err, ...result) { + let res = result; + if (result.length <= 1) { + res = result[0]; + } + if (firstData) { + res = err; + err = null; + } + if (err) { + reject(err); + } else { + resolve(res); + } + }); + fn.apply(null, args); + }); + }; + } + function queue(arr, promiseProducer, concurrency = Infinity) { + concurrency = Math.min(concurrency, arr.length); + arr = arr.slice(); + const results = []; + let total = arr.length; + if (!total) { + return Promise.resolve(results); + } + return new Promise((resolve, reject) => { + for (let i = 0; i < concurrency; i++) { + next(); + } + function next() { + const item = arr.shift(); + const promise = promiseProducer(item); + promise.then(function(result) { + results.push(result); + total--; + if (total === 0) { + resolve(results); + } else { + if (arr.length) { + next(); + } + } + }, reject); + } + }); + } + }, + function(module2, exports2, __webpack_require__) { + var global = __webpack_require__(11); + var core = __webpack_require__(23); + var ctx = __webpack_require__(48); + var hide = __webpack_require__(31); + var has = __webpack_require__(49); + var PROTOTYPE = "prototype"; + var $export = function(type, name, source) { + var IS_FORCED = type & $export.F; + var IS_GLOBAL = type & $export.G; + var IS_STATIC = type & $export.S; + var IS_PROTO = type & $export.P; + var IS_BIND = type & $export.B; + var IS_WRAP = type & $export.W; + var exports3 = IS_GLOBAL ? core : core[name] || (core[name] = {}); + var expProto = exports3[PROTOTYPE]; + var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]; + var key, own, out; + if (IS_GLOBAL) + source = name; + for (key in source) { + own = !IS_FORCED && target && target[key] !== void 0; + if (own && has(exports3, key)) + continue; + out = own ? target[key] : source[key]; + exports3[key] = IS_GLOBAL && typeof target[key] != "function" ? source[key] : IS_BIND && own ? ctx(out, global) : IS_WRAP && target[key] == out ? function(C) { + var F = function(a, b, c) { + if (this instanceof C) { + switch (arguments.length) { + case 0: + return new C(); + case 1: + return new C(a); + case 2: + return new C(a, b); + } + return new C(a, b, c); + } + return C.apply(this, arguments); + }; + F[PROTOTYPE] = C[PROTOTYPE]; + return F; + }(out) : IS_PROTO && typeof out == "function" ? ctx(Function.call, out) : out; + if (IS_PROTO) { + (exports3.virtual || (exports3.virtual = {}))[key] = out; + if (type & $export.R && expProto && !expProto[key]) + hide(expProto, key, out); + } + } + }; + $export.F = 1; + $export.G = 2; + $export.S = 4; + $export.P = 8; + $export.B = 16; + $export.W = 32; + $export.U = 64; + $export.R = 128; + module2.exports = $export; + }, + function(module2, exports2, __webpack_require__) { + try { + var util = __webpack_require__(2); + if (typeof util.inherits !== "function") + throw ""; + module2.exports = util.inherits; + } catch (e) { + module2.exports = __webpack_require__(224); + } + }, + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.home = void 0; + var _rootUser; + function _load_rootUser() { + return _rootUser = _interopRequireDefault(__webpack_require__(169)); + } + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + const path = __webpack_require__(0); + const home = exports2.home = __webpack_require__(36).homedir(); + const userHomeDir = (_rootUser || _load_rootUser()).default ? path.resolve("/usr/local/share") : home; + exports2.default = userHomeDir; + }, + function(module2, exports2) { + module2.exports = function(it) { + if (typeof it != "function") + throw TypeError(it + " is not a function!"); + return it; + }; + }, + function(module2, exports2) { + var toString = {}.toString; + module2.exports = function(it) { + return toString.call(it).slice(8, -1); + }; + }, + function(module2, exports2, __webpack_require__) { + var aFunction = __webpack_require__(46); + module2.exports = function(fn, that, length) { + aFunction(fn); + if (that === void 0) + return fn; + switch (length) { + case 1: + return function(a) { + return fn.call(that, a); + }; + case 2: + return function(a, b) { + return fn.call(that, a, b); + }; + case 3: + return function(a, b, c) { + return fn.call(that, a, b, c); + }; + } + return function() { + return fn.apply(that, arguments); + }; + }; + }, + function(module2, exports2) { + var hasOwnProperty = {}.hasOwnProperty; + module2.exports = function(it, key) { + return hasOwnProperty.call(it, key); + }; + }, + function(module2, exports2, __webpack_require__) { + var anObject = __webpack_require__(27); + var IE8_DOM_DEFINE = __webpack_require__(184); + var toPrimitive = __webpack_require__(201); + var dP = Object.defineProperty; + exports2.f = __webpack_require__(33) ? Object.defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if (IE8_DOM_DEFINE) + try { + return dP(O, P, Attributes); + } catch (e) { + } + if ("get" in Attributes || "set" in Attributes) + throw TypeError("Accessors not supported!"); + if ("value" in Attributes) + O[P] = Attributes.value; + return O; + }; + }, + , + , + , + function(module2, exports2) { + module2.exports = __require("events"); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + const Buffer2 = __webpack_require__(32).Buffer; + const crypto = __webpack_require__(9); + const Transform = __webpack_require__(17).Transform; + const SPEC_ALGORITHMS = ["sha256", "sha384", "sha512"]; + const BASE64_REGEX = /^[a-z0-9+/]+(?:=?=?)$/i; + const SRI_REGEX = /^([^-]+)-([^?]+)([?\S*]*)$/; + const STRICT_SRI_REGEX = /^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/; + const VCHAR_REGEX = /^[\x21-\x7E]+$/; + class Hash { + get isHash() { + return true; + } + constructor(hash, opts) { + const strict = !!(opts && opts.strict); + this.source = hash.trim(); + const match = this.source.match( + strict ? STRICT_SRI_REGEX : SRI_REGEX + ); + if (!match) { + return; + } + if (strict && !SPEC_ALGORITHMS.some((a) => a === match[1])) { + return; + } + this.algorithm = match[1]; + this.digest = match[2]; + const rawOpts = match[3]; + this.options = rawOpts ? rawOpts.slice(1).split("?") : []; + } + hexDigest() { + return this.digest && Buffer2.from(this.digest, "base64").toString("hex"); + } + toJSON() { + return this.toString(); + } + toString(opts) { + if (opts && opts.strict) { + if (!(SPEC_ALGORITHMS.some((x) => x === this.algorithm) && this.digest.match(BASE64_REGEX) && (this.options || []).every((opt) => opt.match(VCHAR_REGEX)))) { + return ""; + } + } + const options = this.options && this.options.length ? `?${this.options.join("?")}` : ""; + return `${this.algorithm}-${this.digest}${options}`; + } + } + class Integrity { + get isIntegrity() { + return true; + } + toJSON() { + return this.toString(); + } + toString(opts) { + opts = opts || {}; + let sep2 = opts.sep || " "; + if (opts.strict) { + sep2 = sep2.replace(/\S+/g, " "); + } + return Object.keys(this).map((k) => { + return this[k].map((hash) => { + return Hash.prototype.toString.call(hash, opts); + }).filter((x) => x.length).join(sep2); + }).filter((x) => x.length).join(sep2); + } + concat(integrity, opts) { + const other = typeof integrity === "string" ? integrity : stringify(integrity, opts); + return parse3(`${this.toString(opts)} ${other}`, opts); + } + hexDigest() { + return parse3(this, { single: true }).hexDigest(); + } + match(integrity, opts) { + const other = parse3(integrity, opts); + const algo = other.pickAlgorithm(opts); + return this[algo] && other[algo] && this[algo].find( + (hash) => other[algo].find( + (otherhash) => hash.digest === otherhash.digest + ) + ) || false; + } + pickAlgorithm(opts) { + const pickAlgorithm = opts && opts.pickAlgorithm || getPrioritizedHash; + const keys = Object.keys(this); + if (!keys.length) { + throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`); + } + return keys.reduce((acc, algo) => { + return pickAlgorithm(acc, algo) || acc; + }); + } + } + module2.exports.parse = parse3; + function parse3(sri, opts) { + opts = opts || {}; + if (typeof sri === "string") { + return _parse(sri, opts); + } else if (sri.algorithm && sri.digest) { + const fullSri = new Integrity(); + fullSri[sri.algorithm] = [sri]; + return _parse(stringify(fullSri, opts), opts); + } else { + return _parse(stringify(sri, opts), opts); + } + } + function _parse(integrity, opts) { + if (opts.single) { + return new Hash(integrity, opts); + } + return integrity.trim().split(/\s+/).reduce((acc, string) => { + const hash = new Hash(string, opts); + if (hash.algorithm && hash.digest) { + const algo = hash.algorithm; + if (!acc[algo]) { + acc[algo] = []; + } + acc[algo].push(hash); + } + return acc; + }, new Integrity()); + } + module2.exports.stringify = stringify; + function stringify(obj, opts) { + if (obj.algorithm && obj.digest) { + return Hash.prototype.toString.call(obj, opts); + } else if (typeof obj === "string") { + return stringify(parse3(obj, opts), opts); + } else { + return Integrity.prototype.toString.call(obj, opts); + } + } + module2.exports.fromHex = fromHex; + function fromHex(hexDigest, algorithm, opts) { + const optString = opts && opts.options && opts.options.length ? `?${opts.options.join("?")}` : ""; + return parse3( + `${algorithm}-${Buffer2.from(hexDigest, "hex").toString("base64")}${optString}`, + opts + ); + } + module2.exports.fromData = fromData; + function fromData(data, opts) { + opts = opts || {}; + const algorithms = opts.algorithms || ["sha512"]; + const optString = opts.options && opts.options.length ? `?${opts.options.join("?")}` : ""; + return algorithms.reduce((acc, algo) => { + const digest = crypto.createHash(algo).update(data).digest("base64"); + const hash = new Hash( + `${algo}-${digest}${optString}`, + opts + ); + if (hash.algorithm && hash.digest) { + const algo2 = hash.algorithm; + if (!acc[algo2]) { + acc[algo2] = []; + } + acc[algo2].push(hash); + } + return acc; + }, new Integrity()); + } + module2.exports.fromStream = fromStream; + function fromStream(stream, opts) { + opts = opts || {}; + const P = opts.Promise || Promise; + const istream = integrityStream(opts); + return new P((resolve, reject) => { + stream.pipe(istream); + stream.on("error", reject); + istream.on("error", reject); + let sri; + istream.on("integrity", (s) => { + sri = s; + }); + istream.on("end", () => resolve(sri)); + istream.on("data", () => { + }); + }); + } + module2.exports.checkData = checkData; + function checkData(data, sri, opts) { + opts = opts || {}; + sri = parse3(sri, opts); + if (!Object.keys(sri).length) { + if (opts.error) { + throw Object.assign( + new Error("No valid integrity hashes to check against"), + { + code: "EINTEGRITY" + } + ); + } else { + return false; + } + } + const algorithm = sri.pickAlgorithm(opts); + const digest = crypto.createHash(algorithm).update(data).digest("base64"); + const newSri = parse3({ algorithm, digest }); + const match = newSri.match(sri, opts); + if (match || !opts.error) { + return match; + } else if (typeof opts.size === "number" && data.length !== opts.size) { + const err = new Error(`data size mismatch when checking ${sri}. + Wanted: ${opts.size} + Found: ${data.length}`); + err.code = "EBADSIZE"; + err.found = data.length; + err.expected = opts.size; + err.sri = sri; + throw err; + } else { + const err = new Error(`Integrity checksum failed when using ${algorithm}: Wanted ${sri}, but got ${newSri}. (${data.length} bytes)`); + err.code = "EINTEGRITY"; + err.found = newSri; + err.expected = sri; + err.algorithm = algorithm; + err.sri = sri; + throw err; + } + } + module2.exports.checkStream = checkStream; + function checkStream(stream, sri, opts) { + opts = opts || {}; + const P = opts.Promise || Promise; + const checker = integrityStream(Object.assign({}, opts, { + integrity: sri + })); + return new P((resolve, reject) => { + stream.pipe(checker); + stream.on("error", reject); + checker.on("error", reject); + let sri2; + checker.on("verified", (s) => { + sri2 = s; + }); + checker.on("end", () => resolve(sri2)); + checker.on("data", () => { + }); + }); + } + module2.exports.integrityStream = integrityStream; + function integrityStream(opts) { + opts = opts || {}; + const sri = opts.integrity && parse3(opts.integrity, opts); + const goodSri = sri && Object.keys(sri).length; + const algorithm = goodSri && sri.pickAlgorithm(opts); + const digests = goodSri && sri[algorithm]; + const algorithms = Array.from( + new Set( + (opts.algorithms || ["sha512"]).concat(algorithm ? [algorithm] : []) + ) + ); + const hashes = algorithms.map(crypto.createHash); + let streamSize = 0; + const stream = new Transform({ + transform(chunk, enc, cb) { + streamSize += chunk.length; + hashes.forEach((h) => h.update(chunk, enc)); + cb(null, chunk, enc); + } + }).on("end", () => { + const optString = opts.options && opts.options.length ? `?${opts.options.join("?")}` : ""; + const newSri = parse3(hashes.map((h, i) => { + return `${algorithms[i]}-${h.digest("base64")}${optString}`; + }).join(" "), opts); + const match = goodSri && newSri.match(sri, opts); + if (typeof opts.size === "number" && streamSize !== opts.size) { + const err = new Error(`stream size mismatch when checking ${sri}. + Wanted: ${opts.size} + Found: ${streamSize}`); + err.code = "EBADSIZE"; + err.found = streamSize; + err.expected = opts.size; + err.sri = sri; + stream.emit("error", err); + } else if (opts.integrity && !match) { + const err = new Error(`${sri} integrity checksum failed when using ${algorithm}: wanted ${digests} but got ${newSri}. (${streamSize} bytes)`); + err.code = "EINTEGRITY"; + err.found = newSri; + err.expected = digests; + err.algorithm = algorithm; + err.sri = sri; + stream.emit("error", err); + } else { + stream.emit("size", streamSize); + stream.emit("integrity", newSri); + match && stream.emit("verified", match); + } + }); + return stream; + } + module2.exports.create = createIntegrity; + function createIntegrity(opts) { + opts = opts || {}; + const algorithms = opts.algorithms || ["sha512"]; + const optString = opts.options && opts.options.length ? `?${opts.options.join("?")}` : ""; + const hashes = algorithms.map(crypto.createHash); + return { + update: function(chunk, enc) { + hashes.forEach((h) => h.update(chunk, enc)); + return this; + }, + digest: function(enc) { + const integrity = algorithms.reduce((acc, algo) => { + const digest = hashes.shift().digest("base64"); + const hash = new Hash( + `${algo}-${digest}${optString}`, + opts + ); + if (hash.algorithm && hash.digest) { + const algo2 = hash.algorithm; + if (!acc[algo2]) { + acc[algo2] = []; + } + acc[algo2].push(hash); + } + return acc; + }, new Integrity()); + return integrity; + } + }; + } + const NODE_HASHES = new Set(crypto.getHashes()); + const DEFAULT_PRIORITY = [ + "md5", + "whirlpool", + "sha1", + "sha224", + "sha256", + "sha384", + "sha512", + "sha3", + "sha3-256", + "sha3-384", + "sha3-512", + "sha3_256", + "sha3_384", + "sha3_512" + ].filter((algo) => NODE_HASHES.has(algo)); + function getPrioritizedHash(algo1, algo2) { + return DEFAULT_PRIORITY.indexOf(algo1.toLowerCase()) >= DEFAULT_PRIORITY.indexOf(algo2.toLowerCase()) ? algo1 : algo2; + } + }, + , + , + , + , + function(module2, exports2, __webpack_require__) { + module2.exports = minimatch; + minimatch.Minimatch = Minimatch; + var path = { sep: "/" }; + try { + path = __webpack_require__(0); + } catch (er) { + } + var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}; + var expand3 = __webpack_require__(175); + var plTypes = { + "!": { open: "(?:(?!(?:", close: "))[^/]*?)" }, + "?": { open: "(?:", close: ")?" }, + "+": { open: "(?:", close: ")+" }, + "*": { open: "(?:", close: ")*" }, + "@": { open: "(?:", close: ")" } + }; + var qmark = "[^/]"; + var star = qmark + "*?"; + var twoStarDot = "(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?"; + var twoStarNoDot = "(?:(?!(?:\\/|^)\\.).)*?"; + var reSpecials = charSet("().*{}+?[]^$\\!"); + function charSet(s) { + return s.split("").reduce(function(set, c) { + set[c] = true; + return set; + }, {}); + } + var slashSplit = /\/+/; + minimatch.filter = filter; + function filter(pattern, options) { + options = options || {}; + return function(p, i, list) { + return minimatch(p, pattern, options); + }; + } + function ext(a, b) { + a = a || {}; + b = b || {}; + var t = {}; + Object.keys(b).forEach(function(k) { + t[k] = b[k]; + }); + Object.keys(a).forEach(function(k) { + t[k] = a[k]; + }); + return t; + } + minimatch.defaults = function(def) { + if (!def || !Object.keys(def).length) + return minimatch; + var orig = minimatch; + var m = function minimatch2(p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)); + }; + m.Minimatch = function Minimatch2(pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)); + }; + return m; + }; + Minimatch.defaults = function(def) { + if (!def || !Object.keys(def).length) + return Minimatch; + return minimatch.defaults(def).Minimatch; + }; + function minimatch(p, pattern, options) { + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required"); + } + if (!options) + options = {}; + if (!options.nocomment && pattern.charAt(0) === "#") { + return false; + } + if (pattern.trim() === "") + return p === ""; + return new Minimatch(pattern, options).match(p); + } + function Minimatch(pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options); + } + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required"); + } + if (!options) + options = {}; + pattern = pattern.trim(); + if (path.sep !== "/") { + pattern = pattern.split(path.sep).join("/"); + } + this.options = options; + this.set = []; + this.pattern = pattern; + this.regexp = null; + this.negate = false; + this.comment = false; + this.empty = false; + this.make(); + } + Minimatch.prototype.debug = function() { + }; + Minimatch.prototype.make = make; + function make() { + if (this._made) + return; + var pattern = this.pattern; + var options = this.options; + if (!options.nocomment && pattern.charAt(0) === "#") { + this.comment = true; + return; + } + if (!pattern) { + this.empty = true; + return; + } + this.parseNegate(); + var set = this.globSet = this.braceExpand(); + if (options.debug) + this.debug = console.error; + this.debug(this.pattern, set); + set = this.globParts = set.map(function(s) { + return s.split(slashSplit); + }); + this.debug(this.pattern, set); + set = set.map(function(s, si, set2) { + return s.map(this.parse, this); + }, this); + this.debug(this.pattern, set); + set = set.filter(function(s) { + return s.indexOf(false) === -1; + }); + this.debug(this.pattern, set); + this.set = set; + } + Minimatch.prototype.parseNegate = parseNegate; + function parseNegate() { + var pattern = this.pattern; + var negate = false; + var options = this.options; + var negateOffset = 0; + if (options.nonegate) + return; + for (var i = 0, l = pattern.length; i < l && pattern.charAt(i) === "!"; i++) { + negate = !negate; + negateOffset++; + } + if (negateOffset) + this.pattern = pattern.substr(negateOffset); + this.negate = negate; + } + minimatch.braceExpand = function(pattern, options) { + return braceExpand(pattern, options); + }; + Minimatch.prototype.braceExpand = braceExpand; + function braceExpand(pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options; + } else { + options = {}; + } + } + pattern = typeof pattern === "undefined" ? this.pattern : pattern; + if (typeof pattern === "undefined") { + throw new TypeError("undefined pattern"); + } + if (options.nobrace || !pattern.match(/\{.*\}/)) { + return [pattern]; + } + return expand3(pattern); + } + Minimatch.prototype.parse = parse3; + var SUBPARSE = {}; + function parse3(pattern, isSub) { + if (pattern.length > 1024 * 64) { + throw new TypeError("pattern is too long"); + } + var options = this.options; + if (!options.noglobstar && pattern === "**") + return GLOBSTAR; + if (pattern === "") + return ""; + var re = ""; + var hasMagic = !!options.nocase; + var escaping = false; + var patternListStack = []; + var negativeLists = []; + var stateChar; + var inClass = false; + var reClassStart = -1; + var classStart = -1; + var patternStart = pattern.charAt(0) === "." ? "" : options.dot ? "(?!(?:^|\\/)\\.{1,2}(?:$|\\/))" : "(?!\\.)"; + var self2 = this; + function clearStateChar() { + if (stateChar) { + switch (stateChar) { + case "*": + re += star; + hasMagic = true; + break; + case "?": + re += qmark; + hasMagic = true; + break; + default: + re += "\\" + stateChar; + break; + } + self2.debug("clearStateChar %j %j", stateChar, re); + stateChar = false; + } + } + for (var i = 0, len = pattern.length, c; i < len && (c = pattern.charAt(i)); i++) { + this.debug("%s %s %s %j", pattern, i, re, c); + if (escaping && reSpecials[c]) { + re += "\\" + c; + escaping = false; + continue; + } + switch (c) { + case "/": + return false; + case "\\": + clearStateChar(); + escaping = true; + continue; + case "?": + case "*": + case "+": + case "@": + case "!": + this.debug("%s %s %s %j <-- stateChar", pattern, i, re, c); + if (inClass) { + this.debug(" in class"); + if (c === "!" && i === classStart + 1) + c = "^"; + re += c; + continue; + } + self2.debug("call clearStateChar %j", stateChar); + clearStateChar(); + stateChar = c; + if (options.noext) + clearStateChar(); + continue; + case "(": + if (inClass) { + re += "("; + continue; + } + if (!stateChar) { + re += "\\("; + continue; + } + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }); + re += stateChar === "!" ? "(?:(?!(?:" : "(?:"; + this.debug("plType %j %j", stateChar, re); + stateChar = false; + continue; + case ")": + if (inClass || !patternListStack.length) { + re += "\\)"; + continue; + } + clearStateChar(); + hasMagic = true; + var pl = patternListStack.pop(); + re += pl.close; + if (pl.type === "!") { + negativeLists.push(pl); + } + pl.reEnd = re.length; + continue; + case "|": + if (inClass || !patternListStack.length || escaping) { + re += "\\|"; + escaping = false; + continue; + } + clearStateChar(); + re += "|"; + continue; + case "[": + clearStateChar(); + if (inClass) { + re += "\\" + c; + continue; + } + inClass = true; + classStart = i; + reClassStart = re.length; + re += c; + continue; + case "]": + if (i === classStart + 1 || !inClass) { + re += "\\" + c; + escaping = false; + continue; + } + if (inClass) { + var cs = pattern.substring(classStart + 1, i); + try { + RegExp("[" + cs + "]"); + } catch (er) { + var sp = this.parse(cs, SUBPARSE); + re = re.substr(0, reClassStart) + "\\[" + sp[0] + "\\]"; + hasMagic = hasMagic || sp[1]; + inClass = false; + continue; + } + } + hasMagic = true; + inClass = false; + re += c; + continue; + default: + clearStateChar(); + if (escaping) { + escaping = false; + } else if (reSpecials[c] && !(c === "^" && inClass)) { + re += "\\"; + } + re += c; + } + } + if (inClass) { + cs = pattern.substr(classStart + 1); + sp = this.parse(cs, SUBPARSE); + re = re.substr(0, reClassStart) + "\\[" + sp[0]; + hasMagic = hasMagic || sp[1]; + } + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + pl.open.length); + this.debug("setting tail", re, pl); + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function(_, $1, $2) { + if (!$2) { + $2 = "\\"; + } + return $1 + $1 + $2 + "|"; + }); + this.debug("tail=%j\n %s", tail, tail, pl, re); + var t = pl.type === "*" ? star : pl.type === "?" ? qmark : "\\" + pl.type; + hasMagic = true; + re = re.slice(0, pl.reStart) + t + "\\(" + tail; + } + clearStateChar(); + if (escaping) { + re += "\\\\"; + } + var addPatternStart = false; + switch (re.charAt(0)) { + case ".": + case "[": + case "(": + addPatternStart = true; + } + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n]; + var nlBefore = re.slice(0, nl.reStart); + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8); + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd); + var nlAfter = re.slice(nl.reEnd); + nlLast += nlAfter; + var openParensBefore = nlBefore.split("(").length - 1; + var cleanAfter = nlAfter; + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, ""); + } + nlAfter = cleanAfter; + var dollar = ""; + if (nlAfter === "" && isSub !== SUBPARSE) { + dollar = "$"; + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast; + re = newRe; + } + if (re !== "" && hasMagic) { + re = "(?=.)" + re; + } + if (addPatternStart) { + re = patternStart + re; + } + if (isSub === SUBPARSE) { + return [re, hasMagic]; + } + if (!hasMagic) { + return globUnescape(pattern); + } + var flags = options.nocase ? "i" : ""; + try { + var regExp = new RegExp("^" + re + "$", flags); + } catch (er) { + return new RegExp("$."); + } + regExp._glob = pattern; + regExp._src = re; + return regExp; + } + minimatch.makeRe = function(pattern, options) { + return new Minimatch(pattern, options || {}).makeRe(); + }; + Minimatch.prototype.makeRe = makeRe; + function makeRe() { + if (this.regexp || this.regexp === false) + return this.regexp; + var set = this.set; + if (!set.length) { + this.regexp = false; + return this.regexp; + } + var options = this.options; + var twoStar = options.noglobstar ? star : options.dot ? twoStarDot : twoStarNoDot; + var flags = options.nocase ? "i" : ""; + var re = set.map(function(pattern) { + return pattern.map(function(p) { + return p === GLOBSTAR ? twoStar : typeof p === "string" ? regExpEscape(p) : p._src; + }).join("\\/"); + }).join("|"); + re = "^(?:" + re + ")$"; + if (this.negate) + re = "^(?!" + re + ").*$"; + try { + this.regexp = new RegExp(re, flags); + } catch (ex) { + this.regexp = false; + } + return this.regexp; + } + minimatch.match = function(list, pattern, options) { + options = options || {}; + var mm = new Minimatch(pattern, options); + list = list.filter(function(f) { + return mm.match(f); + }); + if (mm.options.nonull && !list.length) { + list.push(pattern); + } + return list; + }; + Minimatch.prototype.match = match; + function match(f, partial) { + this.debug("match", f, this.pattern); + if (this.comment) + return false; + if (this.empty) + return f === ""; + if (f === "/" && partial) + return true; + var options = this.options; + if (path.sep !== "/") { + f = f.split(path.sep).join("/"); + } + f = f.split(slashSplit); + this.debug(this.pattern, "split", f); + var set = this.set; + this.debug(this.pattern, "set", set); + var filename; + var i; + for (i = f.length - 1; i >= 0; i--) { + filename = f[i]; + if (filename) + break; + } + for (i = 0; i < set.length; i++) { + var pattern = set[i]; + var file = f; + if (options.matchBase && pattern.length === 1) { + file = [filename]; + } + var hit = this.matchOne(file, pattern, partial); + if (hit) { + if (options.flipNegate) + return true; + return !this.negate; + } + } + if (options.flipNegate) + return false; + return this.negate; + } + Minimatch.prototype.matchOne = function(file, pattern, partial) { + var options = this.options; + this.debug( + "matchOne", + { "this": this, file, pattern } + ); + this.debug("matchOne", file.length, pattern.length); + for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { + this.debug("matchOne loop"); + var p = pattern[pi]; + var f = file[fi]; + this.debug(pattern, p, f); + if (p === false) + return false; + if (p === GLOBSTAR) { + this.debug("GLOBSTAR", [pattern, p, f]); + var fr = fi; + var pr = pi + 1; + if (pr === pl) { + this.debug("** at the end"); + for (; fi < fl; fi++) { + if (file[fi] === "." || file[fi] === ".." || !options.dot && file[fi].charAt(0) === ".") + return false; + } + return true; + } + while (fr < fl) { + var swallowee = file[fr]; + this.debug("\nglobstar while", file, fr, pattern, pr, swallowee); + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug("globstar found match!", fr, fl, swallowee); + return true; + } else { + if (swallowee === "." || swallowee === ".." || !options.dot && swallowee.charAt(0) === ".") { + this.debug("dot detected!", file, fr, pattern, pr); + break; + } + this.debug("globstar swallow a segment, and continue"); + fr++; + } + } + if (partial) { + this.debug("\n>>> no match, partial?", file, fr, pattern, pr); + if (fr === fl) + return true; + } + return false; + } + var hit; + if (typeof p === "string") { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase(); + } else { + hit = f === p; + } + this.debug("string match", p, f, hit); + } else { + hit = f.match(p); + this.debug("pattern match", p, f, hit); + } + if (!hit) + return false; + } + if (fi === fl && pi === pl) { + return true; + } else if (fi === fl) { + return partial; + } else if (pi === pl) { + var emptyFileEnd = fi === fl - 1 && file[fi] === ""; + return emptyFileEnd; + } + throw new Error("wtf?"); + }; + function globUnescape(s) { + return s.replace(/\\(.)/g, "$1"); + } + function regExpEscape(s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + } + }, + function(module2, exports2, __webpack_require__) { + var wrappy = __webpack_require__(123); + module2.exports = wrappy(once); + module2.exports.strict = wrappy(onceStrict); + once.proto = once(function() { + Object.defineProperty(Function.prototype, "once", { + value: function() { + return once(this); + }, + configurable: true + }); + Object.defineProperty(Function.prototype, "onceStrict", { + value: function() { + return onceStrict(this); + }, + configurable: true + }); + }); + function once(fn) { + var f = function() { + if (f.called) + return f.value; + f.called = true; + return f.value = fn.apply(this, arguments); + }; + f.called = false; + return f; + } + function onceStrict(fn) { + var f = function() { + if (f.called) + throw new Error(f.onceError); + f.called = true; + return f.value = fn.apply(this, arguments); + }; + var name = fn.name || "Function wrapped with `once`"; + f.onceError = name + " shouldn't be called more than once"; + f.called = false; + return f; + } + }, + , + function(module2, exports2) { + module2.exports = __require("buffer"); + }, + , + , + , + function(module2, exports2) { + module2.exports = function(it) { + if (it == void 0) + throw TypeError("Can't call method on " + it); + return it; + }; + }, + function(module2, exports2, __webpack_require__) { + var isObject = __webpack_require__(34); + var document2 = __webpack_require__(11).document; + var is = isObject(document2) && isObject(document2.createElement); + module2.exports = function(it) { + return is ? document2.createElement(it) : {}; + }; + }, + function(module2, exports2) { + module2.exports = true; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var aFunction = __webpack_require__(46); + function PromiseCapability(C) { + var resolve, reject; + this.promise = new C(function($$resolve, $$reject) { + if (resolve !== void 0 || reject !== void 0) + throw TypeError("Bad Promise constructor"); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aFunction(resolve); + this.reject = aFunction(reject); + } + module2.exports.f = function(C) { + return new PromiseCapability(C); + }; + }, + function(module2, exports2, __webpack_require__) { + var def = __webpack_require__(50).f; + var has = __webpack_require__(49); + var TAG = __webpack_require__(13)("toStringTag"); + module2.exports = function(it, tag, stat) { + if (it && !has(it = stat ? it : it.prototype, TAG)) + def(it, TAG, { configurable: true, value: tag }); + }; + }, + function(module2, exports2, __webpack_require__) { + var shared = __webpack_require__(107)("keys"); + var uid = __webpack_require__(111); + module2.exports = function(key) { + return shared[key] || (shared[key] = uid(key)); + }; + }, + function(module2, exports2) { + var ceil = Math.ceil; + var floor = Math.floor; + module2.exports = function(it) { + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); + }; + }, + function(module2, exports2, __webpack_require__) { + var IObject = __webpack_require__(131); + var defined = __webpack_require__(67); + module2.exports = function(it) { + return IObject(defined(it)); + }; + }, + function(module2, exports2, __webpack_require__) { + module2.exports = glob; + var fs = __webpack_require__(3); + var rp = __webpack_require__(114); + var minimatch = __webpack_require__(60); + var Minimatch = minimatch.Minimatch; + var inherits = __webpack_require__(42); + var EE = __webpack_require__(54).EventEmitter; + var path = __webpack_require__(0); + var assert2 = __webpack_require__(22); + var isAbsolute = __webpack_require__(76); + var globSync = __webpack_require__(218); + var common = __webpack_require__(115); + var alphasort = common.alphasort; + var alphasorti = common.alphasorti; + var setopts = common.setopts; + var ownProp = common.ownProp; + var inflight = __webpack_require__(223); + var util = __webpack_require__(2); + var childrenIgnored = common.childrenIgnored; + var isIgnored = common.isIgnored; + var once = __webpack_require__(61); + function glob(pattern, options, cb) { + if (typeof options === "function") + cb = options, options = {}; + if (!options) + options = {}; + if (options.sync) { + if (cb) + throw new TypeError("callback provided to sync glob"); + return globSync(pattern, options); + } + return new Glob(pattern, options, cb); + } + glob.sync = globSync; + var GlobSync = glob.GlobSync = globSync.GlobSync; + glob.glob = glob; + function extend(origin, add) { + if (add === null || typeof add !== "object") { + return origin; + } + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; + } + glob.hasMagic = function(pattern, options_) { + var options = extend({}, options_); + options.noprocess = true; + var g = new Glob(pattern, options); + var set = g.minimatch.set; + if (!pattern) + return false; + if (set.length > 1) + return true; + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== "string") + return true; + } + return false; + }; + glob.Glob = Glob; + inherits(Glob, EE); + function Glob(pattern, options, cb) { + if (typeof options === "function") { + cb = options; + options = null; + } + if (options && options.sync) { + if (cb) + throw new TypeError("callback provided to sync glob"); + return new GlobSync(pattern, options); + } + if (!(this instanceof Glob)) + return new Glob(pattern, options, cb); + setopts(this, pattern, options); + this._didRealPath = false; + var n = this.minimatch.set.length; + this.matches = new Array(n); + if (typeof cb === "function") { + cb = once(cb); + this.on("error", cb); + this.on("end", function(matches) { + cb(null, matches); + }); + } + var self2 = this; + this._processing = 0; + this._emitQueue = []; + this._processQueue = []; + this.paused = false; + if (this.noprocess) + return this; + if (n === 0) + return done(); + var sync = true; + for (var i = 0; i < n; i++) { + this._process(this.minimatch.set[i], i, false, done); + } + sync = false; + function done() { + --self2._processing; + if (self2._processing <= 0) { + if (sync) { + process.nextTick(function() { + self2._finish(); + }); + } else { + self2._finish(); + } + } + } + } + Glob.prototype._finish = function() { + assert2(this instanceof Glob); + if (this.aborted) + return; + if (this.realpath && !this._didRealpath) + return this._realpath(); + common.finish(this); + this.emit("end", this.found); + }; + Glob.prototype._realpath = function() { + if (this._didRealpath) + return; + this._didRealpath = true; + var n = this.matches.length; + if (n === 0) + return this._finish(); + var self2 = this; + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next); + function next() { + if (--n === 0) + self2._finish(); + } + }; + Glob.prototype._realpathSet = function(index, cb) { + var matchset = this.matches[index]; + if (!matchset) + return cb(); + var found = Object.keys(matchset); + var self2 = this; + var n = found.length; + if (n === 0) + return cb(); + var set = this.matches[index] = /* @__PURE__ */ Object.create(null); + found.forEach(function(p, i) { + p = self2._makeAbs(p); + rp.realpath(p, self2.realpathCache, function(er, real) { + if (!er) + set[real] = true; + else if (er.syscall === "stat") + set[p] = true; + else + self2.emit("error", er); + if (--n === 0) { + self2.matches[index] = set; + cb(); + } + }); + }); + }; + Glob.prototype._mark = function(p) { + return common.mark(this, p); + }; + Glob.prototype._makeAbs = function(f) { + return common.makeAbs(this, f); + }; + Glob.prototype.abort = function() { + this.aborted = true; + this.emit("abort"); + }; + Glob.prototype.pause = function() { + if (!this.paused) { + this.paused = true; + this.emit("pause"); + } + }; + Glob.prototype.resume = function() { + if (this.paused) { + this.emit("resume"); + this.paused = false; + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0); + this._emitQueue.length = 0; + for (var i = 0; i < eq.length; i++) { + var e = eq[i]; + this._emitMatch(e[0], e[1]); + } + } + if (this._processQueue.length) { + var pq = this._processQueue.slice(0); + this._processQueue.length = 0; + for (var i = 0; i < pq.length; i++) { + var p = pq[i]; + this._processing--; + this._process(p[0], p[1], p[2], p[3]); + } + } + } + }; + Glob.prototype._process = function(pattern, index, inGlobStar, cb) { + assert2(this instanceof Glob); + assert2(typeof cb === "function"); + if (this.aborted) + return; + this._processing++; + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]); + return; + } + var n = 0; + while (typeof pattern[n] === "string") { + n++; + } + var prefix; + switch (n) { + case pattern.length: + this._processSimple(pattern.join("/"), index, cb); + return; + case 0: + prefix = null; + break; + default: + prefix = pattern.slice(0, n).join("/"); + break; + } + var remain = pattern.slice(n); + var read; + if (prefix === null) + read = "."; + else if (isAbsolute(prefix) || isAbsolute(pattern.join("/"))) { + if (!prefix || !isAbsolute(prefix)) + prefix = "/" + prefix; + read = prefix; + } else + read = prefix; + var abs = this._makeAbs(read); + if (childrenIgnored(this, read)) + return cb(); + var isGlobStar = remain[0] === minimatch.GLOBSTAR; + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb); + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb); + }; + Glob.prototype._processReaddir = function(prefix, read, abs, remain, index, inGlobStar, cb) { + var self2 = this; + this._readdir(abs, inGlobStar, function(er, entries) { + return self2._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb); + }); + }; + Glob.prototype._processReaddir2 = function(prefix, read, abs, remain, index, inGlobStar, entries, cb) { + if (!entries) + return cb(); + var pn = remain[0]; + var negate = !!this.minimatch.negate; + var rawGlob = pn._glob; + var dotOk = this.dot || rawGlob.charAt(0) === "."; + var matchedEntries = []; + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (e.charAt(0) !== "." || dotOk) { + var m; + if (negate && !prefix) { + m = !e.match(pn); + } else { + m = e.match(pn); + } + if (m) + matchedEntries.push(e); + } + } + var len = matchedEntries.length; + if (len === 0) + return cb(); + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = /* @__PURE__ */ Object.create(null); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + if (prefix) { + if (prefix !== "/") + e = prefix + "/" + e; + else + e = prefix + e; + } + if (e.charAt(0) === "/" && !this.nomount) { + e = path.join(this.root, e); + } + this._emitMatch(index, e); + } + return cb(); + } + remain.shift(); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + var newPattern; + if (prefix) { + if (prefix !== "/") + e = prefix + "/" + e; + else + e = prefix + e; + } + this._process([e].concat(remain), index, inGlobStar, cb); + } + cb(); + }; + Glob.prototype._emitMatch = function(index, e) { + if (this.aborted) + return; + if (isIgnored(this, e)) + return; + if (this.paused) { + this._emitQueue.push([index, e]); + return; + } + var abs = isAbsolute(e) ? e : this._makeAbs(e); + if (this.mark) + e = this._mark(e); + if (this.absolute) + e = abs; + if (this.matches[index][e]) + return; + if (this.nodir) { + var c = this.cache[abs]; + if (c === "DIR" || Array.isArray(c)) + return; + } + this.matches[index][e] = true; + var st = this.statCache[abs]; + if (st) + this.emit("stat", e, st); + this.emit("match", e); + }; + Glob.prototype._readdirInGlobStar = function(abs, cb) { + if (this.aborted) + return; + if (this.follow) + return this._readdir(abs, false, cb); + var lstatkey = "lstat\0" + abs; + var self2 = this; + var lstatcb = inflight(lstatkey, lstatcb_); + if (lstatcb) + fs.lstat(abs, lstatcb); + function lstatcb_(er, lstat) { + if (er && er.code === "ENOENT") + return cb(); + var isSym = lstat && lstat.isSymbolicLink(); + self2.symlinks[abs] = isSym; + if (!isSym && lstat && !lstat.isDirectory()) { + self2.cache[abs] = "FILE"; + cb(); + } else + self2._readdir(abs, false, cb); + } + }; + Glob.prototype._readdir = function(abs, inGlobStar, cb) { + if (this.aborted) + return; + cb = inflight("readdir\0" + abs + "\0" + inGlobStar, cb); + if (!cb) + return; + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb); + if (ownProp(this.cache, abs)) { + var c = this.cache[abs]; + if (!c || c === "FILE") + return cb(); + if (Array.isArray(c)) + return cb(null, c); + } + var self2 = this; + fs.readdir(abs, readdirCb(this, abs, cb)); + }; + function readdirCb(self2, abs, cb) { + return function(er, entries) { + if (er) + self2._readdirError(abs, er, cb); + else + self2._readdirEntries(abs, entries, cb); + }; + } + Glob.prototype._readdirEntries = function(abs, entries, cb) { + if (this.aborted) + return; + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (abs === "/") + e = abs + e; + else + e = abs + "/" + e; + this.cache[e] = true; + } + } + this.cache[abs] = entries; + return cb(null, entries); + }; + Glob.prototype._readdirError = function(f, er, cb) { + if (this.aborted) + return; + switch (er.code) { + case "ENOTSUP": + case "ENOTDIR": + var abs = this._makeAbs(f); + this.cache[abs] = "FILE"; + if (abs === this.cwdAbs) { + var error = new Error(er.code + " invalid cwd " + this.cwd); + error.path = this.cwd; + error.code = er.code; + this.emit("error", error); + this.abort(); + } + break; + case "ENOENT": + case "ELOOP": + case "ENAMETOOLONG": + case "UNKNOWN": + this.cache[this._makeAbs(f)] = false; + break; + default: + this.cache[this._makeAbs(f)] = false; + if (this.strict) { + this.emit("error", er); + this.abort(); + } + if (!this.silent) + console.error("glob error", er); + break; + } + return cb(); + }; + Glob.prototype._processGlobStar = function(prefix, read, abs, remain, index, inGlobStar, cb) { + var self2 = this; + this._readdir(abs, inGlobStar, function(er, entries) { + self2._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb); + }); + }; + Glob.prototype._processGlobStar2 = function(prefix, read, abs, remain, index, inGlobStar, entries, cb) { + if (!entries) + return cb(); + var remainWithoutGlobStar = remain.slice(1); + var gspref = prefix ? [prefix] : []; + var noGlobStar = gspref.concat(remainWithoutGlobStar); + this._process(noGlobStar, index, false, cb); + var isSym = this.symlinks[abs]; + var len = entries.length; + if (isSym && inGlobStar) + return cb(); + for (var i = 0; i < len; i++) { + var e = entries[i]; + if (e.charAt(0) === "." && !this.dot) + continue; + var instead = gspref.concat(entries[i], remainWithoutGlobStar); + this._process(instead, index, true, cb); + var below = gspref.concat(entries[i], remain); + this._process(below, index, true, cb); + } + cb(); + }; + Glob.prototype._processSimple = function(prefix, index, cb) { + var self2 = this; + this._stat(prefix, function(er, exists) { + self2._processSimple2(prefix, index, er, exists, cb); + }); + }; + Glob.prototype._processSimple2 = function(prefix, index, er, exists, cb) { + if (!this.matches[index]) + this.matches[index] = /* @__PURE__ */ Object.create(null); + if (!exists) + return cb(); + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix); + if (prefix.charAt(0) === "/") { + prefix = path.join(this.root, prefix); + } else { + prefix = path.resolve(this.root, prefix); + if (trail) + prefix += "/"; + } + } + if (process.platform === "win32") + prefix = prefix.replace(/\\/g, "/"); + this._emitMatch(index, prefix); + cb(); + }; + Glob.prototype._stat = function(f, cb) { + var abs = this._makeAbs(f); + var needDir = f.slice(-1) === "/"; + if (f.length > this.maxLength) + return cb(); + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs]; + if (Array.isArray(c)) + c = "DIR"; + if (!needDir || c === "DIR") + return cb(null, c); + if (needDir && c === "FILE") + return cb(); + } + var exists; + var stat = this.statCache[abs]; + if (stat !== void 0) { + if (stat === false) + return cb(null, stat); + else { + var type = stat.isDirectory() ? "DIR" : "FILE"; + if (needDir && type === "FILE") + return cb(); + else + return cb(null, type, stat); + } + } + var self2 = this; + var statcb = inflight("stat\0" + abs, lstatcb_); + if (statcb) + fs.lstat(abs, statcb); + function lstatcb_(er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + return fs.stat(abs, function(er2, stat2) { + if (er2) + self2._stat2(f, abs, null, lstat, cb); + else + self2._stat2(f, abs, er2, stat2, cb); + }); + } else { + self2._stat2(f, abs, er, lstat, cb); + } + } + }; + Glob.prototype._stat2 = function(f, abs, er, stat, cb) { + if (er && (er.code === "ENOENT" || er.code === "ENOTDIR")) { + this.statCache[abs] = false; + return cb(); + } + var needDir = f.slice(-1) === "/"; + this.statCache[abs] = stat; + if (abs.slice(-1) === "/" && stat && !stat.isDirectory()) + return cb(null, false, stat); + var c = true; + if (stat) + c = stat.isDirectory() ? "DIR" : "FILE"; + this.cache[abs] = this.cache[abs] || c; + if (needDir && c === "FILE") + return cb(); + return cb(null, c, stat); + }; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + function posix(path) { + return path.charAt(0) === "/"; + } + function win32(path) { + var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + var result = splitDeviceRe.exec(path); + var device = result[1] || ""; + var isUnc = Boolean(device && device.charAt(1) !== ":"); + return Boolean(result[2] || isUnc); + } + module2.exports = process.platform === "win32" ? win32 : posix; + module2.exports.posix = posix; + module2.exports.win32 = win32; + }, + , + , + function(module2, exports2) { + module2.exports = __require("tty"); + }, + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.default = function(str, fileLoc = "lockfile") { + str = (0, (_stripBom || _load_stripBom()).default)(str); + return hasMergeConflicts(str) ? parseWithConflict(str, fileLoc) : { type: "success", object: parse3(str, fileLoc) }; + }; + var _util; + function _load_util() { + return _util = _interopRequireDefault(__webpack_require__(2)); + } + var _invariant; + function _load_invariant() { + return _invariant = _interopRequireDefault(__webpack_require__(7)); + } + var _stripBom; + function _load_stripBom() { + return _stripBom = _interopRequireDefault(__webpack_require__(122)); + } + var _constants; + function _load_constants() { + return _constants = __webpack_require__(6); + } + var _errors; + function _load_errors() { + return _errors = __webpack_require__(4); + } + var _map; + function _load_map() { + return _map = _interopRequireDefault(__webpack_require__(20)); + } + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + const VERSION_REGEX = /^yarn lockfile v(\d+)$/; + const TOKEN_TYPES = { + boolean: "BOOLEAN", + string: "STRING", + identifier: "IDENTIFIER", + eof: "EOF", + colon: "COLON", + newline: "NEWLINE", + comment: "COMMENT", + indent: "INDENT", + invalid: "INVALID", + number: "NUMBER", + comma: "COMMA" + }; + const VALID_PROP_VALUE_TOKENS = [TOKEN_TYPES.boolean, TOKEN_TYPES.string, TOKEN_TYPES.number]; + function isValidPropValueToken(token) { + return VALID_PROP_VALUE_TOKENS.indexOf(token.type) >= 0; + } + function* tokenise(input) { + let lastNewline = false; + let line = 1; + let col = 0; + function buildToken(type, value) { + return { line, col, type, value }; + } + while (input.length) { + let chop = 0; + if (input[0] === "\n" || input[0] === "\r") { + chop++; + if (input[1] === "\n") { + chop++; + } + line++; + col = 0; + yield buildToken(TOKEN_TYPES.newline); + } else if (input[0] === "#") { + chop++; + let val = ""; + while (input[chop] !== "\n") { + val += input[chop]; + chop++; + } + yield buildToken(TOKEN_TYPES.comment, val); + } else if (input[0] === " ") { + if (lastNewline) { + let indent = ""; + for (let i = 0; input[i] === " "; i++) { + indent += input[i]; + } + if (indent.length % 2) { + throw new TypeError("Invalid number of spaces"); + } else { + chop = indent.length; + yield buildToken(TOKEN_TYPES.indent, indent.length / 2); + } + } else { + chop++; + } + } else if (input[0] === '"') { + let val = ""; + for (let i = 0; ; i++) { + const currentChar = input[i]; + val += currentChar; + if (i > 0 && currentChar === '"') { + const isEscaped = input[i - 1] === "\\" && input[i - 2] !== "\\"; + if (!isEscaped) { + break; + } + } + } + chop = val.length; + try { + yield buildToken(TOKEN_TYPES.string, JSON.parse(val)); + } catch (err) { + if (err instanceof SyntaxError) { + yield buildToken(TOKEN_TYPES.invalid); + } else { + throw err; + } + } + } else if (/^[0-9]/.test(input)) { + let val = ""; + for (let i = 0; /^[0-9]$/.test(input[i]); i++) { + val += input[i]; + } + chop = val.length; + yield buildToken(TOKEN_TYPES.number, +val); + } else if (/^true/.test(input)) { + yield buildToken(TOKEN_TYPES.boolean, true); + chop = 4; + } else if (/^false/.test(input)) { + yield buildToken(TOKEN_TYPES.boolean, false); + chop = 5; + } else if (input[0] === ":") { + yield buildToken(TOKEN_TYPES.colon); + chop++; + } else if (input[0] === ",") { + yield buildToken(TOKEN_TYPES.comma); + chop++; + } else if (/^[a-zA-Z\/-]/g.test(input)) { + let name = ""; + for (let i = 0; i < input.length; i++) { + const char = input[i]; + if (char === ":" || char === " " || char === "\n" || char === "\r" || char === ",") { + break; + } else { + name += char; + } + } + chop = name.length; + yield buildToken(TOKEN_TYPES.string, name); + } else { + yield buildToken(TOKEN_TYPES.invalid); + } + if (!chop) { + yield buildToken(TOKEN_TYPES.invalid); + } + col += chop; + lastNewline = input[0] === "\n" || input[0] === "\r" && input[1] === "\n"; + input = input.slice(chop); + } + yield buildToken(TOKEN_TYPES.eof); + } + class Parser { + constructor(input, fileLoc = "lockfile") { + this.comments = []; + this.tokens = tokenise(input); + this.fileLoc = fileLoc; + } + onComment(token) { + const value = token.value; + (0, (_invariant || _load_invariant()).default)(typeof value === "string", "expected token value to be a string"); + const comment = value.trim(); + const versionMatch = comment.match(VERSION_REGEX); + if (versionMatch) { + const version = +versionMatch[1]; + if (version > (_constants || _load_constants()).LOCKFILE_VERSION) { + throw new (_errors || _load_errors()).MessageError(`Can't install from a lockfile of version ${version} as you're on an old yarn version that only supports versions up to ${(_constants || _load_constants()).LOCKFILE_VERSION}. Run \`$ yarn self-update\` to upgrade to the latest version.`); + } + } + this.comments.push(comment); + } + next() { + const item = this.tokens.next(); + (0, (_invariant || _load_invariant()).default)(item, "expected a token"); + const done = item.done, value = item.value; + if (done || !value) { + throw new Error("No more tokens"); + } else if (value.type === TOKEN_TYPES.comment) { + this.onComment(value); + return this.next(); + } else { + return this.token = value; + } + } + unexpected(msg = "Unexpected token") { + throw new SyntaxError(`${msg} ${this.token.line}:${this.token.col} in ${this.fileLoc}`); + } + expect(tokType) { + if (this.token.type === tokType) { + this.next(); + } else { + this.unexpected(); + } + } + eat(tokType) { + if (this.token.type === tokType) { + this.next(); + return true; + } else { + return false; + } + } + parse(indent = 0) { + const obj = (0, (_map || _load_map()).default)(); + while (true) { + const propToken = this.token; + if (propToken.type === TOKEN_TYPES.newline) { + const nextToken = this.next(); + if (!indent) { + continue; + } + if (nextToken.type !== TOKEN_TYPES.indent) { + break; + } + if (nextToken.value === indent) { + this.next(); + } else { + break; + } + } else if (propToken.type === TOKEN_TYPES.indent) { + if (propToken.value === indent) { + this.next(); + } else { + break; + } + } else if (propToken.type === TOKEN_TYPES.eof) { + break; + } else if (propToken.type === TOKEN_TYPES.string) { + const key = propToken.value; + (0, (_invariant || _load_invariant()).default)(key, "Expected a key"); + const keys = [key]; + this.next(); + while (this.token.type === TOKEN_TYPES.comma) { + this.next(); + const keyToken = this.token; + if (keyToken.type !== TOKEN_TYPES.string) { + this.unexpected("Expected string"); + } + const key2 = keyToken.value; + (0, (_invariant || _load_invariant()).default)(key2, "Expected a key"); + keys.push(key2); + this.next(); + } + const valToken = this.token; + if (valToken.type === TOKEN_TYPES.colon) { + this.next(); + const val = this.parse(indent + 1); + for (var _iterator = keys, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); ; ) { + var _ref; + if (_isArray) { + if (_i >= _iterator.length) + break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) + break; + _ref = _i.value; + } + const key2 = _ref; + obj[key2] = val; + } + if (indent && this.token.type !== TOKEN_TYPES.indent) { + break; + } + } else if (isValidPropValueToken(valToken)) { + for (var _iterator2 = keys, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator](); ; ) { + var _ref2; + if (_isArray2) { + if (_i2 >= _iterator2.length) + break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) + break; + _ref2 = _i2.value; + } + const key2 = _ref2; + obj[key2] = valToken.value; + } + this.next(); + } else { + this.unexpected("Invalid value type"); + } + } else { + this.unexpected(`Unknown token: ${(_util || _load_util()).default.inspect(propToken)}`); + } + } + return obj; + } + } + const MERGE_CONFLICT_ANCESTOR = "|||||||"; + const MERGE_CONFLICT_END = ">>>>>>>"; + const MERGE_CONFLICT_SEP = "======="; + const MERGE_CONFLICT_START = "<<<<<<<"; + function extractConflictVariants(str) { + const variants = [[], []]; + const lines = str.split(/\r?\n/g); + let skip = false; + while (lines.length) { + const line = lines.shift(); + if (line.startsWith(MERGE_CONFLICT_START)) { + while (lines.length) { + const conflictLine = lines.shift(); + if (conflictLine === MERGE_CONFLICT_SEP) { + skip = false; + break; + } else if (skip || conflictLine.startsWith(MERGE_CONFLICT_ANCESTOR)) { + skip = true; + continue; + } else { + variants[0].push(conflictLine); + } + } + while (lines.length) { + const conflictLine = lines.shift(); + if (conflictLine.startsWith(MERGE_CONFLICT_END)) { + break; + } else { + variants[1].push(conflictLine); + } + } + } else { + variants[0].push(line); + variants[1].push(line); + } + } + return [variants[0].join("\n"), variants[1].join("\n")]; + } + function hasMergeConflicts(str) { + return str.includes(MERGE_CONFLICT_START) && str.includes(MERGE_CONFLICT_SEP) && str.includes(MERGE_CONFLICT_END); + } + function parse3(str, fileLoc) { + const parser = new Parser(str, fileLoc); + parser.next(); + return parser.parse(); + } + function parseWithConflict(str, fileLoc) { + const variants = extractConflictVariants(str); + try { + return { type: "merge", object: Object.assign({}, parse3(variants[0], fileLoc), parse3(variants[1], fileLoc)) }; + } catch (err) { + if (err instanceof SyntaxError) { + return { type: "conflict", object: {} }; + } else { + throw err; + } + } + } + }, + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + var _map; + function _load_map() { + return _map = _interopRequireDefault(__webpack_require__(20)); + } + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + const debug = __webpack_require__(212)("yarn"); + class BlockingQueue { + constructor(alias, maxConcurrency = Infinity) { + this.concurrencyQueue = []; + this.maxConcurrency = maxConcurrency; + this.runningCount = 0; + this.warnedStuck = false; + this.alias = alias; + this.first = true; + this.running = (0, (_map || _load_map()).default)(); + this.queue = (0, (_map || _load_map()).default)(); + this.stuckTick = this.stuckTick.bind(this); + } + stillActive() { + if (this.stuckTimer) { + clearTimeout(this.stuckTimer); + } + this.stuckTimer = setTimeout(this.stuckTick, 5e3); + this.stuckTimer.unref && this.stuckTimer.unref(); + } + stuckTick() { + if (this.runningCount === 1) { + this.warnedStuck = true; + debug(`The ${JSON.stringify(this.alias)} blocking queue may be stuck. 5 seconds without any activity with 1 worker: ${Object.keys(this.running)[0]}`); + } + } + push(key, factory) { + if (this.first) { + this.first = false; + } else { + this.stillActive(); + } + return new Promise((resolve, reject) => { + const queue = this.queue[key] = this.queue[key] || []; + queue.push({ factory, resolve, reject }); + if (!this.running[key]) { + this.shift(key); + } + }); + } + shift(key) { + if (this.running[key]) { + delete this.running[key]; + this.runningCount--; + if (this.stuckTimer) { + clearTimeout(this.stuckTimer); + this.stuckTimer = null; + } + if (this.warnedStuck) { + this.warnedStuck = false; + debug(`${JSON.stringify(this.alias)} blocking queue finally resolved. Nothing to worry about.`); + } + } + const queue = this.queue[key]; + if (!queue) { + return; + } + var _queue$shift = queue.shift(); + const resolve = _queue$shift.resolve, reject = _queue$shift.reject, factory = _queue$shift.factory; + if (!queue.length) { + delete this.queue[key]; + } + const next = () => { + this.shift(key); + this.shiftConcurrencyQueue(); + }; + const run = () => { + this.running[key] = true; + this.runningCount++; + factory().then(function(val) { + resolve(val); + next(); + return null; + }).catch(function(err) { + reject(err); + next(); + }); + }; + this.maybePushConcurrencyQueue(run); + } + maybePushConcurrencyQueue(run) { + if (this.runningCount < this.maxConcurrency) { + run(); + } else { + this.concurrencyQueue.push(run); + } + } + shiftConcurrencyQueue() { + if (this.runningCount < this.maxConcurrency) { + const fn = this.concurrencyQueue.shift(); + if (fn) { + fn(); + } + } + } + } + exports2.default = BlockingQueue; + }, + function(module2, exports2) { + module2.exports = function(exec) { + try { + return !!exec(); + } catch (e) { + return true; + } + }; + }, + , + , + , + , + , + , + , + , + , + , + , + , + , + , + function(module2, exports2, __webpack_require__) { + var cof = __webpack_require__(47); + var TAG = __webpack_require__(13)("toStringTag"); + var ARG = cof(function() { + return arguments; + }()) == "Arguments"; + var tryGet = function(it, key) { + try { + return it[key]; + } catch (e) { + } + }; + module2.exports = function(it) { + var O, T, B; + return it === void 0 ? "Undefined" : it === null ? "Null" : typeof (T = tryGet(O = Object(it), TAG)) == "string" ? T : ARG ? cof(O) : (B = cof(O)) == "Object" && typeof O.callee == "function" ? "Arguments" : B; + }; + }, + function(module2, exports2) { + module2.exports = "constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","); + }, + function(module2, exports2, __webpack_require__) { + var document2 = __webpack_require__(11).document; + module2.exports = document2 && document2.documentElement; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var LIBRARY = __webpack_require__(69); + var $export = __webpack_require__(41); + var redefine = __webpack_require__(197); + var hide = __webpack_require__(31); + var Iterators = __webpack_require__(35); + var $iterCreate = __webpack_require__(188); + var setToStringTag = __webpack_require__(71); + var getPrototypeOf = __webpack_require__(194); + var ITERATOR = __webpack_require__(13)("iterator"); + var BUGGY = !([].keys && "next" in [].keys()); + var FF_ITERATOR = "@@iterator"; + var KEYS = "keys"; + var VALUES = "values"; + var returnThis = function() { + return this; + }; + module2.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { + $iterCreate(Constructor, NAME, next); + var getMethod = function(kind) { + if (!BUGGY && kind in proto2) + return proto2[kind]; + switch (kind) { + case KEYS: + return function keys() { + return new Constructor(this, kind); + }; + case VALUES: + return function values() { + return new Constructor(this, kind); + }; + } + return function entries() { + return new Constructor(this, kind); + }; + }; + var TAG = NAME + " Iterator"; + var DEF_VALUES = DEFAULT == VALUES; + var VALUES_BUG = false; + var proto2 = Base.prototype; + var $native = proto2[ITERATOR] || proto2[FF_ITERATOR] || DEFAULT && proto2[DEFAULT]; + var $default = $native || getMethod(DEFAULT); + var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod("entries") : void 0; + var $anyNative = NAME == "Array" ? proto2.entries || $native : $native; + var methods, key, IteratorPrototype; + if ($anyNative) { + IteratorPrototype = getPrototypeOf($anyNative.call(new Base())); + if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { + setToStringTag(IteratorPrototype, TAG, true); + if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != "function") + hide(IteratorPrototype, ITERATOR, returnThis); + } + } + if (DEF_VALUES && $native && $native.name !== VALUES) { + VALUES_BUG = true; + $default = function values() { + return $native.call(this); + }; + } + if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto2[ITERATOR])) { + hide(proto2, ITERATOR, $default); + } + Iterators[NAME] = $default; + Iterators[TAG] = returnThis; + if (DEFAULT) { + methods = { + values: DEF_VALUES ? $default : getMethod(VALUES), + keys: IS_SET ? $default : getMethod(KEYS), + entries: $entries + }; + if (FORCED) + for (key in methods) { + if (!(key in proto2)) + redefine(proto2, key, methods[key]); + } + else + $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); + } + return methods; + }; + }, + function(module2, exports2) { + module2.exports = function(exec) { + try { + return { e: false, v: exec() }; + } catch (e) { + return { e: true, v: e }; + } + }; + }, + function(module2, exports2, __webpack_require__) { + var anObject = __webpack_require__(27); + var isObject = __webpack_require__(34); + var newPromiseCapability = __webpack_require__(70); + module2.exports = function(C, x) { + anObject(C); + if (isObject(x) && x.constructor === C) + return x; + var promiseCapability = newPromiseCapability.f(C); + var resolve = promiseCapability.resolve; + resolve(x); + return promiseCapability.promise; + }; + }, + function(module2, exports2) { + module2.exports = function(bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value + }; + }; + }, + function(module2, exports2, __webpack_require__) { + var core = __webpack_require__(23); + var global = __webpack_require__(11); + var SHARED = "__core-js_shared__"; + var store = global[SHARED] || (global[SHARED] = {}); + (module2.exports = function(key, value) { + return store[key] || (store[key] = value !== void 0 ? value : {}); + })("versions", []).push({ + version: core.version, + mode: __webpack_require__(69) ? "pure" : "global", + copyright: "\xA9 2018 Denis Pushkarev (zloirock.ru)" + }); + }, + function(module2, exports2, __webpack_require__) { + var anObject = __webpack_require__(27); + var aFunction = __webpack_require__(46); + var SPECIES = __webpack_require__(13)("species"); + module2.exports = function(O, D) { + var C = anObject(O).constructor; + var S; + return C === void 0 || (S = anObject(C)[SPECIES]) == void 0 ? D : aFunction(S); + }; + }, + function(module2, exports2, __webpack_require__) { + var ctx = __webpack_require__(48); + var invoke = __webpack_require__(185); + var html = __webpack_require__(102); + var cel = __webpack_require__(68); + var global = __webpack_require__(11); + var process4 = global.process; + var setTask = global.setImmediate; + var clearTask = global.clearImmediate; + var MessageChannel = global.MessageChannel; + var Dispatch = global.Dispatch; + var counter = 0; + var queue = {}; + var ONREADYSTATECHANGE = "onreadystatechange"; + var defer, channel, port; + var run = function() { + var id = +this; + if (queue.hasOwnProperty(id)) { + var fn = queue[id]; + delete queue[id]; + fn(); + } + }; + var listener = function(event) { + run.call(event.data); + }; + if (!setTask || !clearTask) { + setTask = function setImmediate(fn) { + var args = []; + var i = 1; + while (arguments.length > i) + args.push(arguments[i++]); + queue[++counter] = function() { + invoke(typeof fn == "function" ? fn : Function(fn), args); + }; + defer(counter); + return counter; + }; + clearTask = function clearImmediate(id) { + delete queue[id]; + }; + if (__webpack_require__(47)(process4) == "process") { + defer = function(id) { + process4.nextTick(ctx(run, id, 1)); + }; + } else if (Dispatch && Dispatch.now) { + defer = function(id) { + Dispatch.now(ctx(run, id, 1)); + }; + } else if (MessageChannel) { + channel = new MessageChannel(); + port = channel.port2; + channel.port1.onmessage = listener; + defer = ctx(port.postMessage, port, 1); + } else if (global.addEventListener && typeof postMessage == "function" && !global.importScripts) { + defer = function(id) { + global.postMessage(id + "", "*"); + }; + global.addEventListener("message", listener, false); + } else if (ONREADYSTATECHANGE in cel("script")) { + defer = function(id) { + html.appendChild(cel("script"))[ONREADYSTATECHANGE] = function() { + html.removeChild(this); + run.call(id); + }; + }; + } else { + defer = function(id) { + setTimeout(ctx(run, id, 1), 0); + }; + } + } + module2.exports = { + set: setTask, + clear: clearTask + }; + }, + function(module2, exports2, __webpack_require__) { + var toInteger = __webpack_require__(73); + var min = Math.min; + module2.exports = function(it) { + return it > 0 ? min(toInteger(it), 9007199254740991) : 0; + }; + }, + function(module2, exports2) { + var id = 0; + var px = Math.random(); + module2.exports = function(key) { + return "Symbol(".concat(key === void 0 ? "" : key, ")_", (++id + px).toString(36)); + }; + }, + function(module2, exports2, __webpack_require__) { + exports2 = module2.exports = createDebug.debug = createDebug["default"] = createDebug; + exports2.coerce = coerce; + exports2.disable = disable; + exports2.enable = enable; + exports2.enabled = enabled; + exports2.humanize = __webpack_require__(229); + exports2.instances = []; + exports2.names = []; + exports2.skips = []; + exports2.formatters = {}; + function selectColor(namespace) { + var hash = 0, i; + for (i in namespace) { + hash = (hash << 5) - hash + namespace.charCodeAt(i); + hash |= 0; + } + return exports2.colors[Math.abs(hash) % exports2.colors.length]; + } + function createDebug(namespace) { + var prevTime; + function debug() { + if (!debug.enabled) + return; + var self2 = debug; + var curr = +new Date(); + var ms = curr - (prevTime || curr); + self2.diff = ms; + self2.prev = prevTime; + self2.curr = curr; + prevTime = curr; + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + args[0] = exports2.coerce(args[0]); + if ("string" !== typeof args[0]) { + args.unshift("%O"); + } + var index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { + if (match === "%%") + return match; + index++; + var formatter = exports2.formatters[format]; + if ("function" === typeof formatter) { + var val = args[index]; + match = formatter.call(self2, val); + args.splice(index, 1); + index--; + } + return match; + }); + exports2.formatArgs.call(self2, args); + var logFn = debug.log || exports2.log || console.log.bind(console); + logFn.apply(self2, args); + } + debug.namespace = namespace; + debug.enabled = exports2.enabled(namespace); + debug.useColors = exports2.useColors(); + debug.color = selectColor(namespace); + debug.destroy = destroy; + if ("function" === typeof exports2.init) { + exports2.init(debug); + } + exports2.instances.push(debug); + return debug; + } + function destroy() { + var index = exports2.instances.indexOf(this); + if (index !== -1) { + exports2.instances.splice(index, 1); + return true; + } else { + return false; + } + } + function enable(namespaces) { + exports2.save(namespaces); + exports2.names = []; + exports2.skips = []; + var i; + var split = (typeof namespaces === "string" ? namespaces : "").split(/[\s,]+/); + var len = split.length; + for (i = 0; i < len; i++) { + if (!split[i]) + continue; + namespaces = split[i].replace(/\*/g, ".*?"); + if (namespaces[0] === "-") { + exports2.skips.push(new RegExp("^" + namespaces.substr(1) + "$")); + } else { + exports2.names.push(new RegExp("^" + namespaces + "$")); + } + } + for (i = 0; i < exports2.instances.length; i++) { + var instance = exports2.instances[i]; + instance.enabled = exports2.enabled(instance.namespace); + } + } + function disable() { + exports2.enable(""); + } + function enabled(name) { + if (name[name.length - 1] === "*") { + return true; + } + var i, len; + for (i = 0, len = exports2.skips.length; i < len; i++) { + if (exports2.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = exports2.names.length; i < len; i++) { + if (exports2.names[i].test(name)) { + return true; + } + } + return false; + } + function coerce(val) { + if (val instanceof Error) + return val.stack || val.message; + return val; + } + }, + , + function(module2, exports2, __webpack_require__) { + module2.exports = realpath; + realpath.realpath = realpath; + realpath.sync = realpathSync; + realpath.realpathSync = realpathSync; + realpath.monkeypatch = monkeypatch; + realpath.unmonkeypatch = unmonkeypatch; + var fs = __webpack_require__(3); + var origRealpath = fs.realpath; + var origRealpathSync = fs.realpathSync; + var version = process.version; + var ok = /^v[0-5]\./.test(version); + var old = __webpack_require__(217); + function newError(er) { + return er && er.syscall === "realpath" && (er.code === "ELOOP" || er.code === "ENOMEM" || er.code === "ENAMETOOLONG"); + } + function realpath(p, cache, cb) { + if (ok) { + return origRealpath(p, cache, cb); + } + if (typeof cache === "function") { + cb = cache; + cache = null; + } + origRealpath(p, cache, function(er, result) { + if (newError(er)) { + old.realpath(p, cache, cb); + } else { + cb(er, result); + } + }); + } + function realpathSync(p, cache) { + if (ok) { + return origRealpathSync(p, cache); + } + try { + return origRealpathSync(p, cache); + } catch (er) { + if (newError(er)) { + return old.realpathSync(p, cache); + } else { + throw er; + } + } + } + function monkeypatch() { + fs.realpath = realpath; + fs.realpathSync = realpathSync; + } + function unmonkeypatch() { + fs.realpath = origRealpath; + fs.realpathSync = origRealpathSync; + } + }, + function(module2, exports2, __webpack_require__) { + exports2.alphasort = alphasort; + exports2.alphasorti = alphasorti; + exports2.setopts = setopts; + exports2.ownProp = ownProp; + exports2.makeAbs = makeAbs; + exports2.finish = finish; + exports2.mark = mark; + exports2.isIgnored = isIgnored; + exports2.childrenIgnored = childrenIgnored; + function ownProp(obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field); + } + var path = __webpack_require__(0); + var minimatch = __webpack_require__(60); + var isAbsolute = __webpack_require__(76); + var Minimatch = minimatch.Minimatch; + function alphasorti(a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()); + } + function alphasort(a, b) { + return a.localeCompare(b); + } + function setupIgnores(self2, options) { + self2.ignore = options.ignore || []; + if (!Array.isArray(self2.ignore)) + self2.ignore = [self2.ignore]; + if (self2.ignore.length) { + self2.ignore = self2.ignore.map(ignoreMap); + } + } + function ignoreMap(pattern) { + var gmatcher = null; + if (pattern.slice(-3) === "/**") { + var gpattern = pattern.replace(/(\/\*\*)+$/, ""); + gmatcher = new Minimatch(gpattern, { dot: true }); + } + return { + matcher: new Minimatch(pattern, { dot: true }), + gmatcher + }; + } + function setopts(self2, pattern, options) { + if (!options) + options = {}; + if (options.matchBase && -1 === pattern.indexOf("/")) { + if (options.noglobstar) { + throw new Error("base matching requires globstar"); + } + pattern = "**/" + pattern; + } + self2.silent = !!options.silent; + self2.pattern = pattern; + self2.strict = options.strict !== false; + self2.realpath = !!options.realpath; + self2.realpathCache = options.realpathCache || /* @__PURE__ */ Object.create(null); + self2.follow = !!options.follow; + self2.dot = !!options.dot; + self2.mark = !!options.mark; + self2.nodir = !!options.nodir; + if (self2.nodir) + self2.mark = true; + self2.sync = !!options.sync; + self2.nounique = !!options.nounique; + self2.nonull = !!options.nonull; + self2.nosort = !!options.nosort; + self2.nocase = !!options.nocase; + self2.stat = !!options.stat; + self2.noprocess = !!options.noprocess; + self2.absolute = !!options.absolute; + self2.maxLength = options.maxLength || Infinity; + self2.cache = options.cache || /* @__PURE__ */ Object.create(null); + self2.statCache = options.statCache || /* @__PURE__ */ Object.create(null); + self2.symlinks = options.symlinks || /* @__PURE__ */ Object.create(null); + setupIgnores(self2, options); + self2.changedCwd = false; + var cwd = process.cwd(); + if (!ownProp(options, "cwd")) + self2.cwd = cwd; + else { + self2.cwd = path.resolve(options.cwd); + self2.changedCwd = self2.cwd !== cwd; + } + self2.root = options.root || path.resolve(self2.cwd, "/"); + self2.root = path.resolve(self2.root); + if (process.platform === "win32") + self2.root = self2.root.replace(/\\/g, "/"); + self2.cwdAbs = isAbsolute(self2.cwd) ? self2.cwd : makeAbs(self2, self2.cwd); + if (process.platform === "win32") + self2.cwdAbs = self2.cwdAbs.replace(/\\/g, "/"); + self2.nomount = !!options.nomount; + options.nonegate = true; + options.nocomment = true; + self2.minimatch = new Minimatch(pattern, options); + self2.options = self2.minimatch.options; + } + function finish(self2) { + var nou = self2.nounique; + var all = nou ? [] : /* @__PURE__ */ Object.create(null); + for (var i = 0, l = self2.matches.length; i < l; i++) { + var matches = self2.matches[i]; + if (!matches || Object.keys(matches).length === 0) { + if (self2.nonull) { + var literal = self2.minimatch.globSet[i]; + if (nou) + all.push(literal); + else + all[literal] = true; + } + } else { + var m = Object.keys(matches); + if (nou) + all.push.apply(all, m); + else + m.forEach(function(m2) { + all[m2] = true; + }); + } + } + if (!nou) + all = Object.keys(all); + if (!self2.nosort) + all = all.sort(self2.nocase ? alphasorti : alphasort); + if (self2.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self2._mark(all[i]); + } + if (self2.nodir) { + all = all.filter(function(e) { + var notDir = !/\/$/.test(e); + var c = self2.cache[e] || self2.cache[makeAbs(self2, e)]; + if (notDir && c) + notDir = c !== "DIR" && !Array.isArray(c); + return notDir; + }); + } + } + if (self2.ignore.length) + all = all.filter(function(m2) { + return !isIgnored(self2, m2); + }); + self2.found = all; + } + function mark(self2, p) { + var abs = makeAbs(self2, p); + var c = self2.cache[abs]; + var m = p; + if (c) { + var isDir = c === "DIR" || Array.isArray(c); + var slash = p.slice(-1) === "/"; + if (isDir && !slash) + m += "/"; + else if (!isDir && slash) + m = m.slice(0, -1); + if (m !== p) { + var mabs = makeAbs(self2, m); + self2.statCache[mabs] = self2.statCache[abs]; + self2.cache[mabs] = self2.cache[abs]; + } + } + return m; + } + function makeAbs(self2, f) { + var abs = f; + if (f.charAt(0) === "/") { + abs = path.join(self2.root, f); + } else if (isAbsolute(f) || f === "") { + abs = f; + } else if (self2.changedCwd) { + abs = path.resolve(self2.cwd, f); + } else { + abs = path.resolve(f); + } + if (process.platform === "win32") + abs = abs.replace(/\\/g, "/"); + return abs; + } + function isIgnored(self2, path2) { + if (!self2.ignore.length) + return false; + return self2.ignore.some(function(item) { + return item.matcher.match(path2) || !!(item.gmatcher && item.gmatcher.match(path2)); + }); + } + function childrenIgnored(self2, path2) { + if (!self2.ignore.length) + return false; + return self2.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path2)); + }); + } + }, + function(module2, exports2, __webpack_require__) { + var path = __webpack_require__(0); + var fs = __webpack_require__(3); + var _0777 = parseInt("0777", 8); + module2.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; + function mkdirP(p, opts, f, made) { + if (typeof opts === "function") { + f = opts; + opts = {}; + } else if (!opts || typeof opts !== "object") { + opts = { mode: opts }; + } + var mode = opts.mode; + var xfs = opts.fs || fs; + if (mode === void 0) { + mode = _0777 & ~process.umask(); + } + if (!made) + made = null; + var cb = f || function() { + }; + p = path.resolve(p); + xfs.mkdir(p, mode, function(er) { + if (!er) { + made = made || p; + return cb(null, made); + } + switch (er.code) { + case "ENOENT": + mkdirP(path.dirname(p), opts, function(er2, made2) { + if (er2) + cb(er2, made2); + else + mkdirP(p, opts, cb, made2); + }); + break; + default: + xfs.stat(p, function(er2, stat) { + if (er2 || !stat.isDirectory()) + cb(er, made); + else + cb(null, made); + }); + break; + } + }); + } + mkdirP.sync = function sync(p, opts, made) { + if (!opts || typeof opts !== "object") { + opts = { mode: opts }; + } + var mode = opts.mode; + var xfs = opts.fs || fs; + if (mode === void 0) { + mode = _0777 & ~process.umask(); + } + if (!made) + made = null; + p = path.resolve(p); + try { + xfs.mkdirSync(p, mode); + made = made || p; + } catch (err0) { + switch (err0.code) { + case "ENOENT": + made = sync(path.dirname(p), opts, made); + sync(p, opts, made); + break; + default: + var stat; + try { + stat = xfs.statSync(p); + } catch (err1) { + throw err0; + } + if (!stat.isDirectory()) + throw err0; + break; + } + } + return made; + }; + }, + , + , + , + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + module2.exports = (x) => { + if (typeof x !== "string") { + throw new TypeError("Expected a string, got " + typeof x); + } + if (x.charCodeAt(0) === 65279) { + return x.slice(1); + } + return x; + }; + }, + function(module2, exports2) { + module2.exports = wrappy; + function wrappy(fn, cb) { + if (fn && cb) + return wrappy(fn)(cb); + if (typeof fn !== "function") + throw new TypeError("need wrapper function"); + Object.keys(fn).forEach(function(k) { + wrapper[k] = fn[k]; + }); + return wrapper; + function wrapper() { + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + var ret = fn.apply(this, args); + var cb2 = args[args.length - 1]; + if (typeof ret === "function" && ret !== cb2) { + Object.keys(cb2).forEach(function(k) { + ret[k] = cb2[k]; + }); + } + return ret; + } + } + }, + , + , + , + , + , + , + , + function(module2, exports2, __webpack_require__) { + var cof = __webpack_require__(47); + module2.exports = Object("z").propertyIsEnumerable(0) ? Object : function(it) { + return cof(it) == "String" ? it.split("") : Object(it); + }; + }, + function(module2, exports2, __webpack_require__) { + var $keys = __webpack_require__(195); + var enumBugKeys = __webpack_require__(101); + module2.exports = Object.keys || function keys(O) { + return $keys(O, enumBugKeys); + }; + }, + function(module2, exports2, __webpack_require__) { + var defined = __webpack_require__(67); + module2.exports = function(it) { + return Object(defined(it)); + }; + }, + , + , + , + , + , + , + , + , + , + , + , + function(module2, exports2) { + module2.exports = { "name": "yarn", "installationMethod": "unknown", "version": "1.10.0-0", "license": "BSD-2-Clause", "preferGlobal": true, "description": "\u{1F4E6}\u{1F408} Fast, reliable, and secure dependency management.", "dependencies": { "@zkochan/cmd-shim": "^2.2.4", "babel-runtime": "^6.26.0", "bytes": "^3.0.0", "camelcase": "^4.0.0", "chalk": "^2.1.0", "commander": "^2.9.0", "death": "^1.0.0", "debug": "^3.0.0", "deep-equal": "^1.0.1", "detect-indent": "^5.0.0", "dnscache": "^1.0.1", "glob": "^7.1.1", "gunzip-maybe": "^1.4.0", "hash-for-dep": "^1.2.3", "imports-loader": "^0.8.0", "ini": "^1.3.4", "inquirer": "^3.0.1", "invariant": "^2.2.0", "is-builtin-module": "^2.0.0", "is-ci": "^1.0.10", "is-webpack-bundle": "^1.0.0", "leven": "^2.0.0", "loud-rejection": "^1.2.0", "micromatch": "^2.3.11", "mkdirp": "^0.5.1", "node-emoji": "^1.6.1", "normalize-url": "^2.0.0", "npm-logical-tree": "^1.2.1", "object-path": "^0.11.2", "proper-lockfile": "^2.0.0", "puka": "^1.0.0", "read": "^1.0.7", "request": "^2.87.0", "request-capture-har": "^1.2.2", "rimraf": "^2.5.0", "semver": "^5.1.0", "ssri": "^5.3.0", "strip-ansi": "^4.0.0", "strip-bom": "^3.0.0", "tar-fs": "^1.16.0", "tar-stream": "^1.6.1", "uuid": "^3.0.1", "v8-compile-cache": "^2.0.0", "validate-npm-package-license": "^3.0.3", "yn": "^2.0.0" }, "devDependencies": { "babel-core": "^6.26.0", "babel-eslint": "^7.2.3", "babel-loader": "^6.2.5", "babel-plugin-array-includes": "^2.0.3", "babel-plugin-transform-builtin-extend": "^1.1.2", "babel-plugin-transform-inline-imports-commonjs": "^1.0.0", "babel-plugin-transform-runtime": "^6.4.3", "babel-preset-env": "^1.6.0", "babel-preset-flow": "^6.23.0", "babel-preset-stage-0": "^6.0.0", "babylon": "^6.5.0", "commitizen": "^2.9.6", "cz-conventional-changelog": "^2.0.0", "eslint": "^4.3.0", "eslint-config-fb-strict": "^22.0.0", "eslint-plugin-babel": "^5.0.0", "eslint-plugin-flowtype": "^2.35.0", "eslint-plugin-jasmine": "^2.6.2", "eslint-plugin-jest": "^21.0.0", "eslint-plugin-jsx-a11y": "^6.0.2", "eslint-plugin-prefer-object-spread": "^1.2.1", "eslint-plugin-prettier": "^2.1.2", "eslint-plugin-react": "^7.1.0", "eslint-plugin-relay": "^0.0.24", "eslint-plugin-yarn-internal": "file:scripts/eslint-rules", "execa": "^0.10.0", "flow-bin": "^0.66.0", "git-release-notes": "^3.0.0", "gulp": "^3.9.0", "gulp-babel": "^7.0.0", "gulp-if": "^2.0.1", "gulp-newer": "^1.0.0", "gulp-plumber": "^1.0.1", "gulp-sourcemaps": "^2.2.0", "gulp-util": "^3.0.7", "gulp-watch": "^5.0.0", "jest": "^22.4.4", "jsinspect": "^0.12.6", "minimatch": "^3.0.4", "mock-stdin": "^0.3.0", "prettier": "^1.5.2", "temp": "^0.8.3", "webpack": "^2.1.0-beta.25", "yargs": "^6.3.0" }, "resolutions": { "sshpk": "^1.14.2" }, "engines": { "node": ">=4.0.0" }, "repository": "yarnpkg/yarn", "bin": { "yarn": "./bin/yarn.js", "yarnpkg": "./bin/yarn.js" }, "scripts": { "build": "gulp build", "build-bundle": "node ./scripts/build-webpack.js", "build-chocolatey": "powershell ./scripts/build-chocolatey.ps1", "build-deb": "./scripts/build-deb.sh", "build-dist": "bash ./scripts/build-dist.sh", "build-win-installer": "scripts\\build-windows-installer.bat", "changelog": "git-release-notes $(git describe --tags --abbrev=0 $(git describe --tags --abbrev=0)^)..$(git describe --tags --abbrev=0) scripts/changelog.md", "dupe-check": "yarn jsinspect ./src", "lint": "eslint . && flow check", "pkg-tests": "yarn --cwd packages/pkg-tests jest yarn.test.js", "prettier": "eslint src __tests__ --fix", "release-branch": "./scripts/release-branch.sh", "test": "yarn lint && yarn test-only", "test-only": "node --max_old_space_size=4096 ", "test-only-debug": "node --inspect-brk --max_old_space_size=4096 ", "test-coverage": "node --max_old_space_size=4096 ", "watch": "gulp watch", "commit": "git-cz" }, "jest": { "collectCoverageFrom": ["src/**/*.js"], "testEnvironment": "node", "modulePathIgnorePatterns": ["__tests__/fixtures/", "packages/pkg-tests/pkg-tests-fixtures", "dist/"], "testPathIgnorePatterns": ["__tests__/(fixtures|__mocks__)/", "updates/", "_(temp|mock|install|init|helpers).js$", "packages/pkg-tests"] }, "config": { "commitizen": { "path": "./" } } }; + }, + , + , + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.default = stringify; + var _misc; + function _load_misc() { + return _misc = __webpack_require__(12); + } + var _constants; + function _load_constants() { + return _constants = __webpack_require__(6); + } + var _package; + function _load_package() { + return _package = __webpack_require__(145); + } + const NODE_VERSION = process.version; + function shouldWrapKey(str) { + return str.indexOf("true") === 0 || str.indexOf("false") === 0 || /[:\s\n\\",\[\]]/g.test(str) || /^[0-9]/g.test(str) || !/^[a-zA-Z]/g.test(str); + } + function maybeWrap(str) { + if (typeof str === "boolean" || typeof str === "number" || shouldWrapKey(str)) { + return JSON.stringify(str); + } else { + return str; + } + } + const priorities = { + name: 1, + version: 2, + uid: 3, + resolved: 4, + integrity: 5, + registry: 6, + dependencies: 7 + }; + function priorityThenAlphaSort(a, b) { + if (priorities[a] || priorities[b]) { + return (priorities[a] || 100) > (priorities[b] || 100) ? 1 : -1; + } else { + return (0, (_misc || _load_misc()).sortAlpha)(a, b); + } + } + function _stringify(obj, options) { + if (typeof obj !== "object") { + throw new TypeError(); + } + const indent = options.indent; + const lines = []; + const keys = Object.keys(obj).sort(priorityThenAlphaSort); + let addedKeys = []; + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const val = obj[key]; + if (val == null || addedKeys.indexOf(key) >= 0) { + continue; + } + const valKeys = [key]; + if (typeof val === "object") { + for (let j = i + 1; j < keys.length; j++) { + const key2 = keys[j]; + if (val === obj[key2]) { + valKeys.push(key2); + } + } + } + const keyLine = valKeys.sort((_misc || _load_misc()).sortAlpha).map(maybeWrap).join(", "); + if (typeof val === "string" || typeof val === "boolean" || typeof val === "number") { + lines.push(`${keyLine} ${maybeWrap(val)}`); + } else if (typeof val === "object") { + lines.push(`${keyLine}: +${_stringify(val, { indent: indent + " " })}` + (options.topLevel ? "\n" : "")); + } else { + throw new TypeError(); + } + addedKeys = addedKeys.concat(valKeys); + } + return indent + lines.join(` +${indent}`); + } + function stringify(obj, noHeader, enableVersions) { + const val = _stringify(obj, { + indent: "", + topLevel: true + }); + if (noHeader) { + return val; + } + const lines = []; + lines.push("# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY."); + lines.push(`# yarn lockfile v${(_constants || _load_constants()).LOCKFILE_VERSION}`); + if (enableVersions) { + lines.push(`# yarn v${(_package || _load_package()).version}`); + lines.push(`# node ${NODE_VERSION}`); + } + lines.push("\n"); + lines.push(val); + return lines.join("\n"); + } + }, + , + , + , + , + , + , + , + , + , + , + , + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.fileDatesEqual = exports2.copyFile = exports2.unlink = void 0; + var _asyncToGenerator2; + function _load_asyncToGenerator() { + return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(1)); + } + let fixTimes = (() => { + var _ref3 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (fd, dest, data) { + const doOpen = fd === void 0; + let openfd = fd ? fd : -1; + if (disableTimestampCorrection === void 0) { + const destStat = yield lstat(dest); + disableTimestampCorrection = fileDatesEqual(destStat.mtime, data.mtime); + } + if (disableTimestampCorrection) { + return; + } + if (doOpen) { + try { + openfd = yield open(dest, "a", data.mode); + } catch (er) { + try { + openfd = yield open(dest, "r", data.mode); + } catch (err) { + return; + } + } + } + try { + if (openfd) { + yield futimes(openfd, data.atime, data.mtime); + } + } catch (er) { + } finally { + if (doOpen && openfd) { + yield close(openfd); + } + } + }); + return function fixTimes2(_x7, _x8, _x9) { + return _ref3.apply(this, arguments); + }; + })(); + var _fs; + function _load_fs() { + return _fs = _interopRequireDefault(__webpack_require__(3)); + } + var _promise; + function _load_promise() { + return _promise = __webpack_require__(40); + } + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + let disableTimestampCorrection = void 0; + const readFileBuffer = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.readFile); + const close = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.close); + const lstat = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.lstat); + const open = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.open); + const futimes = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.futimes); + const write = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.write); + const unlink = exports2.unlink = (0, (_promise || _load_promise()).promisify)(__webpack_require__(233)); + const copyFile = exports2.copyFile = (() => { + var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data, cleanup) { + try { + yield unlink(data.dest); + yield copyFilePoly(data.src, data.dest, 0, data); + } finally { + if (cleanup) { + cleanup(); + } + } + }); + return function copyFile2(_x, _x2) { + return _ref.apply(this, arguments); + }; + })(); + const copyFilePoly = (src, dest, flags, data) => { + if ((_fs || _load_fs()).default.copyFile) { + return new Promise((resolve, reject) => (_fs || _load_fs()).default.copyFile(src, dest, flags, (err) => { + if (err) { + reject(err); + } else { + fixTimes(void 0, dest, data).then(() => resolve()).catch((ex) => reject(ex)); + } + })); + } else { + return copyWithBuffer(src, dest, flags, data); + } + }; + const copyWithBuffer = (() => { + var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (src, dest, flags, data) { + const fd = yield open(dest, "w", data.mode); + try { + const buffer = yield readFileBuffer(src); + yield write(fd, buffer, 0, buffer.length); + yield fixTimes(fd, dest, data); + } finally { + yield close(fd); + } + }); + return function copyWithBuffer2(_x3, _x4, _x5, _x6) { + return _ref2.apply(this, arguments); + }; + })(); + const fileDatesEqual = exports2.fileDatesEqual = (a, b) => { + const aTime = a.getTime(); + const bTime = b.getTime(); + if (process.platform !== "win32") { + return aTime === bTime; + } + if (Math.abs(aTime - bTime) <= 1) { + return true; + } + const aTimeSec = Math.floor(aTime / 1e3); + const bTimeSec = Math.floor(bTime / 1e3); + if (aTime - aTimeSec * 1e3 === 0 || bTime - bTimeSec * 1e3 === 0) { + return aTimeSec === bTimeSec; + } + return aTime === bTime; + }; + }, + , + , + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.isFakeRoot = isFakeRoot; + exports2.isRootUser = isRootUser; + function getUid() { + if (process.platform !== "win32" && process.getuid) { + return process.getuid(); + } + return null; + } + exports2.default = isRootUser(getUid()) && !isFakeRoot(); + function isFakeRoot() { + return Boolean(process.env.FAKEROOTKEY); + } + function isRootUser(uid) { + return uid === 0; + } + }, + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.getDataDir = getDataDir; + exports2.getCacheDir = getCacheDir; + exports2.getConfigDir = getConfigDir; + const path = __webpack_require__(0); + const userHome = __webpack_require__(45).default; + const FALLBACK_CONFIG_DIR = path.join(userHome, ".config", "yarn"); + const FALLBACK_CACHE_DIR = path.join(userHome, ".cache", "yarn"); + function getDataDir() { + if (process.platform === "win32") { + const WIN32_APPDATA_DIR = getLocalAppDataDir(); + return WIN32_APPDATA_DIR == null ? FALLBACK_CONFIG_DIR : path.join(WIN32_APPDATA_DIR, "Data"); + } else if (process.env.XDG_DATA_HOME) { + return path.join(process.env.XDG_DATA_HOME, "yarn"); + } else { + return FALLBACK_CONFIG_DIR; + } + } + function getCacheDir() { + if (process.platform === "win32") { + return path.join(getLocalAppDataDir() || path.join(userHome, "AppData", "Local", "Yarn"), "Cache"); + } else if (process.env.XDG_CACHE_HOME) { + return path.join(process.env.XDG_CACHE_HOME, "yarn"); + } else if (process.platform === "darwin") { + return path.join(userHome, "Library", "Caches", "Yarn"); + } else { + return FALLBACK_CACHE_DIR; + } + } + function getConfigDir() { + if (process.platform === "win32") { + const WIN32_APPDATA_DIR = getLocalAppDataDir(); + return WIN32_APPDATA_DIR == null ? FALLBACK_CONFIG_DIR : path.join(WIN32_APPDATA_DIR, "Config"); + } else if (process.env.XDG_CONFIG_HOME) { + return path.join(process.env.XDG_CONFIG_HOME, "yarn"); + } else { + return FALLBACK_CONFIG_DIR; + } + } + function getLocalAppDataDir() { + return process.env.LOCALAPPDATA ? path.join(process.env.LOCALAPPDATA, "Yarn") : null; + } + }, + , + function(module2, exports2, __webpack_require__) { + module2.exports = { "default": __webpack_require__(179), __esModule: true }; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + module2.exports = balanced; + function balanced(a, b, str) { + if (a instanceof RegExp) + a = maybeMatch(a, str); + if (b instanceof RegExp) + b = maybeMatch(b, str); + var r = range(a, b, str); + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; + } + function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; + } + balanced.range = range; + function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + if (ai >= 0 && bi > 0) { + begs = []; + left = str.length; + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [begs.pop(), bi]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + bi = str.indexOf(b, i + 1); + } + i = ai < bi && ai >= 0 ? ai : bi; + } + if (begs.length) { + result = [left, right]; + } + } + return result; + } + }, + function(module2, exports2, __webpack_require__) { + var concatMap = __webpack_require__(178); + var balanced = __webpack_require__(174); + module2.exports = expandTop; + var escSlash = "\0SLASH" + Math.random() + "\0"; + var escOpen = "\0OPEN" + Math.random() + "\0"; + var escClose = "\0CLOSE" + Math.random() + "\0"; + var escComma = "\0COMMA" + Math.random() + "\0"; + var escPeriod = "\0PERIOD" + Math.random() + "\0"; + function numeric(str) { + return parseInt(str, 10) == str ? parseInt(str, 10) : str.charCodeAt(0); + } + function escapeBraces(str) { + return str.split("\\\\").join(escSlash).split("\\{").join(escOpen).split("\\}").join(escClose).split("\\,").join(escComma).split("\\.").join(escPeriod); + } + function unescapeBraces(str) { + return str.split(escSlash).join("\\").split(escOpen).join("{").split(escClose).join("}").split(escComma).join(",").split(escPeriod).join("."); + } + function parseCommaParts(str) { + if (!str) + return [""]; + var parts = []; + var m = balanced("{", "}", str); + if (!m) + return str.split(","); + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(","); + p[p.length - 1] += "{" + body + "}"; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length - 1] += postParts.shift(); + p.push.apply(p, postParts); + } + parts.push.apply(parts, p); + return parts; + } + function expandTop(str) { + if (!str) + return []; + if (str.substr(0, 2) === "{}") { + str = "\\{\\}" + str.substr(2); + } + return expand3(escapeBraces(str), true).map(unescapeBraces); + } + function identity(e) { + return e; + } + function embrace(str) { + return "{" + str + "}"; + } + function isPadded(el) { + return /^-?0\d/.test(el); + } + function lte(i, y) { + return i <= y; + } + function gte(i, y) { + return i >= y; + } + function expand3(str, isTop) { + var expansions = []; + var m = balanced("{", "}", str); + if (!m || /\$$/.test(m.pre)) + return [str]; + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(",") >= 0; + if (!isSequence && !isOptions) { + if (m.post.match(/,.*\}/)) { + str = m.pre + "{" + m.body + escClose + m.post; + return expand3(str); + } + return [str]; + } + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + n = expand3(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length ? expand3(m.post, false) : [""]; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + var pre = m.pre; + var post = m.post.length ? expand3(m.post, false) : [""]; + var N; + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length); + var incr = n.length == 3 ? Math.abs(numeric(n[2])) : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + N = []; + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === "\\") + c = ""; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join("0"); + if (i < 0) + c = "-" + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { + return expand3(el, false); + }); + } + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + return expansions; + } + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + function preserveCamelCase(str) { + let isLastCharLower = false; + let isLastCharUpper = false; + let isLastLastCharUpper = false; + for (let i = 0; i < str.length; i++) { + const c = str[i]; + if (isLastCharLower && /[a-zA-Z]/.test(c) && c.toUpperCase() === c) { + str = str.substr(0, i) + "-" + str.substr(i); + isLastCharLower = false; + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = true; + i++; + } else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(c) && c.toLowerCase() === c) { + str = str.substr(0, i - 1) + "-" + str.substr(i - 1); + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = false; + isLastCharLower = true; + } else { + isLastCharLower = c.toLowerCase() === c; + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = c.toUpperCase() === c; + } + } + return str; + } + module2.exports = function(str) { + if (arguments.length > 1) { + str = Array.from(arguments).map((x) => x.trim()).filter((x) => x.length).join("-"); + } else { + str = str.trim(); + } + if (str.length === 0) { + return ""; + } + if (str.length === 1) { + return str.toLowerCase(); + } + if (/^[a-z0-9]+$/.test(str)) { + return str; + } + const hasUpperCase = str !== str.toLowerCase(); + if (hasUpperCase) { + str = preserveCamelCase(str); + } + return str.replace(/^[_.\- ]+/, "").toLowerCase().replace(/[_.\- ]+(\w|$)/g, (m, p1) => p1.toUpperCase()); + }; + }, + , + function(module2, exports2) { + module2.exports = function(xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) + res.push.apply(res, x); + else + res.push(x); + } + return res; + }; + var isArray = Array.isArray || function(xs) { + return Object.prototype.toString.call(xs) === "[object Array]"; + }; + }, + function(module2, exports2, __webpack_require__) { + __webpack_require__(205); + __webpack_require__(207); + __webpack_require__(210); + __webpack_require__(206); + __webpack_require__(208); + __webpack_require__(209); + module2.exports = __webpack_require__(23).Promise; + }, + function(module2, exports2) { + module2.exports = function() { + }; + }, + function(module2, exports2) { + module2.exports = function(it, Constructor, name, forbiddenField) { + if (!(it instanceof Constructor) || forbiddenField !== void 0 && forbiddenField in it) { + throw TypeError(name + ": incorrect invocation!"); + } + return it; + }; + }, + function(module2, exports2, __webpack_require__) { + var toIObject = __webpack_require__(74); + var toLength = __webpack_require__(110); + var toAbsoluteIndex = __webpack_require__(200); + module2.exports = function(IS_INCLUDES) { + return function($this, el, fromIndex) { + var O = toIObject($this); + var length = toLength(O.length); + var index = toAbsoluteIndex(fromIndex, length); + var value; + if (IS_INCLUDES && el != el) + while (length > index) { + value = O[index++]; + if (value != value) + return true; + } + else + for (; length > index; index++) + if (IS_INCLUDES || index in O) { + if (O[index] === el) + return IS_INCLUDES || index || 0; + } + return !IS_INCLUDES && -1; + }; + }; + }, + function(module2, exports2, __webpack_require__) { + var ctx = __webpack_require__(48); + var call = __webpack_require__(187); + var isArrayIter = __webpack_require__(186); + var anObject = __webpack_require__(27); + var toLength = __webpack_require__(110); + var getIterFn = __webpack_require__(203); + var BREAK = {}; + var RETURN = {}; + var exports2 = module2.exports = function(iterable, entries, fn, that, ITERATOR) { + var iterFn = ITERATOR ? function() { + return iterable; + } : getIterFn(iterable); + var f = ctx(fn, that, entries ? 2 : 1); + var index = 0; + var length, step, iterator2, result; + if (typeof iterFn != "function") + throw TypeError(iterable + " is not iterable!"); + if (isArrayIter(iterFn)) + for (length = toLength(iterable.length); length > index; index++) { + result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); + if (result === BREAK || result === RETURN) + return result; + } + else + for (iterator2 = iterFn.call(iterable); !(step = iterator2.next()).done; ) { + result = call(iterator2, f, step.value, entries); + if (result === BREAK || result === RETURN) + return result; + } + }; + exports2.BREAK = BREAK; + exports2.RETURN = RETURN; + }, + function(module2, exports2, __webpack_require__) { + module2.exports = !__webpack_require__(33) && !__webpack_require__(85)(function() { + return Object.defineProperty(__webpack_require__(68)("div"), "a", { get: function() { + return 7; + } }).a != 7; + }); + }, + function(module2, exports2) { + module2.exports = function(fn, args, that) { + var un = that === void 0; + switch (args.length) { + case 0: + return un ? fn() : fn.call(that); + case 1: + return un ? fn(args[0]) : fn.call(that, args[0]); + case 2: + return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]); + case 3: + return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]); + case 4: + return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]); + } + return fn.apply(that, args); + }; + }, + function(module2, exports2, __webpack_require__) { + var Iterators = __webpack_require__(35); + var ITERATOR = __webpack_require__(13)("iterator"); + var ArrayProto = Array.prototype; + module2.exports = function(it) { + return it !== void 0 && (Iterators.Array === it || ArrayProto[ITERATOR] === it); + }; + }, + function(module2, exports2, __webpack_require__) { + var anObject = __webpack_require__(27); + module2.exports = function(iterator2, fn, value, entries) { + try { + return entries ? fn(anObject(value)[0], value[1]) : fn(value); + } catch (e) { + var ret = iterator2["return"]; + if (ret !== void 0) + anObject(ret.call(iterator2)); + throw e; + } + }; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var create = __webpack_require__(192); + var descriptor = __webpack_require__(106); + var setToStringTag = __webpack_require__(71); + var IteratorPrototype = {}; + __webpack_require__(31)(IteratorPrototype, __webpack_require__(13)("iterator"), function() { + return this; + }); + module2.exports = function(Constructor, NAME, next) { + Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) }); + setToStringTag(Constructor, NAME + " Iterator"); + }; + }, + function(module2, exports2, __webpack_require__) { + var ITERATOR = __webpack_require__(13)("iterator"); + var SAFE_CLOSING = false; + try { + var riter = [7][ITERATOR](); + riter["return"] = function() { + SAFE_CLOSING = true; + }; + Array.from(riter, function() { + throw 2; + }); + } catch (e) { + } + module2.exports = function(exec, skipClosing) { + if (!skipClosing && !SAFE_CLOSING) + return false; + var safe = false; + try { + var arr = [7]; + var iter = arr[ITERATOR](); + iter.next = function() { + return { done: safe = true }; + }; + arr[ITERATOR] = function() { + return iter; + }; + exec(arr); + } catch (e) { + } + return safe; + }; + }, + function(module2, exports2) { + module2.exports = function(done, value) { + return { value, done: !!done }; + }; + }, + function(module2, exports2, __webpack_require__) { + var global = __webpack_require__(11); + var macrotask = __webpack_require__(109).set; + var Observer = global.MutationObserver || global.WebKitMutationObserver; + var process4 = global.process; + var Promise2 = global.Promise; + var isNode = __webpack_require__(47)(process4) == "process"; + module2.exports = function() { + var head, last, notify; + var flush = function() { + var parent, fn; + if (isNode && (parent = process4.domain)) + parent.exit(); + while (head) { + fn = head.fn; + head = head.next; + try { + fn(); + } catch (e) { + if (head) + notify(); + else + last = void 0; + throw e; + } + } + last = void 0; + if (parent) + parent.enter(); + }; + if (isNode) { + notify = function() { + process4.nextTick(flush); + }; + } else if (Observer && !(global.navigator && global.navigator.standalone)) { + var toggle = true; + var node = document.createTextNode(""); + new Observer(flush).observe(node, { characterData: true }); + notify = function() { + node.data = toggle = !toggle; + }; + } else if (Promise2 && Promise2.resolve) { + var promise = Promise2.resolve(void 0); + notify = function() { + promise.then(flush); + }; + } else { + notify = function() { + macrotask.call(global, flush); + }; + } + return function(fn) { + var task = { fn, next: void 0 }; + if (last) + last.next = task; + if (!head) { + head = task; + notify(); + } + last = task; + }; + }; + }, + function(module2, exports2, __webpack_require__) { + var anObject = __webpack_require__(27); + var dPs = __webpack_require__(193); + var enumBugKeys = __webpack_require__(101); + var IE_PROTO = __webpack_require__(72)("IE_PROTO"); + var Empty = function() { + }; + var PROTOTYPE = "prototype"; + var createDict = function() { + var iframe = __webpack_require__(68)("iframe"); + var i = enumBugKeys.length; + var lt = "<"; + var gt = ">"; + var iframeDocument; + iframe.style.display = "none"; + __webpack_require__(102).appendChild(iframe); + iframe.src = "javascript:"; + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + "script" + gt + "document.F=Object" + lt + "/script" + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while (i--) + delete createDict[PROTOTYPE][enumBugKeys[i]]; + return createDict(); + }; + module2.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + Empty[PROTOTYPE] = anObject(O); + result = new Empty(); + Empty[PROTOTYPE] = null; + result[IE_PROTO] = O; + } else + result = createDict(); + return Properties === void 0 ? result : dPs(result, Properties); + }; + }, + function(module2, exports2, __webpack_require__) { + var dP = __webpack_require__(50); + var anObject = __webpack_require__(27); + var getKeys = __webpack_require__(132); + module2.exports = __webpack_require__(33) ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var keys = getKeys(Properties); + var length = keys.length; + var i = 0; + var P; + while (length > i) + dP.f(O, P = keys[i++], Properties[P]); + return O; + }; + }, + function(module2, exports2, __webpack_require__) { + var has = __webpack_require__(49); + var toObject = __webpack_require__(133); + var IE_PROTO = __webpack_require__(72)("IE_PROTO"); + var ObjectProto = Object.prototype; + module2.exports = Object.getPrototypeOf || function(O) { + O = toObject(O); + if (has(O, IE_PROTO)) + return O[IE_PROTO]; + if (typeof O.constructor == "function" && O instanceof O.constructor) { + return O.constructor.prototype; + } + return O instanceof Object ? ObjectProto : null; + }; + }, + function(module2, exports2, __webpack_require__) { + var has = __webpack_require__(49); + var toIObject = __webpack_require__(74); + var arrayIndexOf = __webpack_require__(182)(false); + var IE_PROTO = __webpack_require__(72)("IE_PROTO"); + module2.exports = function(object, names) { + var O = toIObject(object); + var i = 0; + var result = []; + var key; + for (key in O) + if (key != IE_PROTO) + has(O, key) && result.push(key); + while (names.length > i) + if (has(O, key = names[i++])) { + ~arrayIndexOf(result, key) || result.push(key); + } + return result; + }; + }, + function(module2, exports2, __webpack_require__) { + var hide = __webpack_require__(31); + module2.exports = function(target, src, safe) { + for (var key in src) { + if (safe && target[key]) + target[key] = src[key]; + else + hide(target, key, src[key]); + } + return target; + }; + }, + function(module2, exports2, __webpack_require__) { + module2.exports = __webpack_require__(31); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var global = __webpack_require__(11); + var core = __webpack_require__(23); + var dP = __webpack_require__(50); + var DESCRIPTORS = __webpack_require__(33); + var SPECIES = __webpack_require__(13)("species"); + module2.exports = function(KEY) { + var C = typeof core[KEY] == "function" ? core[KEY] : global[KEY]; + if (DESCRIPTORS && C && !C[SPECIES]) + dP.f(C, SPECIES, { + configurable: true, + get: function() { + return this; + } + }); + }; + }, + function(module2, exports2, __webpack_require__) { + var toInteger = __webpack_require__(73); + var defined = __webpack_require__(67); + module2.exports = function(TO_STRING) { + return function(that, pos) { + var s = String(defined(that)); + var i = toInteger(pos); + var l = s.length; + var a, b; + if (i < 0 || i >= l) + return TO_STRING ? "" : void 0; + a = s.charCodeAt(i); + return a < 55296 || a > 56319 || i + 1 === l || (b = s.charCodeAt(i + 1)) < 56320 || b > 57343 ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 55296 << 10) + (b - 56320) + 65536; + }; + }; + }, + function(module2, exports2, __webpack_require__) { + var toInteger = __webpack_require__(73); + var max = Math.max; + var min = Math.min; + module2.exports = function(index, length) { + index = toInteger(index); + return index < 0 ? max(index + length, 0) : min(index, length); + }; + }, + function(module2, exports2, __webpack_require__) { + var isObject = __webpack_require__(34); + module2.exports = function(it, S) { + if (!isObject(it)) + return it; + var fn, val; + if (S && typeof (fn = it.toString) == "function" && !isObject(val = fn.call(it))) + return val; + if (typeof (fn = it.valueOf) == "function" && !isObject(val = fn.call(it))) + return val; + if (!S && typeof (fn = it.toString) == "function" && !isObject(val = fn.call(it))) + return val; + throw TypeError("Can't convert object to primitive value"); + }; + }, + function(module2, exports2, __webpack_require__) { + var global = __webpack_require__(11); + var navigator2 = global.navigator; + module2.exports = navigator2 && navigator2.userAgent || ""; + }, + function(module2, exports2, __webpack_require__) { + var classof = __webpack_require__(100); + var ITERATOR = __webpack_require__(13)("iterator"); + var Iterators = __webpack_require__(35); + module2.exports = __webpack_require__(23).getIteratorMethod = function(it) { + if (it != void 0) + return it[ITERATOR] || it["@@iterator"] || Iterators[classof(it)]; + }; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var addToUnscopables = __webpack_require__(180); + var step = __webpack_require__(190); + var Iterators = __webpack_require__(35); + var toIObject = __webpack_require__(74); + module2.exports = __webpack_require__(103)(Array, "Array", function(iterated, kind) { + this._t = toIObject(iterated); + this._i = 0; + this._k = kind; + }, function() { + var O = this._t; + var kind = this._k; + var index = this._i++; + if (!O || index >= O.length) { + this._t = void 0; + return step(1); + } + if (kind == "keys") + return step(0, index); + if (kind == "values") + return step(0, O[index]); + return step(0, [index, O[index]]); + }, "values"); + Iterators.Arguments = Iterators.Array; + addToUnscopables("keys"); + addToUnscopables("values"); + addToUnscopables("entries"); + }, + function(module2, exports2) { + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var LIBRARY = __webpack_require__(69); + var global = __webpack_require__(11); + var ctx = __webpack_require__(48); + var classof = __webpack_require__(100); + var $export = __webpack_require__(41); + var isObject = __webpack_require__(34); + var aFunction = __webpack_require__(46); + var anInstance = __webpack_require__(181); + var forOf = __webpack_require__(183); + var speciesConstructor = __webpack_require__(108); + var task = __webpack_require__(109).set; + var microtask = __webpack_require__(191)(); + var newPromiseCapabilityModule = __webpack_require__(70); + var perform = __webpack_require__(104); + var userAgent3 = __webpack_require__(202); + var promiseResolve = __webpack_require__(105); + var PROMISE = "Promise"; + var TypeError2 = global.TypeError; + var process4 = global.process; + var versions = process4 && process4.versions; + var v8 = versions && versions.v8 || ""; + var $Promise = global[PROMISE]; + var isNode = classof(process4) == "process"; + var empty = function() { + }; + var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper; + var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f; + var USE_NATIVE = !!function() { + try { + var promise = $Promise.resolve(1); + var FakePromise = (promise.constructor = {})[__webpack_require__(13)("species")] = function(exec) { + exec(empty, empty); + }; + return (isNode || typeof PromiseRejectionEvent == "function") && promise.then(empty) instanceof FakePromise && v8.indexOf("6.6") !== 0 && userAgent3.indexOf("Chrome/66") === -1; + } catch (e) { + } + }(); + var isThenable = function(it) { + var then; + return isObject(it) && typeof (then = it.then) == "function" ? then : false; + }; + var notify = function(promise, isReject) { + if (promise._n) + return; + promise._n = true; + var chain = promise._c; + microtask(function() { + var value = promise._v; + var ok = promise._s == 1; + var i = 0; + var run = function(reaction) { + var handler2 = ok ? reaction.ok : reaction.fail; + var resolve = reaction.resolve; + var reject = reaction.reject; + var domain = reaction.domain; + var result, then, exited; + try { + if (handler2) { + if (!ok) { + if (promise._h == 2) + onHandleUnhandled(promise); + promise._h = 1; + } + if (handler2 === true) + result = value; + else { + if (domain) + domain.enter(); + result = handler2(value); + if (domain) { + domain.exit(); + exited = true; + } + } + if (result === reaction.promise) { + reject(TypeError2("Promise-chain cycle")); + } else if (then = isThenable(result)) { + then.call(result, resolve, reject); + } else + resolve(result); + } else + reject(value); + } catch (e) { + if (domain && !exited) + domain.exit(); + reject(e); + } + }; + while (chain.length > i) + run(chain[i++]); + promise._c = []; + promise._n = false; + if (isReject && !promise._h) + onUnhandled(promise); + }); + }; + var onUnhandled = function(promise) { + task.call(global, function() { + var value = promise._v; + var unhandled = isUnhandled(promise); + var result, handler2, console2; + if (unhandled) { + result = perform(function() { + if (isNode) { + process4.emit("unhandledRejection", value, promise); + } else if (handler2 = global.onunhandledrejection) { + handler2({ promise, reason: value }); + } else if ((console2 = global.console) && console2.error) { + console2.error("Unhandled promise rejection", value); + } + }); + promise._h = isNode || isUnhandled(promise) ? 2 : 1; + } + promise._a = void 0; + if (unhandled && result.e) + throw result.v; + }); + }; + var isUnhandled = function(promise) { + return promise._h !== 1 && (promise._a || promise._c).length === 0; + }; + var onHandleUnhandled = function(promise) { + task.call(global, function() { + var handler2; + if (isNode) { + process4.emit("rejectionHandled", promise); + } else if (handler2 = global.onrejectionhandled) { + handler2({ promise, reason: promise._v }); + } + }); + }; + var $reject = function(value) { + var promise = this; + if (promise._d) + return; + promise._d = true; + promise = promise._w || promise; + promise._v = value; + promise._s = 2; + if (!promise._a) + promise._a = promise._c.slice(); + notify(promise, true); + }; + var $resolve = function(value) { + var promise = this; + var then; + if (promise._d) + return; + promise._d = true; + promise = promise._w || promise; + try { + if (promise === value) + throw TypeError2("Promise can't be resolved itself"); + if (then = isThenable(value)) { + microtask(function() { + var wrapper = { _w: promise, _d: false }; + try { + then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1)); + } catch (e) { + $reject.call(wrapper, e); + } + }); + } else { + promise._v = value; + promise._s = 1; + notify(promise, false); + } + } catch (e) { + $reject.call({ _w: promise, _d: false }, e); + } + }; + if (!USE_NATIVE) { + $Promise = function Promise2(executor) { + anInstance(this, $Promise, PROMISE, "_h"); + aFunction(executor); + Internal.call(this); + try { + executor(ctx($resolve, this, 1), ctx($reject, this, 1)); + } catch (err) { + $reject.call(this, err); + } + }; + Internal = function Promise2(executor) { + this._c = []; + this._a = void 0; + this._s = 0; + this._d = false; + this._v = void 0; + this._h = 0; + this._n = false; + }; + Internal.prototype = __webpack_require__(196)($Promise.prototype, { + then: function then(onFulfilled, onRejected) { + var reaction = newPromiseCapability(speciesConstructor(this, $Promise)); + reaction.ok = typeof onFulfilled == "function" ? onFulfilled : true; + reaction.fail = typeof onRejected == "function" && onRejected; + reaction.domain = isNode ? process4.domain : void 0; + this._c.push(reaction); + if (this._a) + this._a.push(reaction); + if (this._s) + notify(this, false); + return reaction.promise; + }, + "catch": function(onRejected) { + return this.then(void 0, onRejected); + } + }); + OwnPromiseCapability = function() { + var promise = new Internal(); + this.promise = promise; + this.resolve = ctx($resolve, promise, 1); + this.reject = ctx($reject, promise, 1); + }; + newPromiseCapabilityModule.f = newPromiseCapability = function(C) { + return C === $Promise || C === Wrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C); + }; + } + $export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise }); + __webpack_require__(71)($Promise, PROMISE); + __webpack_require__(198)(PROMISE); + Wrapper = __webpack_require__(23)[PROMISE]; + $export($export.S + $export.F * !USE_NATIVE, PROMISE, { + reject: function reject(r) { + var capability = newPromiseCapability(this); + var $$reject = capability.reject; + $$reject(r); + return capability.promise; + } + }); + $export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { + resolve: function resolve(x) { + return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x); + } + }); + $export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(189)(function(iter) { + $Promise.all(iter)["catch"](empty); + })), PROMISE, { + all: function all(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = perform(function() { + var values = []; + var index = 0; + var remaining = 1; + forOf(iterable, false, function(promise) { + var $index = index++; + var alreadyCalled = false; + values.push(void 0); + remaining++; + C.resolve(promise).then(function(value) { + if (alreadyCalled) + return; + alreadyCalled = true; + values[$index] = value; + --remaining || resolve(values); + }, reject); + }); + --remaining || resolve(values); + }); + if (result.e) + reject(result.v); + return capability.promise; + }, + race: function race(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var reject = capability.reject; + var result = perform(function() { + forOf(iterable, false, function(promise) { + C.resolve(promise).then(capability.resolve, reject); + }); + }); + if (result.e) + reject(result.v); + return capability.promise; + } + }); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var $at = __webpack_require__(199)(true); + __webpack_require__(103)(String, "String", function(iterated) { + this._t = String(iterated); + this._i = 0; + }, function() { + var O = this._t; + var index = this._i; + var point; + if (index >= O.length) + return { value: void 0, done: true }; + point = $at(O, index); + this._i += point.length; + return { value: point, done: false }; + }); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var $export = __webpack_require__(41); + var core = __webpack_require__(23); + var global = __webpack_require__(11); + var speciesConstructor = __webpack_require__(108); + var promiseResolve = __webpack_require__(105); + $export($export.P + $export.R, "Promise", { "finally": function(onFinally) { + var C = speciesConstructor(this, core.Promise || global.Promise); + var isFunction = typeof onFinally == "function"; + return this.then( + isFunction ? function(x) { + return promiseResolve(C, onFinally()).then(function() { + return x; + }); + } : onFinally, + isFunction ? function(e) { + return promiseResolve(C, onFinally()).then(function() { + throw e; + }); + } : onFinally + ); + } }); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var $export = __webpack_require__(41); + var newPromiseCapability = __webpack_require__(70); + var perform = __webpack_require__(104); + $export($export.S, "Promise", { "try": function(callbackfn) { + var promiseCapability = newPromiseCapability.f(this); + var result = perform(callbackfn); + (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v); + return promiseCapability.promise; + } }); + }, + function(module2, exports2, __webpack_require__) { + __webpack_require__(204); + var global = __webpack_require__(11); + var hide = __webpack_require__(31); + var Iterators = __webpack_require__(35); + var TO_STRING_TAG = __webpack_require__(13)("toStringTag"); + var DOMIterables = "CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","); + for (var i = 0; i < DOMIterables.length; i++) { + var NAME = DOMIterables[i]; + var Collection2 = global[NAME]; + var proto2 = Collection2 && Collection2.prototype; + if (proto2 && !proto2[TO_STRING_TAG]) + hide(proto2, TO_STRING_TAG, NAME); + Iterators[NAME] = Iterators.Array; + } + }, + function(module2, exports2, __webpack_require__) { + exports2 = module2.exports = __webpack_require__(112); + exports2.log = log; + exports2.formatArgs = formatArgs; + exports2.save = save; + exports2.load = load; + exports2.useColors = useColors; + exports2.storage = "undefined" != typeof chrome && "undefined" != typeof chrome.storage ? chrome.storage.local : localstorage(); + exports2.colors = [ + "#0000CC", + "#0000FF", + "#0033CC", + "#0033FF", + "#0066CC", + "#0066FF", + "#0099CC", + "#0099FF", + "#00CC00", + "#00CC33", + "#00CC66", + "#00CC99", + "#00CCCC", + "#00CCFF", + "#3300CC", + "#3300FF", + "#3333CC", + "#3333FF", + "#3366CC", + "#3366FF", + "#3399CC", + "#3399FF", + "#33CC00", + "#33CC33", + "#33CC66", + "#33CC99", + "#33CCCC", + "#33CCFF", + "#6600CC", + "#6600FF", + "#6633CC", + "#6633FF", + "#66CC00", + "#66CC33", + "#9900CC", + "#9900FF", + "#9933CC", + "#9933FF", + "#99CC00", + "#99CC33", + "#CC0000", + "#CC0033", + "#CC0066", + "#CC0099", + "#CC00CC", + "#CC00FF", + "#CC3300", + "#CC3333", + "#CC3366", + "#CC3399", + "#CC33CC", + "#CC33FF", + "#CC6600", + "#CC6633", + "#CC9900", + "#CC9933", + "#CCCC00", + "#CCCC33", + "#FF0000", + "#FF0033", + "#FF0066", + "#FF0099", + "#FF00CC", + "#FF00FF", + "#FF3300", + "#FF3333", + "#FF3366", + "#FF3399", + "#FF33CC", + "#FF33FF", + "#FF6600", + "#FF6633", + "#FF9900", + "#FF9933", + "#FFCC00", + "#FFCC33" + ]; + function useColors() { + if (typeof window !== "undefined" && window.process && window.process.type === "renderer") { + return true; + } + if (typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); + } + exports2.formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (err) { + return "[UnexpectedJSONParseError]: " + err.message; + } + }; + function formatArgs(args) { + var useColors2 = this.useColors; + args[0] = (useColors2 ? "%c" : "") + this.namespace + (useColors2 ? " %c" : " ") + args[0] + (useColors2 ? "%c " : " ") + "+" + exports2.humanize(this.diff); + if (!useColors2) + return; + var c = "color: " + this.color; + args.splice(1, 0, c, "color: inherit"); + var index = 0; + var lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, function(match) { + if ("%%" === match) + return; + index++; + if ("%c" === match) { + lastC = index; + } + }); + args.splice(lastC, 0, c); + } + function log() { + return "object" === typeof console && console.log && Function.prototype.apply.call(console.log, console, arguments); + } + function save(namespaces) { + try { + if (null == namespaces) { + exports2.storage.removeItem("debug"); + } else { + exports2.storage.debug = namespaces; + } + } catch (e) { + } + } + function load() { + var r; + try { + r = exports2.storage.debug; + } catch (e) { + } + if (!r && typeof process !== "undefined" && "env" in process) { + r = process.env.DEBUG; + } + return r; + } + exports2.enable(load()); + function localstorage() { + try { + return window.localStorage; + } catch (e) { + } + } + }, + function(module2, exports2, __webpack_require__) { + if (typeof process === "undefined" || process.type === "renderer") { + module2.exports = __webpack_require__(211); + } else { + module2.exports = __webpack_require__(213); + } + }, + function(module2, exports2, __webpack_require__) { + var tty3 = __webpack_require__(79); + var util = __webpack_require__(2); + exports2 = module2.exports = __webpack_require__(112); + exports2.init = init; + exports2.log = log; + exports2.formatArgs = formatArgs; + exports2.save = save; + exports2.load = load; + exports2.useColors = useColors; + exports2.colors = [6, 2, 3, 4, 5, 1]; + try { + var supportsColor3 = __webpack_require__(239); + if (supportsColor3 && supportsColor3.level >= 2) { + exports2.colors = [ + 20, + 21, + 26, + 27, + 32, + 33, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 56, + 57, + 62, + 63, + 68, + 69, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 92, + 93, + 98, + 99, + 112, + 113, + 128, + 129, + 134, + 135, + 148, + 149, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 178, + 179, + 184, + 185, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 214, + 215, + 220, + 221 + ]; + } + } catch (err) { + } + exports2.inspectOpts = Object.keys(process.env).filter(function(key) { + return /^debug_/i.test(key); + }).reduce(function(obj, key) { + var prop = key.substring(6).toLowerCase().replace(/_([a-z])/g, function(_, k) { + return k.toUpperCase(); + }); + var val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) + val = true; + else if (/^(no|off|false|disabled)$/i.test(val)) + val = false; + else if (val === "null") + val = null; + else + val = Number(val); + obj[prop] = val; + return obj; + }, {}); + function useColors() { + return "colors" in exports2.inspectOpts ? Boolean(exports2.inspectOpts.colors) : tty3.isatty(process.stderr.fd); + } + exports2.formatters.o = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts).split("\n").map(function(str) { + return str.trim(); + }).join(" "); + }; + exports2.formatters.O = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); + }; + function formatArgs(args) { + var name = this.namespace; + var useColors2 = this.useColors; + if (useColors2) { + var c = this.color; + var colorCode = "\x1B[3" + (c < 8 ? c : "8;5;" + c); + var prefix = " " + colorCode + ";1m" + name + " \x1B[0m"; + args[0] = prefix + args[0].split("\n").join("\n" + prefix); + args.push(colorCode + "m+" + exports2.humanize(this.diff) + "\x1B[0m"); + } else { + args[0] = getDate() + name + " " + args[0]; + } + } + function getDate() { + if (exports2.inspectOpts.hideDate) { + return ""; + } else { + return new Date().toISOString() + " "; + } + } + function log() { + return process.stderr.write(util.format.apply(util, arguments) + "\n"); + } + function save(namespaces) { + if (null == namespaces) { + delete process.env.DEBUG; + } else { + process.env.DEBUG = namespaces; + } + } + function load() { + return process.env.DEBUG; + } + function init(debug) { + debug.inspectOpts = {}; + var keys = Object.keys(exports2.inspectOpts); + for (var i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports2.inspectOpts[keys[i]]; + } + } + exports2.enable(load()); + }, + , + , + , + function(module2, exports2, __webpack_require__) { + var pathModule = __webpack_require__(0); + var isWindows = process.platform === "win32"; + var fs = __webpack_require__(3); + var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG); + function rethrow() { + var callback; + if (DEBUG) { + var backtrace = new Error(); + callback = debugCallback; + } else + callback = missingCallback; + return callback; + function debugCallback(err) { + if (err) { + backtrace.message = err.message; + err = backtrace; + missingCallback(err); + } + } + function missingCallback(err) { + if (err) { + if (process.throwDeprecation) + throw err; + else if (!process.noDeprecation) { + var msg = "fs: missing callback " + (err.stack || err.message); + if (process.traceDeprecation) + console.trace(msg); + else + console.error(msg); + } + } + } + } + function maybeCallback(cb) { + return typeof cb === "function" ? cb : rethrow(); + } + var normalize = pathModule.normalize; + if (isWindows) { + var nextPartRe = /(.*?)(?:[\/\\]+|$)/g; + } else { + var nextPartRe = /(.*?)(?:[\/]+|$)/g; + } + if (isWindows) { + var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/; + } else { + var splitRootRe = /^[\/]*/; + } + exports2.realpathSync = function realpathSync(p, cache) { + p = pathModule.resolve(p); + if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { + return cache[p]; + } + var original = p, seenLinks = {}, knownHard = {}; + var pos; + var current; + var base; + var previous; + start(); + function start() { + var m = splitRootRe.exec(p); + pos = m[0].length; + current = m[0]; + base = m[0]; + previous = ""; + if (isWindows && !knownHard[base]) { + fs.lstatSync(base); + knownHard[base] = true; + } + } + while (pos < p.length) { + nextPartRe.lastIndex = pos; + var result = nextPartRe.exec(p); + previous = current; + current += result[0]; + base = previous + result[1]; + pos = nextPartRe.lastIndex; + if (knownHard[base] || cache && cache[base] === base) { + continue; + } + var resolvedLink; + if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { + resolvedLink = cache[base]; + } else { + var stat = fs.lstatSync(base); + if (!stat.isSymbolicLink()) { + knownHard[base] = true; + if (cache) + cache[base] = base; + continue; + } + var linkTarget = null; + if (!isWindows) { + var id = stat.dev.toString(32) + ":" + stat.ino.toString(32); + if (seenLinks.hasOwnProperty(id)) { + linkTarget = seenLinks[id]; + } + } + if (linkTarget === null) { + fs.statSync(base); + linkTarget = fs.readlinkSync(base); + } + resolvedLink = pathModule.resolve(previous, linkTarget); + if (cache) + cache[base] = resolvedLink; + if (!isWindows) + seenLinks[id] = linkTarget; + } + p = pathModule.resolve(resolvedLink, p.slice(pos)); + start(); + } + if (cache) + cache[original] = p; + return p; + }; + exports2.realpath = function realpath(p, cache, cb) { + if (typeof cb !== "function") { + cb = maybeCallback(cache); + cache = null; + } + p = pathModule.resolve(p); + if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { + return process.nextTick(cb.bind(null, null, cache[p])); + } + var original = p, seenLinks = {}, knownHard = {}; + var pos; + var current; + var base; + var previous; + start(); + function start() { + var m = splitRootRe.exec(p); + pos = m[0].length; + current = m[0]; + base = m[0]; + previous = ""; + if (isWindows && !knownHard[base]) { + fs.lstat(base, function(err) { + if (err) + return cb(err); + knownHard[base] = true; + LOOP(); + }); + } else { + process.nextTick(LOOP); + } + } + function LOOP() { + if (pos >= p.length) { + if (cache) + cache[original] = p; + return cb(null, p); + } + nextPartRe.lastIndex = pos; + var result = nextPartRe.exec(p); + previous = current; + current += result[0]; + base = previous + result[1]; + pos = nextPartRe.lastIndex; + if (knownHard[base] || cache && cache[base] === base) { + return process.nextTick(LOOP); + } + if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { + return gotResolvedLink(cache[base]); + } + return fs.lstat(base, gotStat); + } + function gotStat(err, stat) { + if (err) + return cb(err); + if (!stat.isSymbolicLink()) { + knownHard[base] = true; + if (cache) + cache[base] = base; + return process.nextTick(LOOP); + } + if (!isWindows) { + var id = stat.dev.toString(32) + ":" + stat.ino.toString(32); + if (seenLinks.hasOwnProperty(id)) { + return gotTarget(null, seenLinks[id], base); + } + } + fs.stat(base, function(err2) { + if (err2) + return cb(err2); + fs.readlink(base, function(err3, target) { + if (!isWindows) + seenLinks[id] = target; + gotTarget(err3, target); + }); + }); + } + function gotTarget(err, target, base2) { + if (err) + return cb(err); + var resolvedLink = pathModule.resolve(previous, target); + if (cache) + cache[base2] = resolvedLink; + gotResolvedLink(resolvedLink); + } + function gotResolvedLink(resolvedLink) { + p = pathModule.resolve(resolvedLink, p.slice(pos)); + start(); + } + }; + }, + function(module2, exports2, __webpack_require__) { + module2.exports = globSync; + globSync.GlobSync = GlobSync; + var fs = __webpack_require__(3); + var rp = __webpack_require__(114); + var minimatch = __webpack_require__(60); + var Minimatch = minimatch.Minimatch; + var Glob = __webpack_require__(75).Glob; + var util = __webpack_require__(2); + var path = __webpack_require__(0); + var assert2 = __webpack_require__(22); + var isAbsolute = __webpack_require__(76); + var common = __webpack_require__(115); + var alphasort = common.alphasort; + var alphasorti = common.alphasorti; + var setopts = common.setopts; + var ownProp = common.ownProp; + var childrenIgnored = common.childrenIgnored; + var isIgnored = common.isIgnored; + function globSync(pattern, options) { + if (typeof options === "function" || arguments.length === 3) + throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167"); + return new GlobSync(pattern, options).found; + } + function GlobSync(pattern, options) { + if (!pattern) + throw new Error("must provide pattern"); + if (typeof options === "function" || arguments.length === 3) + throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167"); + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options); + setopts(this, pattern, options); + if (this.noprocess) + return this; + var n = this.minimatch.set.length; + this.matches = new Array(n); + for (var i = 0; i < n; i++) { + this._process(this.minimatch.set[i], i, false); + } + this._finish(); + } + GlobSync.prototype._finish = function() { + assert2(this instanceof GlobSync); + if (this.realpath) { + var self2 = this; + this.matches.forEach(function(matchset, index) { + var set = self2.matches[index] = /* @__PURE__ */ Object.create(null); + for (var p in matchset) { + try { + p = self2._makeAbs(p); + var real = rp.realpathSync(p, self2.realpathCache); + set[real] = true; + } catch (er) { + if (er.syscall === "stat") + set[self2._makeAbs(p)] = true; + else + throw er; + } + } + }); + } + common.finish(this); + }; + GlobSync.prototype._process = function(pattern, index, inGlobStar) { + assert2(this instanceof GlobSync); + var n = 0; + while (typeof pattern[n] === "string") { + n++; + } + var prefix; + switch (n) { + case pattern.length: + this._processSimple(pattern.join("/"), index); + return; + case 0: + prefix = null; + break; + default: + prefix = pattern.slice(0, n).join("/"); + break; + } + var remain = pattern.slice(n); + var read; + if (prefix === null) + read = "."; + else if (isAbsolute(prefix) || isAbsolute(pattern.join("/"))) { + if (!prefix || !isAbsolute(prefix)) + prefix = "/" + prefix; + read = prefix; + } else + read = prefix; + var abs = this._makeAbs(read); + if (childrenIgnored(this, read)) + return; + var isGlobStar = remain[0] === minimatch.GLOBSTAR; + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar); + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar); + }; + GlobSync.prototype._processReaddir = function(prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar); + if (!entries) + return; + var pn = remain[0]; + var negate = !!this.minimatch.negate; + var rawGlob = pn._glob; + var dotOk = this.dot || rawGlob.charAt(0) === "."; + var matchedEntries = []; + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (e.charAt(0) !== "." || dotOk) { + var m; + if (negate && !prefix) { + m = !e.match(pn); + } else { + m = e.match(pn); + } + if (m) + matchedEntries.push(e); + } + } + var len = matchedEntries.length; + if (len === 0) + return; + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = /* @__PURE__ */ Object.create(null); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + if (prefix) { + if (prefix.slice(-1) !== "/") + e = prefix + "/" + e; + else + e = prefix + e; + } + if (e.charAt(0) === "/" && !this.nomount) { + e = path.join(this.root, e); + } + this._emitMatch(index, e); + } + return; + } + remain.shift(); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + var newPattern; + if (prefix) + newPattern = [prefix, e]; + else + newPattern = [e]; + this._process(newPattern.concat(remain), index, inGlobStar); + } + }; + GlobSync.prototype._emitMatch = function(index, e) { + if (isIgnored(this, e)) + return; + var abs = this._makeAbs(e); + if (this.mark) + e = this._mark(e); + if (this.absolute) { + e = abs; + } + if (this.matches[index][e]) + return; + if (this.nodir) { + var c = this.cache[abs]; + if (c === "DIR" || Array.isArray(c)) + return; + } + this.matches[index][e] = true; + if (this.stat) + this._stat(e); + }; + GlobSync.prototype._readdirInGlobStar = function(abs) { + if (this.follow) + return this._readdir(abs, false); + var entries; + var lstat; + var stat; + try { + lstat = fs.lstatSync(abs); + } catch (er) { + if (er.code === "ENOENT") { + return null; + } + } + var isSym = lstat && lstat.isSymbolicLink(); + this.symlinks[abs] = isSym; + if (!isSym && lstat && !lstat.isDirectory()) + this.cache[abs] = "FILE"; + else + entries = this._readdir(abs, false); + return entries; + }; + GlobSync.prototype._readdir = function(abs, inGlobStar) { + var entries; + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs); + if (ownProp(this.cache, abs)) { + var c = this.cache[abs]; + if (!c || c === "FILE") + return null; + if (Array.isArray(c)) + return c; + } + try { + return this._readdirEntries(abs, fs.readdirSync(abs)); + } catch (er) { + this._readdirError(abs, er); + return null; + } + }; + GlobSync.prototype._readdirEntries = function(abs, entries) { + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (abs === "/") + e = abs + e; + else + e = abs + "/" + e; + this.cache[e] = true; + } + } + this.cache[abs] = entries; + return entries; + }; + GlobSync.prototype._readdirError = function(f, er) { + switch (er.code) { + case "ENOTSUP": + case "ENOTDIR": + var abs = this._makeAbs(f); + this.cache[abs] = "FILE"; + if (abs === this.cwdAbs) { + var error = new Error(er.code + " invalid cwd " + this.cwd); + error.path = this.cwd; + error.code = er.code; + throw error; + } + break; + case "ENOENT": + case "ELOOP": + case "ENAMETOOLONG": + case "UNKNOWN": + this.cache[this._makeAbs(f)] = false; + break; + default: + this.cache[this._makeAbs(f)] = false; + if (this.strict) + throw er; + if (!this.silent) + console.error("glob error", er); + break; + } + }; + GlobSync.prototype._processGlobStar = function(prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar); + if (!entries) + return; + var remainWithoutGlobStar = remain.slice(1); + var gspref = prefix ? [prefix] : []; + var noGlobStar = gspref.concat(remainWithoutGlobStar); + this._process(noGlobStar, index, false); + var len = entries.length; + var isSym = this.symlinks[abs]; + if (isSym && inGlobStar) + return; + for (var i = 0; i < len; i++) { + var e = entries[i]; + if (e.charAt(0) === "." && !this.dot) + continue; + var instead = gspref.concat(entries[i], remainWithoutGlobStar); + this._process(instead, index, true); + var below = gspref.concat(entries[i], remain); + this._process(below, index, true); + } + }; + GlobSync.prototype._processSimple = function(prefix, index) { + var exists = this._stat(prefix); + if (!this.matches[index]) + this.matches[index] = /* @__PURE__ */ Object.create(null); + if (!exists) + return; + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix); + if (prefix.charAt(0) === "/") { + prefix = path.join(this.root, prefix); + } else { + prefix = path.resolve(this.root, prefix); + if (trail) + prefix += "/"; + } + } + if (process.platform === "win32") + prefix = prefix.replace(/\\/g, "/"); + this._emitMatch(index, prefix); + }; + GlobSync.prototype._stat = function(f) { + var abs = this._makeAbs(f); + var needDir = f.slice(-1) === "/"; + if (f.length > this.maxLength) + return false; + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs]; + if (Array.isArray(c)) + c = "DIR"; + if (!needDir || c === "DIR") + return c; + if (needDir && c === "FILE") + return false; + } + var exists; + var stat = this.statCache[abs]; + if (!stat) { + var lstat; + try { + lstat = fs.lstatSync(abs); + } catch (er) { + if (er && (er.code === "ENOENT" || er.code === "ENOTDIR")) { + this.statCache[abs] = false; + return false; + } + } + if (lstat && lstat.isSymbolicLink()) { + try { + stat = fs.statSync(abs); + } catch (er) { + stat = lstat; + } + } else { + stat = lstat; + } + } + this.statCache[abs] = stat; + var c = true; + if (stat) + c = stat.isDirectory() ? "DIR" : "FILE"; + this.cache[abs] = this.cache[abs] || c; + if (needDir && c === "FILE") + return false; + return c; + }; + GlobSync.prototype._mark = function(p) { + return common.mark(this, p); + }; + GlobSync.prototype._makeAbs = function(f) { + return common.makeAbs(this, f); + }; + }, + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + module2.exports = function(flag, argv) { + argv = argv || process.argv; + var terminatorPos = argv.indexOf("--"); + var prefix = /^--/.test(flag) ? "" : "--"; + var pos = argv.indexOf(prefix + flag); + return pos !== -1 && (terminatorPos !== -1 ? pos < terminatorPos : true); + }; + }, + , + function(module2, exports2, __webpack_require__) { + var wrappy = __webpack_require__(123); + var reqs = /* @__PURE__ */ Object.create(null); + var once = __webpack_require__(61); + module2.exports = wrappy(inflight); + function inflight(key, cb) { + if (reqs[key]) { + reqs[key].push(cb); + return null; + } else { + reqs[key] = [cb]; + return makeres(key); + } + } + function makeres(key) { + return once(function RES() { + var cbs = reqs[key]; + var len = cbs.length; + var args = slice(arguments); + try { + for (var i = 0; i < len; i++) { + cbs[i].apply(null, args); + } + } finally { + if (cbs.length > len) { + cbs.splice(0, len); + process.nextTick(function() { + RES.apply(null, args); + }); + } else { + delete reqs[key]; + } + } + }); + } + function slice(args) { + var length = args.length; + var array = []; + for (var i = 0; i < length; i++) + array[i] = args[i]; + return array; + } + }, + function(module2, exports2) { + if (typeof Object.create === "function") { + module2.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; + } else { + module2.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function() { + }; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + }; + } + }, + , + , + function(module2, exports2, __webpack_require__) { + module2.exports = typeof __webpack_require__ !== "undefined"; + }, + , + function(module2, exports2) { + var s = 1e3; + var m = s * 60; + var h = m * 60; + var d = h * 24; + var y = d * 365.25; + module2.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === "string" && val.length > 0) { + return parse3(val); + } else if (type === "number" && isNaN(val) === false) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + "val is not a non-empty string or a valid number. val=" + JSON.stringify(val) + ); + }; + function parse3(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || "ms").toLowerCase(); + switch (type) { + case "years": + case "year": + case "yrs": + case "yr": + case "y": + return n * y; + case "days": + case "day": + case "d": + return n * d; + case "hours": + case "hour": + case "hrs": + case "hr": + case "h": + return n * h; + case "minutes": + case "minute": + case "mins": + case "min": + case "m": + return n * m; + case "seconds": + case "second": + case "secs": + case "sec": + case "s": + return n * s; + case "milliseconds": + case "millisecond": + case "msecs": + case "msec": + case "ms": + return n; + default: + return void 0; + } + } + function fmtShort(ms) { + if (ms >= d) { + return Math.round(ms / d) + "d"; + } + if (ms >= h) { + return Math.round(ms / h) + "h"; + } + if (ms >= m) { + return Math.round(ms / m) + "m"; + } + if (ms >= s) { + return Math.round(ms / s) + "s"; + } + return ms + "ms"; + } + function fmtLong(ms) { + return plural(ms, d, "day") || plural(ms, h, "hour") || plural(ms, m, "minute") || plural(ms, s, "second") || ms + " ms"; + } + function plural(ms, n, name) { + if (ms < n) { + return; + } + if (ms < n * 1.5) { + return Math.floor(ms / n) + " " + name; + } + return Math.ceil(ms / n) + " " + name + "s"; + } + }, + , + , + , + function(module2, exports2, __webpack_require__) { + module2.exports = rimraf; + rimraf.sync = rimrafSync; + var assert2 = __webpack_require__(22); + var path = __webpack_require__(0); + var fs = __webpack_require__(3); + var glob = __webpack_require__(75); + var _0666 = parseInt("666", 8); + var defaultGlobOpts = { + nosort: true, + silent: true + }; + var timeout = 0; + var isWindows = process.platform === "win32"; + function defaults(options) { + var methods = [ + "unlink", + "chmod", + "stat", + "lstat", + "rmdir", + "readdir" + ]; + methods.forEach(function(m) { + options[m] = options[m] || fs[m]; + m = m + "Sync"; + options[m] = options[m] || fs[m]; + }); + options.maxBusyTries = options.maxBusyTries || 3; + options.emfileWait = options.emfileWait || 1e3; + if (options.glob === false) { + options.disableGlob = true; + } + options.disableGlob = options.disableGlob || false; + options.glob = options.glob || defaultGlobOpts; + } + function rimraf(p, options, cb) { + if (typeof options === "function") { + cb = options; + options = {}; + } + assert2(p, "rimraf: missing path"); + assert2.equal(typeof p, "string", "rimraf: path should be a string"); + assert2.equal(typeof cb, "function", "rimraf: callback function required"); + assert2(options, "rimraf: invalid options argument provided"); + assert2.equal(typeof options, "object", "rimraf: options should be object"); + defaults(options); + var busyTries = 0; + var errState = null; + var n = 0; + if (options.disableGlob || !glob.hasMagic(p)) + return afterGlob(null, [p]); + options.lstat(p, function(er, stat) { + if (!er) + return afterGlob(null, [p]); + glob(p, options.glob, afterGlob); + }); + function next(er) { + errState = errState || er; + if (--n === 0) + cb(errState); + } + function afterGlob(er, results) { + if (er) + return cb(er); + n = results.length; + if (n === 0) + return cb(); + results.forEach(function(p2) { + rimraf_(p2, options, function CB(er2) { + if (er2) { + if ((er2.code === "EBUSY" || er2.code === "ENOTEMPTY" || er2.code === "EPERM") && busyTries < options.maxBusyTries) { + busyTries++; + var time = busyTries * 100; + return setTimeout(function() { + rimraf_(p2, options, CB); + }, time); + } + if (er2.code === "EMFILE" && timeout < options.emfileWait) { + return setTimeout(function() { + rimraf_(p2, options, CB); + }, timeout++); + } + if (er2.code === "ENOENT") + er2 = null; + } + timeout = 0; + next(er2); + }); + }); + } + } + function rimraf_(p, options, cb) { + assert2(p); + assert2(options); + assert2(typeof cb === "function"); + options.lstat(p, function(er, st) { + if (er && er.code === "ENOENT") + return cb(null); + if (er && er.code === "EPERM" && isWindows) + fixWinEPERM(p, options, er, cb); + if (st && st.isDirectory()) + return rmdir(p, options, er, cb); + options.unlink(p, function(er2) { + if (er2) { + if (er2.code === "ENOENT") + return cb(null); + if (er2.code === "EPERM") + return isWindows ? fixWinEPERM(p, options, er2, cb) : rmdir(p, options, er2, cb); + if (er2.code === "EISDIR") + return rmdir(p, options, er2, cb); + } + return cb(er2); + }); + }); + } + function fixWinEPERM(p, options, er, cb) { + assert2(p); + assert2(options); + assert2(typeof cb === "function"); + if (er) + assert2(er instanceof Error); + options.chmod(p, _0666, function(er2) { + if (er2) + cb(er2.code === "ENOENT" ? null : er); + else + options.stat(p, function(er3, stats) { + if (er3) + cb(er3.code === "ENOENT" ? null : er); + else if (stats.isDirectory()) + rmdir(p, options, er, cb); + else + options.unlink(p, cb); + }); + }); + } + function fixWinEPERMSync(p, options, er) { + assert2(p); + assert2(options); + if (er) + assert2(er instanceof Error); + try { + options.chmodSync(p, _0666); + } catch (er2) { + if (er2.code === "ENOENT") + return; + else + throw er; + } + try { + var stats = options.statSync(p); + } catch (er3) { + if (er3.code === "ENOENT") + return; + else + throw er; + } + if (stats.isDirectory()) + rmdirSync(p, options, er); + else + options.unlinkSync(p); + } + function rmdir(p, options, originalEr, cb) { + assert2(p); + assert2(options); + if (originalEr) + assert2(originalEr instanceof Error); + assert2(typeof cb === "function"); + options.rmdir(p, function(er) { + if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) + rmkids(p, options, cb); + else if (er && er.code === "ENOTDIR") + cb(originalEr); + else + cb(er); + }); + } + function rmkids(p, options, cb) { + assert2(p); + assert2(options); + assert2(typeof cb === "function"); + options.readdir(p, function(er, files) { + if (er) + return cb(er); + var n = files.length; + if (n === 0) + return options.rmdir(p, cb); + var errState; + files.forEach(function(f) { + rimraf(path.join(p, f), options, function(er2) { + if (errState) + return; + if (er2) + return cb(errState = er2); + if (--n === 0) + options.rmdir(p, cb); + }); + }); + }); + } + function rimrafSync(p, options) { + options = options || {}; + defaults(options); + assert2(p, "rimraf: missing path"); + assert2.equal(typeof p, "string", "rimraf: path should be a string"); + assert2(options, "rimraf: missing options"); + assert2.equal(typeof options, "object", "rimraf: options should be object"); + var results; + if (options.disableGlob || !glob.hasMagic(p)) { + results = [p]; + } else { + try { + options.lstatSync(p); + results = [p]; + } catch (er) { + results = glob.sync(p, options.glob); + } + } + if (!results.length) + return; + for (var i = 0; i < results.length; i++) { + var p = results[i]; + try { + var st = options.lstatSync(p); + } catch (er) { + if (er.code === "ENOENT") + return; + if (er.code === "EPERM" && isWindows) + fixWinEPERMSync(p, options, er); + } + try { + if (st && st.isDirectory()) + rmdirSync(p, options, null); + else + options.unlinkSync(p); + } catch (er) { + if (er.code === "ENOENT") + return; + if (er.code === "EPERM") + return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er); + if (er.code !== "EISDIR") + throw er; + rmdirSync(p, options, er); + } + } + } + function rmdirSync(p, options, originalEr) { + assert2(p); + assert2(options); + if (originalEr) + assert2(originalEr instanceof Error); + try { + options.rmdirSync(p); + } catch (er) { + if (er.code === "ENOENT") + return; + if (er.code === "ENOTDIR") + throw originalEr; + if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") + rmkidsSync(p, options); + } + } + function rmkidsSync(p, options) { + assert2(p); + assert2(options); + options.readdirSync(p).forEach(function(f) { + rimrafSync(path.join(p, f), options); + }); + var retries = isWindows ? 100 : 1; + var i = 0; + do { + var threw = true; + try { + var ret = options.rmdirSync(p, options); + threw = false; + return ret; + } finally { + if (++i < retries && threw) + continue; + } + } while (true); + } + }, + , + , + , + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + var hasFlag3 = __webpack_require__(221); + var support = function(level) { + if (level === 0) { + return false; + } + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; + }; + var supportLevel = function() { + if (hasFlag3("no-color") || hasFlag3("no-colors") || hasFlag3("color=false")) { + return 0; + } + if (hasFlag3("color=16m") || hasFlag3("color=full") || hasFlag3("color=truecolor")) { + return 3; + } + if (hasFlag3("color=256")) { + return 2; + } + if (hasFlag3("color") || hasFlag3("colors") || hasFlag3("color=true") || hasFlag3("color=always")) { + return 1; + } + if (process.stdout && !process.stdout.isTTY) { + return 0; + } + if (process.platform === "win32") { + return 1; + } + if ("CI" in process.env) { + if ("TRAVIS" in process.env || process.env.CI === "Travis") { + return 1; + } + return 0; + } + if ("TEAMCITY_VERSION" in process.env) { + return process.env.TEAMCITY_VERSION.match(/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/) === null ? 0 : 1; + } + if (/^(screen|xterm)-256(?:color)?/.test(process.env.TERM)) { + return 2; + } + if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) { + return 1; + } + if ("COLORTERM" in process.env) { + return 1; + } + if (process.env.TERM === "dumb") { + return 0; + } + return 0; + }(); + if (supportLevel === 0 && "FORCE_COLOR" in process.env) { + supportLevel = 1; + } + module2.exports = process && support(supportLevel); + } + ]); + } +}); + +// +var require_identity = __commonJS({ + ""(exports) { + "use strict"; + var ALIAS = Symbol.for("yaml.alias"); + var DOC = Symbol.for("yaml.document"); + var MAP = Symbol.for("yaml.map"); + var PAIR = Symbol.for("yaml.pair"); + var SCALAR = Symbol.for("yaml.scalar"); + var SEQ = Symbol.for("yaml.seq"); + var NODE_TYPE = Symbol.for("yaml.node.type"); + var isAlias = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === ALIAS; + var isDocument = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === DOC; + var isMap = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === MAP; + var isPair = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === PAIR; + var isScalar = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === SCALAR; + var isSeq = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === SEQ; + function isCollection(node) { + if (node && typeof node === "object") + switch (node[NODE_TYPE]) { + case MAP: + case SEQ: + return true; + } + return false; + } + function isNode(node) { + if (node && typeof node === "object") + switch (node[NODE_TYPE]) { + case ALIAS: + case MAP: + case SCALAR: + case SEQ: + return true; + } + return false; + } + var hasAnchor = (node) => (isScalar(node) || isCollection(node)) && !!node.anchor; + exports.ALIAS = ALIAS; + exports.DOC = DOC; + exports.MAP = MAP; + exports.NODE_TYPE = NODE_TYPE; + exports.PAIR = PAIR; + exports.SCALAR = SCALAR; + exports.SEQ = SEQ; + exports.hasAnchor = hasAnchor; + exports.isAlias = isAlias; + exports.isCollection = isCollection; + exports.isDocument = isDocument; + exports.isMap = isMap; + exports.isNode = isNode; + exports.isPair = isPair; + exports.isScalar = isScalar; + exports.isSeq = isSeq; + } +}); + +// +var require_visit = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var BREAK = Symbol("break visit"); + var SKIP = Symbol("skip children"); + var REMOVE = Symbol("remove node"); + function visit(node, visitor) { + const visitor_ = initVisitor(visitor); + if (identity.isDocument(node)) { + const cd = visit_(null, node.contents, visitor_, Object.freeze([node])); + if (cd === REMOVE) + node.contents = null; + } else + visit_(null, node, visitor_, Object.freeze([])); + } + visit.BREAK = BREAK; + visit.SKIP = SKIP; + visit.REMOVE = REMOVE; + function visit_(key, node, visitor, path) { + const ctrl = callVisitor(key, node, visitor, path); + if (identity.isNode(ctrl) || identity.isPair(ctrl)) { + replaceNode(key, path, ctrl); + return visit_(key, ctrl, visitor, path); + } + if (typeof ctrl !== "symbol") { + if (identity.isCollection(node)) { + path = Object.freeze(path.concat(node)); + for (let i = 0; i < node.items.length; ++i) { + const ci = visit_(i, node.items[i], visitor, path); + if (typeof ci === "number") + i = ci - 1; + else if (ci === BREAK) + return BREAK; + else if (ci === REMOVE) { + node.items.splice(i, 1); + i -= 1; + } + } + } else if (identity.isPair(node)) { + path = Object.freeze(path.concat(node)); + const ck = visit_("key", node.key, visitor, path); + if (ck === BREAK) + return BREAK; + else if (ck === REMOVE) + node.key = null; + const cv = visit_("value", node.value, visitor, path); + if (cv === BREAK) + return BREAK; + else if (cv === REMOVE) + node.value = null; + } + } + return ctrl; + } + async function visitAsync(node, visitor) { + const visitor_ = initVisitor(visitor); + if (identity.isDocument(node)) { + const cd = await visitAsync_(null, node.contents, visitor_, Object.freeze([node])); + if (cd === REMOVE) + node.contents = null; + } else + await visitAsync_(null, node, visitor_, Object.freeze([])); + } + visitAsync.BREAK = BREAK; + visitAsync.SKIP = SKIP; + visitAsync.REMOVE = REMOVE; + async function visitAsync_(key, node, visitor, path) { + const ctrl = await callVisitor(key, node, visitor, path); + if (identity.isNode(ctrl) || identity.isPair(ctrl)) { + replaceNode(key, path, ctrl); + return visitAsync_(key, ctrl, visitor, path); + } + if (typeof ctrl !== "symbol") { + if (identity.isCollection(node)) { + path = Object.freeze(path.concat(node)); + for (let i = 0; i < node.items.length; ++i) { + const ci = await visitAsync_(i, node.items[i], visitor, path); + if (typeof ci === "number") + i = ci - 1; + else if (ci === BREAK) + return BREAK; + else if (ci === REMOVE) { + node.items.splice(i, 1); + i -= 1; + } + } + } else if (identity.isPair(node)) { + path = Object.freeze(path.concat(node)); + const ck = await visitAsync_("key", node.key, visitor, path); + if (ck === BREAK) + return BREAK; + else if (ck === REMOVE) + node.key = null; + const cv = await visitAsync_("value", node.value, visitor, path); + if (cv === BREAK) + return BREAK; + else if (cv === REMOVE) + node.value = null; + } + } + return ctrl; + } + function initVisitor(visitor) { + if (typeof visitor === "object" && (visitor.Collection || visitor.Node || visitor.Value)) { + return Object.assign({ + Alias: visitor.Node, + Map: visitor.Node, + Scalar: visitor.Node, + Seq: visitor.Node + }, visitor.Value && { + Map: visitor.Value, + Scalar: visitor.Value, + Seq: visitor.Value + }, visitor.Collection && { + Map: visitor.Collection, + Seq: visitor.Collection + }, visitor); + } + return visitor; + } + function callVisitor(key, node, visitor, path) { + var _a, _b, _c, _d, _e; + if (typeof visitor === "function") + return visitor(key, node, path); + if (identity.isMap(node)) + return (_a = visitor.Map) == null ? void 0 : _a.call(visitor, key, node, path); + if (identity.isSeq(node)) + return (_b = visitor.Seq) == null ? void 0 : _b.call(visitor, key, node, path); + if (identity.isPair(node)) + return (_c = visitor.Pair) == null ? void 0 : _c.call(visitor, key, node, path); + if (identity.isScalar(node)) + return (_d = visitor.Scalar) == null ? void 0 : _d.call(visitor, key, node, path); + if (identity.isAlias(node)) + return (_e = visitor.Alias) == null ? void 0 : _e.call(visitor, key, node, path); + return void 0; + } + function replaceNode(key, path, node) { + const parent = path[path.length - 1]; + if (identity.isCollection(parent)) { + parent.items[key] = node; + } else if (identity.isPair(parent)) { + if (key === "key") + parent.key = node; + else + parent.value = node; + } else if (identity.isDocument(parent)) { + parent.contents = node; + } else { + const pt = identity.isAlias(parent) ? "alias" : "scalar"; + throw new Error(`Cannot replace node with ${pt} parent`); + } + } + exports.visit = visit; + exports.visitAsync = visitAsync; + } +}); + +// +var require_directives = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var visit = require_visit(); + var escapeChars = { + "!": "%21", + ",": "%2C", + "[": "%5B", + "]": "%5D", + "{": "%7B", + "}": "%7D" + }; + var escapeTagName = (tn) => tn.replace(/[!,[\]{}]/g, (ch) => escapeChars[ch]); + var Directives = class { + constructor(yaml, tags) { + this.docStart = null; + this.docEnd = false; + this.yaml = Object.assign({}, Directives.defaultYaml, yaml); + this.tags = Object.assign({}, Directives.defaultTags, tags); + } + clone() { + const copy = new Directives(this.yaml, this.tags); + copy.docStart = this.docStart; + return copy; + } + atDocument() { + const res = new Directives(this.yaml, this.tags); + switch (this.yaml.version) { + case "1.1": + this.atNextDocument = true; + break; + case "1.2": + this.atNextDocument = false; + this.yaml = { + explicit: Directives.defaultYaml.explicit, + version: "1.2" + }; + this.tags = Object.assign({}, Directives.defaultTags); + break; + } + return res; + } + add(line, onError) { + if (this.atNextDocument) { + this.yaml = { explicit: Directives.defaultYaml.explicit, version: "1.1" }; + this.tags = Object.assign({}, Directives.defaultTags); + this.atNextDocument = false; + } + const parts = line.trim().split(/[ \t]+/); + const name = parts.shift(); + switch (name) { + case "%TAG": { + if (parts.length !== 2) { + onError(0, "%TAG directive should contain exactly two parts"); + if (parts.length < 2) + return false; + } + const [handle, prefix] = parts; + this.tags[handle] = prefix; + return true; + } + case "%YAML": { + this.yaml.explicit = true; + if (parts.length !== 1) { + onError(0, "%YAML directive should contain exactly one part"); + return false; + } + const [version] = parts; + if (version === "1.1" || version === "1.2") { + this.yaml.version = version; + return true; + } else { + const isValid = /^\d+\.\d+$/.test(version); + onError(6, `Unsupported YAML version ${version}`, isValid); + return false; + } + } + default: + onError(0, `Unknown directive ${name}`, true); + return false; + } + } + tagName(source, onError) { + if (source === "!") + return "!"; + if (source[0] !== "!") { + onError(`Not a valid tag: ${source}`); + return null; + } + if (source[1] === "<") { + const verbatim = source.slice(2, -1); + if (verbatim === "!" || verbatim === "!!") { + onError(`Verbatim tags aren't resolved, so ${source} is invalid.`); + return null; + } + if (source[source.length - 1] !== ">") + onError("Verbatim tags must end with a >"); + return verbatim; + } + const [, handle, suffix] = source.match(/^(.*!)([^!]*)$/s); + if (!suffix) + onError(`The ${source} tag has no suffix`); + const prefix = this.tags[handle]; + if (prefix) { + try { + return prefix + decodeURIComponent(suffix); + } catch (error) { + onError(String(error)); + return null; + } + } + if (handle === "!") + return source; + onError(`Could not resolve tag: ${source}`); + return null; + } + tagString(tag) { + for (const [handle, prefix] of Object.entries(this.tags)) { + if (tag.startsWith(prefix)) + return handle + escapeTagName(tag.substring(prefix.length)); + } + return tag[0] === "!" ? tag : `!<${tag}>`; + } + toString(doc) { + const lines = this.yaml.explicit ? [`%YAML ${this.yaml.version || "1.2"}`] : []; + const tagEntries = Object.entries(this.tags); + let tagNames; + if (doc && tagEntries.length > 0 && identity.isNode(doc.contents)) { + const tags = {}; + visit.visit(doc.contents, (_key, node) => { + if (identity.isNode(node) && node.tag) + tags[node.tag] = true; + }); + tagNames = Object.keys(tags); + } else + tagNames = []; + for (const [handle, prefix] of tagEntries) { + if (handle === "!!" && prefix === "tag:yaml.org,2002:") + continue; + if (!doc || tagNames.some((tn) => tn.startsWith(prefix))) + lines.push(`%TAG ${handle} ${prefix}`); + } + return lines.join("\n"); + } + }; + Directives.defaultYaml = { explicit: false, version: "1.2" }; + Directives.defaultTags = { "!!": "tag:yaml.org,2002:" }; + exports.Directives = Directives; + } +}); + +// +var require_anchors = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var visit = require_visit(); + function anchorIsValid(anchor) { + if (/[\x00-\x19\s,[\]{}]/.test(anchor)) { + const sa = JSON.stringify(anchor); + const msg = `Anchor must not contain whitespace or control characters: ${sa}`; + throw new Error(msg); + } + return true; + } + function anchorNames(root) { + const anchors = /* @__PURE__ */ new Set(); + visit.visit(root, { + Value(_key, node) { + if (node.anchor) + anchors.add(node.anchor); + } + }); + return anchors; + } + function findNewAnchor(prefix, exclude) { + for (let i = 1; true; ++i) { + const name = `${prefix}${i}`; + if (!exclude.has(name)) + return name; + } + } + function createNodeAnchors(doc, prefix) { + const aliasObjects = []; + const sourceObjects = /* @__PURE__ */ new Map(); + let prevAnchors = null; + return { + onAnchor: (source) => { + aliasObjects.push(source); + if (!prevAnchors) + prevAnchors = anchorNames(doc); + const anchor = findNewAnchor(prefix, prevAnchors); + prevAnchors.add(anchor); + return anchor; + }, + setAnchors: () => { + for (const source of aliasObjects) { + const ref = sourceObjects.get(source); + if (typeof ref === "object" && ref.anchor && (identity.isScalar(ref.node) || identity.isCollection(ref.node))) { + ref.node.anchor = ref.anchor; + } else { + const error = new Error("Failed to resolve repeated object (this should not happen)"); + error.source = source; + throw error; + } + } + }, + sourceObjects + }; + } + exports.anchorIsValid = anchorIsValid; + exports.anchorNames = anchorNames; + exports.createNodeAnchors = createNodeAnchors; + exports.findNewAnchor = findNewAnchor; + } +}); + +// +var require_applyReviver = __commonJS({ + ""(exports) { + "use strict"; + function applyReviver(reviver, obj, key, val) { + if (val && typeof val === "object") { + if (Array.isArray(val)) { + for (let i = 0, len = val.length; i < len; ++i) { + const v0 = val[i]; + const v1 = applyReviver(reviver, val, String(i), v0); + if (v1 === void 0) + delete val[i]; + else if (v1 !== v0) + val[i] = v1; + } + } else if (val instanceof Map) { + for (const k of Array.from(val.keys())) { + const v0 = val.get(k); + const v1 = applyReviver(reviver, val, k, v0); + if (v1 === void 0) + val.delete(k); + else if (v1 !== v0) + val.set(k, v1); + } + } else if (val instanceof Set) { + for (const v0 of Array.from(val)) { + const v1 = applyReviver(reviver, val, v0, v0); + if (v1 === void 0) + val.delete(v0); + else if (v1 !== v0) { + val.delete(v0); + val.add(v1); + } + } + } else { + for (const [k, v0] of Object.entries(val)) { + const v1 = applyReviver(reviver, val, k, v0); + if (v1 === void 0) + delete val[k]; + else if (v1 !== v0) + val[k] = v1; + } + } + } + return reviver.call(obj, key, val); + } + exports.applyReviver = applyReviver; + } +}); + +// +var require_toJS = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + function toJS(value, arg, ctx) { + if (Array.isArray(value)) + return value.map((v, i) => toJS(v, String(i), ctx)); + if (value && typeof value.toJSON === "function") { + if (!ctx || !identity.hasAnchor(value)) + return value.toJSON(arg, ctx); + const data = { aliasCount: 0, count: 1, res: void 0 }; + ctx.anchors.set(value, data); + ctx.onCreate = (res2) => { + data.res = res2; + delete ctx.onCreate; + }; + const res = value.toJSON(arg, ctx); + if (ctx.onCreate) + ctx.onCreate(res); + return res; + } + if (typeof value === "bigint" && !(ctx == null ? void 0 : ctx.keep)) + return Number(value); + return value; + } + exports.toJS = toJS; + } +}); + +// +var require_Node = __commonJS({ + ""(exports) { + "use strict"; + var applyReviver = require_applyReviver(); + var identity = require_identity(); + var toJS = require_toJS(); + var NodeBase = class { + constructor(type) { + Object.defineProperty(this, identity.NODE_TYPE, { value: type }); + } + clone() { + const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); + if (this.range) + copy.range = this.range.slice(); + return copy; + } + toJS(doc, { mapAsMap, maxAliasCount, onAnchor, reviver } = {}) { + if (!identity.isDocument(doc)) + throw new TypeError("A document argument is required"); + const ctx = { + anchors: /* @__PURE__ */ new Map(), + doc, + keep: true, + mapAsMap: mapAsMap === true, + mapKeyWarned: false, + maxAliasCount: typeof maxAliasCount === "number" ? maxAliasCount : 100 + }; + const res = toJS.toJS(this, "", ctx); + if (typeof onAnchor === "function") + for (const { count, res: res2 } of ctx.anchors.values()) + onAnchor(res2, count); + return typeof reviver === "function" ? applyReviver.applyReviver(reviver, { "": res }, "", res) : res; + } + }; + exports.NodeBase = NodeBase; + } +}); + +// +var require_Alias = __commonJS({ + ""(exports) { + "use strict"; + var anchors = require_anchors(); + var visit = require_visit(); + var identity = require_identity(); + var Node = require_Node(); + var toJS = require_toJS(); + var Alias = class extends Node.NodeBase { + constructor(source) { + super(identity.ALIAS); + this.source = source; + Object.defineProperty(this, "tag", { + set() { + throw new Error("Alias nodes cannot have tags"); + } + }); + } + resolve(doc) { + let found = void 0; + visit.visit(doc, { + Node: (_key, node) => { + if (node === this) + return visit.visit.BREAK; + if (node.anchor === this.source) + found = node; + } + }); + return found; + } + toJSON(_arg, ctx) { + if (!ctx) + return { source: this.source }; + const { anchors: anchors2, doc, maxAliasCount } = ctx; + const source = this.resolve(doc); + if (!source) { + const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; + throw new ReferenceError(msg); + } + let data = anchors2.get(source); + if (!data) { + toJS.toJS(source, null, ctx); + data = anchors2.get(source); + } + if (!data || data.res === void 0) { + const msg = "This should not happen: Alias anchor was not resolved?"; + throw new ReferenceError(msg); + } + if (maxAliasCount >= 0) { + data.count += 1; + if (data.aliasCount === 0) + data.aliasCount = getAliasCount(doc, source, anchors2); + if (data.count * data.aliasCount > maxAliasCount) { + const msg = "Excessive alias count indicates a resource exhaustion attack"; + throw new ReferenceError(msg); + } + } + return data.res; + } + toString(ctx, _onComment, _onChompKeep) { + const src = `*${this.source}`; + if (ctx) { + anchors.anchorIsValid(this.source); + if (ctx.options.verifyAliasOrder && !ctx.anchors.has(this.source)) { + const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; + throw new Error(msg); + } + if (ctx.implicitKey) + return `${src} `; + } + return src; + } + }; + function getAliasCount(doc, node, anchors2) { + if (identity.isAlias(node)) { + const source = node.resolve(doc); + const anchor = anchors2 && source && anchors2.get(source); + return anchor ? anchor.count * anchor.aliasCount : 0; + } else if (identity.isCollection(node)) { + let count = 0; + for (const item of node.items) { + const c = getAliasCount(doc, item, anchors2); + if (c > count) + count = c; + } + return count; + } else if (identity.isPair(node)) { + const kc = getAliasCount(doc, node.key, anchors2); + const vc = getAliasCount(doc, node.value, anchors2); + return Math.max(kc, vc); + } + return 1; + } + exports.Alias = Alias; + } +}); + +// +var require_Scalar = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Node = require_Node(); + var toJS = require_toJS(); + var isScalarValue = (value) => !value || typeof value !== "function" && typeof value !== "object"; + var Scalar = class extends Node.NodeBase { + constructor(value) { + super(identity.SCALAR); + this.value = value; + } + toJSON(arg, ctx) { + return (ctx == null ? void 0 : ctx.keep) ? this.value : toJS.toJS(this.value, arg, ctx); + } + toString() { + return String(this.value); + } + }; + Scalar.BLOCK_FOLDED = "BLOCK_FOLDED"; + Scalar.BLOCK_LITERAL = "BLOCK_LITERAL"; + Scalar.PLAIN = "PLAIN"; + Scalar.QUOTE_DOUBLE = "QUOTE_DOUBLE"; + Scalar.QUOTE_SINGLE = "QUOTE_SINGLE"; + exports.Scalar = Scalar; + exports.isScalarValue = isScalarValue; + } +}); + +// +var require_createNode = __commonJS({ + ""(exports) { + "use strict"; + var Alias = require_Alias(); + var identity = require_identity(); + var Scalar = require_Scalar(); + var defaultTagPrefix = "tag:yaml.org,2002:"; + function findTagObject(value, tagName, tags) { + if (tagName) { + const match = tags.filter((t) => t.tag === tagName); + const tagObj = match.find((t) => !t.format) ?? match[0]; + if (!tagObj) + throw new Error(`Tag ${tagName} not found`); + return tagObj; + } + return tags.find((t) => { + var _a; + return ((_a = t.identify) == null ? void 0 : _a.call(t, value)) && !t.format; + }); + } + function createNode(value, tagName, ctx) { + var _a, _b, _c; + if (identity.isDocument(value)) + value = value.contents; + if (identity.isNode(value)) + return value; + if (identity.isPair(value)) { + const map = (_b = (_a = ctx.schema[identity.MAP]).createNode) == null ? void 0 : _b.call(_a, ctx.schema, null, ctx); + map.items.push(value); + return map; + } + if (value instanceof String || value instanceof Number || value instanceof Boolean || typeof BigInt !== "undefined" && value instanceof BigInt) { + value = value.valueOf(); + } + const { aliasDuplicateObjects, onAnchor, onTagObj, schema, sourceObjects } = ctx; + let ref = void 0; + if (aliasDuplicateObjects && value && typeof value === "object") { + ref = sourceObjects.get(value); + if (ref) { + if (!ref.anchor) + ref.anchor = onAnchor(value); + return new Alias.Alias(ref.anchor); + } else { + ref = { anchor: null, node: null }; + sourceObjects.set(value, ref); + } + } + if (tagName == null ? void 0 : tagName.startsWith("!!")) + tagName = defaultTagPrefix + tagName.slice(2); + let tagObj = findTagObject(value, tagName, schema.tags); + if (!tagObj) { + if (value && typeof value.toJSON === "function") { + value = value.toJSON(); + } + if (!value || typeof value !== "object") { + const node2 = new Scalar.Scalar(value); + if (ref) + ref.node = node2; + return node2; + } + tagObj = value instanceof Map ? schema[identity.MAP] : Symbol.iterator in Object(value) ? schema[identity.SEQ] : schema[identity.MAP]; + } + if (onTagObj) { + onTagObj(tagObj); + delete ctx.onTagObj; + } + const node = (tagObj == null ? void 0 : tagObj.createNode) ? tagObj.createNode(ctx.schema, value, ctx) : typeof ((_c = tagObj == null ? void 0 : tagObj.nodeClass) == null ? void 0 : _c.from) === "function" ? tagObj.nodeClass.from(ctx.schema, value, ctx) : new Scalar.Scalar(value); + if (tagName) + node.tag = tagName; + else if (!tagObj.default) + node.tag = tagObj.tag; + if (ref) + ref.node = node; + return node; + } + exports.createNode = createNode; + } +}); + +// +var require_Collection = __commonJS({ + ""(exports) { + "use strict"; + var createNode = require_createNode(); + var identity = require_identity(); + var Node = require_Node(); + function collectionFromPath(schema, path, value) { + let v = value; + for (let i = path.length - 1; i >= 0; --i) { + const k = path[i]; + if (typeof k === "number" && Number.isInteger(k) && k >= 0) { + const a = []; + a[k] = v; + v = a; + } else { + v = /* @__PURE__ */ new Map([[k, v]]); + } + } + return createNode.createNode(v, void 0, { + aliasDuplicateObjects: false, + keepUndefined: false, + onAnchor: () => { + throw new Error("This should not happen, please report a bug."); + }, + schema, + sourceObjects: /* @__PURE__ */ new Map() + }); + } + var isEmptyPath = (path) => path == null || typeof path === "object" && !!path[Symbol.iterator]().next().done; + var Collection2 = class extends Node.NodeBase { + constructor(type, schema) { + super(type); + Object.defineProperty(this, "schema", { + value: schema, + configurable: true, + enumerable: false, + writable: true + }); + } + clone(schema) { + const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); + if (schema) + copy.schema = schema; + copy.items = copy.items.map((it) => identity.isNode(it) || identity.isPair(it) ? it.clone(schema) : it); + if (this.range) + copy.range = this.range.slice(); + return copy; + } + addIn(path, value) { + if (isEmptyPath(path)) + this.add(value); + else { + const [key, ...rest] = path; + const node = this.get(key, true); + if (identity.isCollection(node)) + node.addIn(rest, value); + else if (node === void 0 && this.schema) + this.set(key, collectionFromPath(this.schema, rest, value)); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + } + deleteIn(path) { + const [key, ...rest] = path; + if (rest.length === 0) + return this.delete(key); + const node = this.get(key, true); + if (identity.isCollection(node)) + return node.deleteIn(rest); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + getIn(path, keepScalar) { + const [key, ...rest] = path; + const node = this.get(key, true); + if (rest.length === 0) + return !keepScalar && identity.isScalar(node) ? node.value : node; + else + return identity.isCollection(node) ? node.getIn(rest, keepScalar) : void 0; + } + hasAllNullValues(allowScalar) { + return this.items.every((node) => { + if (!identity.isPair(node)) + return false; + const n = node.value; + return n == null || allowScalar && identity.isScalar(n) && n.value == null && !n.commentBefore && !n.comment && !n.tag; + }); + } + hasIn(path) { + const [key, ...rest] = path; + if (rest.length === 0) + return this.has(key); + const node = this.get(key, true); + return identity.isCollection(node) ? node.hasIn(rest) : false; + } + setIn(path, value) { + const [key, ...rest] = path; + if (rest.length === 0) { + this.set(key, value); + } else { + const node = this.get(key, true); + if (identity.isCollection(node)) + node.setIn(rest, value); + else if (node === void 0 && this.schema) + this.set(key, collectionFromPath(this.schema, rest, value)); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + } + }; + exports.Collection = Collection2; + exports.collectionFromPath = collectionFromPath; + exports.isEmptyPath = isEmptyPath; + } +}); + +// +var require_stringifyComment = __commonJS({ + ""(exports) { + "use strict"; + var stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, "#"); + function indentComment(comment, indent) { + if (/^\n+$/.test(comment)) + return comment.substring(1); + return indent ? comment.replace(/^(?! *$)/gm, indent) : comment; + } + var lineComment = (str, indent, comment) => str.endsWith("\n") ? indentComment(comment, indent) : comment.includes("\n") ? "\n" + indentComment(comment, indent) : (str.endsWith(" ") ? "" : " ") + comment; + exports.indentComment = indentComment; + exports.lineComment = lineComment; + exports.stringifyComment = stringifyComment; + } +}); + +// +var require_foldFlowLines = __commonJS({ + ""(exports) { + "use strict"; + var FOLD_FLOW = "flow"; + var FOLD_BLOCK = "block"; + var FOLD_QUOTED = "quoted"; + function foldFlowLines(text, indent, mode = "flow", { indentAtStart, lineWidth = 80, minContentWidth = 20, onFold, onOverflow } = {}) { + if (!lineWidth || lineWidth < 0) + return text; + if (lineWidth < minContentWidth) + minContentWidth = 0; + const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length); + if (text.length <= endStep) + return text; + const folds = []; + const escapedFolds = {}; + let end = lineWidth - indent.length; + if (typeof indentAtStart === "number") { + if (indentAtStart > lineWidth - Math.max(2, minContentWidth)) + folds.push(0); + else + end = lineWidth - indentAtStart; + } + let split = void 0; + let prev = void 0; + let overflow = false; + let i = -1; + let escStart = -1; + let escEnd = -1; + if (mode === FOLD_BLOCK) { + i = consumeMoreIndentedLines(text, i, indent.length); + if (i !== -1) + end = i + endStep; + } + for (let ch; ch = text[i += 1]; ) { + if (mode === FOLD_QUOTED && ch === "\\") { + escStart = i; + switch (text[i + 1]) { + case "x": + i += 3; + break; + case "u": + i += 5; + break; + case "U": + i += 9; + break; + default: + i += 1; + } + escEnd = i; + } + if (ch === "\n") { + if (mode === FOLD_BLOCK) + i = consumeMoreIndentedLines(text, i, indent.length); + end = i + indent.length + endStep; + split = void 0; + } else { + if (ch === " " && prev && prev !== " " && prev !== "\n" && prev !== " ") { + const next = text[i + 1]; + if (next && next !== " " && next !== "\n" && next !== " ") + split = i; + } + if (i >= end) { + if (split) { + folds.push(split); + end = split + endStep; + split = void 0; + } else if (mode === FOLD_QUOTED) { + while (prev === " " || prev === " ") { + prev = ch; + ch = text[i += 1]; + overflow = true; + } + const j = i > escEnd + 1 ? i - 2 : escStart - 1; + if (escapedFolds[j]) + return text; + folds.push(j); + escapedFolds[j] = true; + end = j + endStep; + split = void 0; + } else { + overflow = true; + } + } + } + prev = ch; + } + if (overflow && onOverflow) + onOverflow(); + if (folds.length === 0) + return text; + if (onFold) + onFold(); + let res = text.slice(0, folds[0]); + for (let i2 = 0; i2 < folds.length; ++i2) { + const fold = folds[i2]; + const end2 = folds[i2 + 1] || text.length; + if (fold === 0) + res = ` +${indent}${text.slice(0, end2)}`; + else { + if (mode === FOLD_QUOTED && escapedFolds[fold]) + res += `${text[fold]}\\`; + res += ` +${indent}${text.slice(fold + 1, end2)}`; + } + } + return res; + } + function consumeMoreIndentedLines(text, i, indent) { + let end = i; + let start = i + 1; + let ch = text[start]; + while (ch === " " || ch === " ") { + if (i < start + indent) { + ch = text[++i]; + } else { + do { + ch = text[++i]; + } while (ch && ch !== "\n"); + end = i; + start = i + 1; + ch = text[start]; + } + } + return end; + } + exports.FOLD_BLOCK = FOLD_BLOCK; + exports.FOLD_FLOW = FOLD_FLOW; + exports.FOLD_QUOTED = FOLD_QUOTED; + exports.foldFlowLines = foldFlowLines; + } +}); + +// +var require_stringifyString = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + var foldFlowLines = require_foldFlowLines(); + var getFoldOptions = (ctx, isBlock) => ({ + indentAtStart: isBlock ? ctx.indent.length : ctx.indentAtStart, + lineWidth: ctx.options.lineWidth, + minContentWidth: ctx.options.minContentWidth + }); + var containsDocumentMarker = (str) => /^(%|---|\.\.\.)/m.test(str); + function lineLengthOverLimit(str, lineWidth, indentLength) { + if (!lineWidth || lineWidth < 0) + return false; + const limit = lineWidth - indentLength; + const strLen = str.length; + if (strLen <= limit) + return false; + for (let i = 0, start = 0; i < strLen; ++i) { + if (str[i] === "\n") { + if (i - start > limit) + return true; + start = i + 1; + if (strLen - start <= limit) + return false; + } + } + return true; + } + function doubleQuotedString(value, ctx) { + const json = JSON.stringify(value); + if (ctx.options.doubleQuotedAsJSON) + return json; + const { implicitKey } = ctx; + const minMultiLineLength = ctx.options.doubleQuotedMinMultiLineLength; + const indent = ctx.indent || (containsDocumentMarker(value) ? " " : ""); + let str = ""; + let start = 0; + for (let i = 0, ch = json[i]; ch; ch = json[++i]) { + if (ch === " " && json[i + 1] === "\\" && json[i + 2] === "n") { + str += json.slice(start, i) + "\\ "; + i += 1; + start = i; + ch = "\\"; + } + if (ch === "\\") + switch (json[i + 1]) { + case "u": + { + str += json.slice(start, i); + const code = json.substr(i + 2, 4); + switch (code) { + case "0000": + str += "\\0"; + break; + case "0007": + str += "\\a"; + break; + case "000b": + str += "\\v"; + break; + case "001b": + str += "\\e"; + break; + case "0085": + str += "\\N"; + break; + case "00a0": + str += "\\_"; + break; + case "2028": + str += "\\L"; + break; + case "2029": + str += "\\P"; + break; + default: + if (code.substr(0, 2) === "00") + str += "\\x" + code.substr(2); + else + str += json.substr(i, 6); + } + i += 5; + start = i + 1; + } + break; + case "n": + if (implicitKey || json[i + 2] === '"' || json.length < minMultiLineLength) { + i += 1; + } else { + str += json.slice(start, i) + "\n\n"; + while (json[i + 2] === "\\" && json[i + 3] === "n" && json[i + 4] !== '"') { + str += "\n"; + i += 2; + } + str += indent; + if (json[i + 2] === " ") + str += "\\"; + i += 1; + start = i + 1; + } + break; + default: + i += 1; + } + } + str = start ? str + json.slice(start) : json; + return implicitKey ? str : foldFlowLines.foldFlowLines(str, indent, foldFlowLines.FOLD_QUOTED, getFoldOptions(ctx, false)); + } + function singleQuotedString(value, ctx) { + if (ctx.options.singleQuote === false || ctx.implicitKey && value.includes("\n") || /[ \t]\n|\n[ \t]/.test(value)) + return doubleQuotedString(value, ctx); + const indent = ctx.indent || (containsDocumentMarker(value) ? " " : ""); + const res = "'" + value.replace(/'/g, "''").replace(/\n+/g, `$& +${indent}`) + "'"; + return ctx.implicitKey ? res : foldFlowLines.foldFlowLines(res, indent, foldFlowLines.FOLD_FLOW, getFoldOptions(ctx, false)); + } + function quotedString(value, ctx) { + const { singleQuote } = ctx.options; + let qs; + if (singleQuote === false) + qs = doubleQuotedString; + else { + const hasDouble = value.includes('"'); + const hasSingle = value.includes("'"); + if (hasDouble && !hasSingle) + qs = singleQuotedString; + else if (hasSingle && !hasDouble) + qs = doubleQuotedString; + else + qs = singleQuote ? singleQuotedString : doubleQuotedString; + } + return qs(value, ctx); + } + var blockEndNewlines; + try { + blockEndNewlines = new RegExp("(^|(?\n"; + let chomp; + let endStart; + for (endStart = value.length; endStart > 0; --endStart) { + const ch = value[endStart - 1]; + if (ch !== "\n" && ch !== " " && ch !== " ") + break; + } + let end = value.substring(endStart); + const endNlPos = end.indexOf("\n"); + if (endNlPos === -1) { + chomp = "-"; + } else if (value === end || endNlPos !== end.length - 1) { + chomp = "+"; + if (onChompKeep) + onChompKeep(); + } else { + chomp = ""; + } + if (end) { + value = value.slice(0, -end.length); + if (end[end.length - 1] === "\n") + end = end.slice(0, -1); + end = end.replace(blockEndNewlines, `$&${indent}`); + } + let startWithSpace = false; + let startEnd; + let startNlPos = -1; + for (startEnd = 0; startEnd < value.length; ++startEnd) { + const ch = value[startEnd]; + if (ch === " ") + startWithSpace = true; + else if (ch === "\n") + startNlPos = startEnd; + else + break; + } + let start = value.substring(0, startNlPos < startEnd ? startNlPos + 1 : startEnd); + if (start) { + value = value.substring(start.length); + start = start.replace(/\n+/g, `$&${indent}`); + } + const indentSize = indent ? "2" : "1"; + let header = (startWithSpace ? indentSize : "") + chomp; + if (comment) { + header += " " + commentString(comment.replace(/ ?[\r\n]+/g, " ")); + if (onComment) + onComment(); + } + if (!literal) { + const foldedValue = value.replace(/\n+/g, "\n$&").replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g, "$1$2").replace(/\n+/g, `$&${indent}`); + let literalFallback = false; + const foldOptions = getFoldOptions(ctx, true); + if (blockQuote !== "folded" && type !== Scalar.Scalar.BLOCK_FOLDED) { + foldOptions.onOverflow = () => { + literalFallback = true; + }; + } + const body = foldFlowLines.foldFlowLines(`${start}${foldedValue}${end}`, indent, foldFlowLines.FOLD_BLOCK, foldOptions); + if (!literalFallback) + return `>${header} +${indent}${body}`; + } + value = value.replace(/\n+/g, `$&${indent}`); + return `|${header} +${indent}${start}${value}${end}`; + } + function plainString(item, ctx, onComment, onChompKeep) { + const { type, value } = item; + const { actualString, implicitKey, indent, indentStep, inFlow } = ctx; + if (implicitKey && value.includes("\n") || inFlow && /[[\]{},]/.test(value)) { + return quotedString(value, ctx); + } + if (!value || /^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(value)) { + return implicitKey || inFlow || !value.includes("\n") ? quotedString(value, ctx) : blockString(item, ctx, onComment, onChompKeep); + } + if (!implicitKey && !inFlow && type !== Scalar.Scalar.PLAIN && value.includes("\n")) { + return blockString(item, ctx, onComment, onChompKeep); + } + if (containsDocumentMarker(value)) { + if (indent === "") { + ctx.forceBlockIndent = true; + return blockString(item, ctx, onComment, onChompKeep); + } else if (implicitKey && indent === indentStep) { + return quotedString(value, ctx); + } + } + const str = value.replace(/\n+/g, `$& +${indent}`); + if (actualString) { + const test = (tag) => { + var _a; + return tag.default && tag.tag !== "tag:yaml.org,2002:str" && ((_a = tag.test) == null ? void 0 : _a.test(str)); + }; + const { compat, tags } = ctx.doc.schema; + if (tags.some(test) || (compat == null ? void 0 : compat.some(test))) + return quotedString(value, ctx); + } + return implicitKey ? str : foldFlowLines.foldFlowLines(str, indent, foldFlowLines.FOLD_FLOW, getFoldOptions(ctx, false)); + } + function stringifyString(item, ctx, onComment, onChompKeep) { + const { implicitKey, inFlow } = ctx; + const ss = typeof item.value === "string" ? item : Object.assign({}, item, { value: String(item.value) }); + let { type } = item; + if (type !== Scalar.Scalar.QUOTE_DOUBLE) { + if (/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(ss.value)) + type = Scalar.Scalar.QUOTE_DOUBLE; + } + const _stringify = (_type) => { + switch (_type) { + case Scalar.Scalar.BLOCK_FOLDED: + case Scalar.Scalar.BLOCK_LITERAL: + return implicitKey || inFlow ? quotedString(ss.value, ctx) : blockString(ss, ctx, onComment, onChompKeep); + case Scalar.Scalar.QUOTE_DOUBLE: + return doubleQuotedString(ss.value, ctx); + case Scalar.Scalar.QUOTE_SINGLE: + return singleQuotedString(ss.value, ctx); + case Scalar.Scalar.PLAIN: + return plainString(ss, ctx, onComment, onChompKeep); + default: + return null; + } + }; + let res = _stringify(type); + if (res === null) { + const { defaultKeyType, defaultStringType } = ctx.options; + const t = implicitKey && defaultKeyType || defaultStringType; + res = _stringify(t); + if (res === null) + throw new Error(`Unsupported default string type ${t}`); + } + return res; + } + exports.stringifyString = stringifyString; + } +}); + +// +var require_stringify = __commonJS({ + ""(exports) { + "use strict"; + var anchors = require_anchors(); + var identity = require_identity(); + var stringifyComment = require_stringifyComment(); + var stringifyString = require_stringifyString(); + function createStringifyContext(doc, options) { + const opt = Object.assign({ + blockQuote: true, + commentString: stringifyComment.stringifyComment, + defaultKeyType: null, + defaultStringType: "PLAIN", + directives: null, + doubleQuotedAsJSON: false, + doubleQuotedMinMultiLineLength: 40, + falseStr: "false", + flowCollectionPadding: true, + indentSeq: true, + lineWidth: 80, + minContentWidth: 20, + nullStr: "null", + simpleKeys: false, + singleQuote: null, + trueStr: "true", + verifyAliasOrder: true + }, doc.schema.toStringOptions, options); + let inFlow; + switch (opt.collectionStyle) { + case "block": + inFlow = false; + break; + case "flow": + inFlow = true; + break; + default: + inFlow = null; + } + return { + anchors: /* @__PURE__ */ new Set(), + doc, + flowCollectionPadding: opt.flowCollectionPadding ? " " : "", + indent: "", + indentStep: typeof opt.indent === "number" ? " ".repeat(opt.indent) : " ", + inFlow, + options: opt + }; + } + function getTagObject(tags, item) { + var _a; + if (item.tag) { + const match = tags.filter((t) => t.tag === item.tag); + if (match.length > 0) + return match.find((t) => t.format === item.format) ?? match[0]; + } + let tagObj = void 0; + let obj; + if (identity.isScalar(item)) { + obj = item.value; + let match = tags.filter((t) => { + var _a2; + return (_a2 = t.identify) == null ? void 0 : _a2.call(t, obj); + }); + if (match.length > 1) { + const testMatch = match.filter((t) => t.test); + if (testMatch.length > 0) + match = testMatch; + } + tagObj = match.find((t) => t.format === item.format) ?? match.find((t) => !t.format); + } else { + obj = item; + tagObj = tags.find((t) => t.nodeClass && obj instanceof t.nodeClass); + } + if (!tagObj) { + const name = ((_a = obj == null ? void 0 : obj.constructor) == null ? void 0 : _a.name) ?? typeof obj; + throw new Error(`Tag not resolved for ${name} value`); + } + return tagObj; + } + function stringifyProps(node, tagObj, { anchors: anchors$1, doc }) { + if (!doc.directives) + return ""; + const props = []; + const anchor = (identity.isScalar(node) || identity.isCollection(node)) && node.anchor; + if (anchor && anchors.anchorIsValid(anchor)) { + anchors$1.add(anchor); + props.push(`&${anchor}`); + } + const tag = node.tag ? node.tag : tagObj.default ? null : tagObj.tag; + if (tag) + props.push(doc.directives.tagString(tag)); + return props.join(" "); + } + function stringify(item, ctx, onComment, onChompKeep) { + var _a; + if (identity.isPair(item)) + return item.toString(ctx, onComment, onChompKeep); + if (identity.isAlias(item)) { + if (ctx.doc.directives) + return item.toString(ctx); + if ((_a = ctx.resolvedAliases) == null ? void 0 : _a.has(item)) { + throw new TypeError(`Cannot stringify circular structure without alias nodes`); + } else { + if (ctx.resolvedAliases) + ctx.resolvedAliases.add(item); + else + ctx.resolvedAliases = /* @__PURE__ */ new Set([item]); + item = item.resolve(ctx.doc); + } + } + let tagObj = void 0; + const node = identity.isNode(item) ? item : ctx.doc.createNode(item, { onTagObj: (o) => tagObj = o }); + if (!tagObj) + tagObj = getTagObject(ctx.doc.schema.tags, node); + const props = stringifyProps(node, tagObj, ctx); + if (props.length > 0) + ctx.indentAtStart = (ctx.indentAtStart ?? 0) + props.length + 1; + const str = typeof tagObj.stringify === "function" ? tagObj.stringify(node, ctx, onComment, onChompKeep) : identity.isScalar(node) ? stringifyString.stringifyString(node, ctx, onComment, onChompKeep) : node.toString(ctx, onComment, onChompKeep); + if (!props) + return str; + return identity.isScalar(node) || str[0] === "{" || str[0] === "[" ? `${props} ${str}` : `${props} +${ctx.indent}${str}`; + } + exports.createStringifyContext = createStringifyContext; + exports.stringify = stringify; + } +}); + +// +var require_stringifyPair = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Scalar = require_Scalar(); + var stringify = require_stringify(); + var stringifyComment = require_stringifyComment(); + function stringifyPair({ key, value }, ctx, onComment, onChompKeep) { + const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx; + let keyComment = identity.isNode(key) && key.comment || null; + if (simpleKeys) { + if (keyComment) { + throw new Error("With simple keys, key nodes cannot have comments"); + } + if (identity.isCollection(key) || !identity.isNode(key) && typeof key === "object") { + const msg = "With simple keys, collection cannot be used as a key value"; + throw new Error(msg); + } + } + let explicitKey = !simpleKeys && (!key || keyComment && value == null && !ctx.inFlow || identity.isCollection(key) || (identity.isScalar(key) ? key.type === Scalar.Scalar.BLOCK_FOLDED || key.type === Scalar.Scalar.BLOCK_LITERAL : typeof key === "object")); + ctx = Object.assign({}, ctx, { + allNullValues: false, + implicitKey: !explicitKey && (simpleKeys || !allNullValues), + indent: indent + indentStep + }); + let keyCommentDone = false; + let chompKeep = false; + let str = stringify.stringify(key, ctx, () => keyCommentDone = true, () => chompKeep = true); + if (!explicitKey && !ctx.inFlow && str.length > 1024) { + if (simpleKeys) + throw new Error("With simple keys, single line scalar must not span more than 1024 characters"); + explicitKey = true; + } + if (ctx.inFlow) { + if (allNullValues || value == null) { + if (keyCommentDone && onComment) + onComment(); + return str === "" ? "?" : explicitKey ? `? ${str}` : str; + } + } else if (allNullValues && !simpleKeys || value == null && explicitKey) { + str = `? ${str}`; + if (keyComment && !keyCommentDone) { + str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment)); + } else if (chompKeep && onChompKeep) + onChompKeep(); + return str; + } + if (keyCommentDone) + keyComment = null; + if (explicitKey) { + if (keyComment) + str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment)); + str = `? ${str} +${indent}:`; + } else { + str = `${str}:`; + if (keyComment) + str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment)); + } + let vsb, vcb, valueComment; + if (identity.isNode(value)) { + vsb = !!value.spaceBefore; + vcb = value.commentBefore; + valueComment = value.comment; + } else { + vsb = false; + vcb = null; + valueComment = null; + if (value && typeof value === "object") + value = doc.createNode(value); + } + ctx.implicitKey = false; + if (!explicitKey && !keyComment && identity.isScalar(value)) + ctx.indentAtStart = str.length + 1; + chompKeep = false; + if (!indentSeq && indentStep.length >= 2 && !ctx.inFlow && !explicitKey && identity.isSeq(value) && !value.flow && !value.tag && !value.anchor) { + ctx.indent = ctx.indent.substring(2); + } + let valueCommentDone = false; + const valueStr = stringify.stringify(value, ctx, () => valueCommentDone = true, () => chompKeep = true); + let ws = " "; + if (keyComment || vsb || vcb) { + ws = vsb ? "\n" : ""; + if (vcb) { + const cs = commentString(vcb); + ws += ` +${stringifyComment.indentComment(cs, ctx.indent)}`; + } + if (valueStr === "" && !ctx.inFlow) { + if (ws === "\n") + ws = "\n\n"; + } else { + ws += ` +${ctx.indent}`; + } + } else if (!explicitKey && identity.isCollection(value)) { + const vs0 = valueStr[0]; + const nl0 = valueStr.indexOf("\n"); + const hasNewline = nl0 !== -1; + const flow = ctx.inFlow ?? value.flow ?? value.items.length === 0; + if (hasNewline || !flow) { + let hasPropsLine = false; + if (hasNewline && (vs0 === "&" || vs0 === "!")) { + let sp0 = valueStr.indexOf(" "); + if (vs0 === "&" && sp0 !== -1 && sp0 < nl0 && valueStr[sp0 + 1] === "!") { + sp0 = valueStr.indexOf(" ", sp0 + 1); + } + if (sp0 === -1 || nl0 < sp0) + hasPropsLine = true; + } + if (!hasPropsLine) + ws = ` +${ctx.indent}`; + } + } else if (valueStr === "" || valueStr[0] === "\n") { + ws = ""; + } + str += ws + valueStr; + if (ctx.inFlow) { + if (valueCommentDone && onComment) + onComment(); + } else if (valueComment && !valueCommentDone) { + str += stringifyComment.lineComment(str, ctx.indent, commentString(valueComment)); + } else if (chompKeep && onChompKeep) { + onChompKeep(); + } + return str; + } + exports.stringifyPair = stringifyPair; + } +}); + +// +var require_log = __commonJS({ + ""(exports) { + "use strict"; + var node_process = __require("process"); + function debug(logLevel, ...messages) { + if (logLevel === "debug") + console.log(...messages); + } + function warn(logLevel, warning) { + if (logLevel === "debug" || logLevel === "warn") { + if (typeof node_process.emitWarning === "function") + node_process.emitWarning(warning); + else + console.warn(warning); + } + } + exports.debug = debug; + exports.warn = warn; + } +}); + +// +var require_merge = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Scalar = require_Scalar(); + var MERGE_KEY = "<<"; + var merge3 = { + identify: (value) => value === MERGE_KEY || typeof value === "symbol" && value.description === MERGE_KEY, + default: "key", + tag: "tag:yaml.org,2002:merge", + test: /^<<$/, + resolve: () => Object.assign(new Scalar.Scalar(Symbol(MERGE_KEY)), { + addToJSMap: addMergeToJSMap + }), + stringify: () => MERGE_KEY + }; + var isMergeKey = (ctx, key) => (merge3.identify(key) || identity.isScalar(key) && (!key.type || key.type === Scalar.Scalar.PLAIN) && merge3.identify(key.value)) && (ctx == null ? void 0 : ctx.doc.schema.tags.some((tag) => tag.tag === merge3.tag && tag.default)); + function addMergeToJSMap(ctx, map, value) { + value = ctx && identity.isAlias(value) ? value.resolve(ctx.doc) : value; + if (identity.isSeq(value)) + for (const it of value.items) + mergeValue(ctx, map, it); + else if (Array.isArray(value)) + for (const it of value) + mergeValue(ctx, map, it); + else + mergeValue(ctx, map, value); + } + function mergeValue(ctx, map, value) { + const source = ctx && identity.isAlias(value) ? value.resolve(ctx.doc) : value; + if (!identity.isMap(source)) + throw new Error("Merge sources must be maps or map aliases"); + const srcMap = source.toJSON(null, ctx, Map); + for (const [key, value2] of srcMap) { + if (map instanceof Map) { + if (!map.has(key)) + map.set(key, value2); + } else if (map instanceof Set) { + map.add(key); + } else if (!Object.prototype.hasOwnProperty.call(map, key)) { + Object.defineProperty(map, key, { + value: value2, + writable: true, + enumerable: true, + configurable: true + }); + } + } + return map; + } + exports.addMergeToJSMap = addMergeToJSMap; + exports.isMergeKey = isMergeKey; + exports.merge = merge3; + } +}); + +// +var require_addPairToJSMap = __commonJS({ + ""(exports) { + "use strict"; + var log = require_log(); + var merge3 = require_merge(); + var stringify = require_stringify(); + var identity = require_identity(); + var toJS = require_toJS(); + function addPairToJSMap(ctx, map, { key, value }) { + if (identity.isNode(key) && key.addToJSMap) + key.addToJSMap(ctx, map, value); + else if (merge3.isMergeKey(ctx, key)) + merge3.addMergeToJSMap(ctx, map, value); + else { + const jsKey = toJS.toJS(key, "", ctx); + if (map instanceof Map) { + map.set(jsKey, toJS.toJS(value, jsKey, ctx)); + } else if (map instanceof Set) { + map.add(jsKey); + } else { + const stringKey = stringifyKey(key, jsKey, ctx); + const jsValue = toJS.toJS(value, stringKey, ctx); + if (stringKey in map) + Object.defineProperty(map, stringKey, { + value: jsValue, + writable: true, + enumerable: true, + configurable: true + }); + else + map[stringKey] = jsValue; + } + } + return map; + } + function stringifyKey(key, jsKey, ctx) { + if (jsKey === null) + return ""; + if (typeof jsKey !== "object") + return String(jsKey); + if (identity.isNode(key) && (ctx == null ? void 0 : ctx.doc)) { + const strCtx = stringify.createStringifyContext(ctx.doc, {}); + strCtx.anchors = /* @__PURE__ */ new Set(); + for (const node of ctx.anchors.keys()) + strCtx.anchors.add(node.anchor); + strCtx.inFlow = true; + strCtx.inStringifyKey = true; + const strKey = key.toString(strCtx); + if (!ctx.mapKeyWarned) { + let jsonStr = JSON.stringify(strKey); + if (jsonStr.length > 40) + jsonStr = jsonStr.substring(0, 36) + '..."'; + log.warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`); + ctx.mapKeyWarned = true; + } + return strKey; + } + return JSON.stringify(jsKey); + } + exports.addPairToJSMap = addPairToJSMap; + } +}); + +// +var require_Pair = __commonJS({ + ""(exports) { + "use strict"; + var createNode = require_createNode(); + var stringifyPair = require_stringifyPair(); + var addPairToJSMap = require_addPairToJSMap(); + var identity = require_identity(); + function createPair(key, value, ctx) { + const k = createNode.createNode(key, void 0, ctx); + const v = createNode.createNode(value, void 0, ctx); + return new Pair(k, v); + } + var Pair = class { + constructor(key, value = null) { + Object.defineProperty(this, identity.NODE_TYPE, { value: identity.PAIR }); + this.key = key; + this.value = value; + } + clone(schema) { + let { key, value } = this; + if (identity.isNode(key)) + key = key.clone(schema); + if (identity.isNode(value)) + value = value.clone(schema); + return new Pair(key, value); + } + toJSON(_, ctx) { + const pair = (ctx == null ? void 0 : ctx.mapAsMap) ? /* @__PURE__ */ new Map() : {}; + return addPairToJSMap.addPairToJSMap(ctx, pair, this); + } + toString(ctx, onComment, onChompKeep) { + return (ctx == null ? void 0 : ctx.doc) ? stringifyPair.stringifyPair(this, ctx, onComment, onChompKeep) : JSON.stringify(this); + } + }; + exports.Pair = Pair; + exports.createPair = createPair; + } +}); + +// +var require_stringifyCollection = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var stringify = require_stringify(); + var stringifyComment = require_stringifyComment(); + function stringifyCollection(collection, ctx, options) { + const flow = ctx.inFlow ?? collection.flow; + const stringify2 = flow ? stringifyFlowCollection : stringifyBlockCollection; + return stringify2(collection, ctx, options); + } + function stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, flowChars, itemIndent, onChompKeep, onComment }) { + const { indent, options: { commentString } } = ctx; + const itemCtx = Object.assign({}, ctx, { indent: itemIndent, type: null }); + let chompKeep = false; + const lines = []; + for (let i = 0; i < items.length; ++i) { + const item = items[i]; + let comment2 = null; + if (identity.isNode(item)) { + if (!chompKeep && item.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, item.commentBefore, chompKeep); + if (item.comment) + comment2 = item.comment; + } else if (identity.isPair(item)) { + const ik = identity.isNode(item.key) ? item.key : null; + if (ik) { + if (!chompKeep && ik.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, ik.commentBefore, chompKeep); + } + } + chompKeep = false; + let str2 = stringify.stringify(item, itemCtx, () => comment2 = null, () => chompKeep = true); + if (comment2) + str2 += stringifyComment.lineComment(str2, itemIndent, commentString(comment2)); + if (chompKeep && comment2) + chompKeep = false; + lines.push(blockItemPrefix + str2); + } + let str; + if (lines.length === 0) { + str = flowChars.start + flowChars.end; + } else { + str = lines[0]; + for (let i = 1; i < lines.length; ++i) { + const line = lines[i]; + str += line ? ` +${indent}${line}` : "\n"; + } + } + if (comment) { + str += "\n" + stringifyComment.indentComment(commentString(comment), indent); + if (onComment) + onComment(); + } else if (chompKeep && onChompKeep) + onChompKeep(); + return str; + } + function stringifyFlowCollection({ items }, ctx, { flowChars, itemIndent }) { + const { indent, indentStep, flowCollectionPadding: fcPadding, options: { commentString } } = ctx; + itemIndent += indentStep; + const itemCtx = Object.assign({}, ctx, { + indent: itemIndent, + inFlow: true, + type: null + }); + let reqNewline = false; + let linesAtValue = 0; + const lines = []; + for (let i = 0; i < items.length; ++i) { + const item = items[i]; + let comment = null; + if (identity.isNode(item)) { + if (item.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, item.commentBefore, false); + if (item.comment) + comment = item.comment; + } else if (identity.isPair(item)) { + const ik = identity.isNode(item.key) ? item.key : null; + if (ik) { + if (ik.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, ik.commentBefore, false); + if (ik.comment) + reqNewline = true; + } + const iv = identity.isNode(item.value) ? item.value : null; + if (iv) { + if (iv.comment) + comment = iv.comment; + if (iv.commentBefore) + reqNewline = true; + } else if (item.value == null && (ik == null ? void 0 : ik.comment)) { + comment = ik.comment; + } + } + if (comment) + reqNewline = true; + let str = stringify.stringify(item, itemCtx, () => comment = null); + if (i < items.length - 1) + str += ","; + if (comment) + str += stringifyComment.lineComment(str, itemIndent, commentString(comment)); + if (!reqNewline && (lines.length > linesAtValue || str.includes("\n"))) + reqNewline = true; + lines.push(str); + linesAtValue = lines.length; + } + const { start, end } = flowChars; + if (lines.length === 0) { + return start + end; + } else { + if (!reqNewline) { + const len = lines.reduce((sum, line) => sum + line.length + 2, 2); + reqNewline = ctx.options.lineWidth > 0 && len > ctx.options.lineWidth; + } + if (reqNewline) { + let str = start; + for (const line of lines) + str += line ? ` +${indentStep}${indent}${line}` : "\n"; + return `${str} +${indent}${end}`; + } else { + return `${start}${fcPadding}${lines.join(" ")}${fcPadding}${end}`; + } + } + } + function addCommentBefore({ indent, options: { commentString } }, lines, comment, chompKeep) { + if (comment && chompKeep) + comment = comment.replace(/^\n+/, ""); + if (comment) { + const ic = stringifyComment.indentComment(commentString(comment), indent); + lines.push(ic.trimStart()); + } + } + exports.stringifyCollection = stringifyCollection; + } +}); + +// +var require_YAMLMap = __commonJS({ + ""(exports) { + "use strict"; + var stringifyCollection = require_stringifyCollection(); + var addPairToJSMap = require_addPairToJSMap(); + var Collection2 = require_Collection(); + var identity = require_identity(); + var Pair = require_Pair(); + var Scalar = require_Scalar(); + function findPair(items, key) { + const k = identity.isScalar(key) ? key.value : key; + for (const it of items) { + if (identity.isPair(it)) { + if (it.key === key || it.key === k) + return it; + if (identity.isScalar(it.key) && it.key.value === k) + return it; + } + } + return void 0; + } + var YAMLMap = class extends Collection2.Collection { + static get tagName() { + return "tag:yaml.org,2002:map"; + } + constructor(schema) { + super(identity.MAP, schema); + this.items = []; + } + static from(schema, obj, ctx) { + const { keepUndefined, replacer } = ctx; + const map = new this(schema); + const add = (key, value) => { + if (typeof replacer === "function") + value = replacer.call(obj, key, value); + else if (Array.isArray(replacer) && !replacer.includes(key)) + return; + if (value !== void 0 || keepUndefined) + map.items.push(Pair.createPair(key, value, ctx)); + }; + if (obj instanceof Map) { + for (const [key, value] of obj) + add(key, value); + } else if (obj && typeof obj === "object") { + for (const key of Object.keys(obj)) + add(key, obj[key]); + } + if (typeof schema.sortMapEntries === "function") { + map.items.sort(schema.sortMapEntries); + } + return map; + } + add(pair, overwrite) { + var _a; + let _pair; + if (identity.isPair(pair)) + _pair = pair; + else if (!pair || typeof pair !== "object" || !("key" in pair)) { + _pair = new Pair.Pair(pair, pair == null ? void 0 : pair.value); + } else + _pair = new Pair.Pair(pair.key, pair.value); + const prev = findPair(this.items, _pair.key); + const sortEntries = (_a = this.schema) == null ? void 0 : _a.sortMapEntries; + if (prev) { + if (!overwrite) + throw new Error(`Key ${_pair.key} already set`); + if (identity.isScalar(prev.value) && Scalar.isScalarValue(_pair.value)) + prev.value.value = _pair.value; + else + prev.value = _pair.value; + } else if (sortEntries) { + const i = this.items.findIndex((item) => sortEntries(_pair, item) < 0); + if (i === -1) + this.items.push(_pair); + else + this.items.splice(i, 0, _pair); + } else { + this.items.push(_pair); + } + } + delete(key) { + const it = findPair(this.items, key); + if (!it) + return false; + const del = this.items.splice(this.items.indexOf(it), 1); + return del.length > 0; + } + get(key, keepScalar) { + const it = findPair(this.items, key); + const node = it == null ? void 0 : it.value; + return (!keepScalar && identity.isScalar(node) ? node.value : node) ?? void 0; + } + has(key) { + return !!findPair(this.items, key); + } + set(key, value) { + this.add(new Pair.Pair(key, value), true); + } + toJSON(_, ctx, Type) { + const map = Type ? new Type() : (ctx == null ? void 0 : ctx.mapAsMap) ? /* @__PURE__ */ new Map() : {}; + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(map); + for (const item of this.items) + addPairToJSMap.addPairToJSMap(ctx, map, item); + return map; + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + for (const item of this.items) { + if (!identity.isPair(item)) + throw new Error(`Map items must all be pairs; found ${JSON.stringify(item)} instead`); + } + if (!ctx.allNullValues && this.hasAllNullValues(false)) + ctx = Object.assign({}, ctx, { allNullValues: true }); + return stringifyCollection.stringifyCollection(this, ctx, { + blockItemPrefix: "", + flowChars: { start: "{", end: "}" }, + itemIndent: ctx.indent || "", + onChompKeep, + onComment + }); + } + }; + exports.YAMLMap = YAMLMap; + exports.findPair = findPair; + } +}); + +// +var require_map = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var YAMLMap = require_YAMLMap(); + var map = { + collection: "map", + default: true, + nodeClass: YAMLMap.YAMLMap, + tag: "tag:yaml.org,2002:map", + resolve(map2, onError) { + if (!identity.isMap(map2)) + onError("Expected a mapping for this tag"); + return map2; + }, + createNode: (schema, obj, ctx) => YAMLMap.YAMLMap.from(schema, obj, ctx) + }; + exports.map = map; + } +}); + +// +var require_YAMLSeq = __commonJS({ + ""(exports) { + "use strict"; + var createNode = require_createNode(); + var stringifyCollection = require_stringifyCollection(); + var Collection2 = require_Collection(); + var identity = require_identity(); + var Scalar = require_Scalar(); + var toJS = require_toJS(); + var YAMLSeq = class extends Collection2.Collection { + static get tagName() { + return "tag:yaml.org,2002:seq"; + } + constructor(schema) { + super(identity.SEQ, schema); + this.items = []; + } + add(value) { + this.items.push(value); + } + delete(key) { + const idx = asItemIndex(key); + if (typeof idx !== "number") + return false; + const del = this.items.splice(idx, 1); + return del.length > 0; + } + get(key, keepScalar) { + const idx = asItemIndex(key); + if (typeof idx !== "number") + return void 0; + const it = this.items[idx]; + return !keepScalar && identity.isScalar(it) ? it.value : it; + } + has(key) { + const idx = asItemIndex(key); + return typeof idx === "number" && idx < this.items.length; + } + set(key, value) { + const idx = asItemIndex(key); + if (typeof idx !== "number") + throw new Error(`Expected a valid index, not ${key}.`); + const prev = this.items[idx]; + if (identity.isScalar(prev) && Scalar.isScalarValue(value)) + prev.value = value; + else + this.items[idx] = value; + } + toJSON(_, ctx) { + const seq = []; + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(seq); + let i = 0; + for (const item of this.items) + seq.push(toJS.toJS(item, String(i++), ctx)); + return seq; + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + return stringifyCollection.stringifyCollection(this, ctx, { + blockItemPrefix: "- ", + flowChars: { start: "[", end: "]" }, + itemIndent: (ctx.indent || "") + " ", + onChompKeep, + onComment + }); + } + static from(schema, obj, ctx) { + const { replacer } = ctx; + const seq = new this(schema); + if (obj && Symbol.iterator in Object(obj)) { + let i = 0; + for (let it of obj) { + if (typeof replacer === "function") { + const key = obj instanceof Set ? it : String(i++); + it = replacer.call(obj, key, it); + } + seq.items.push(createNode.createNode(it, void 0, ctx)); + } + } + return seq; + } + }; + function asItemIndex(key) { + let idx = identity.isScalar(key) ? key.value : key; + if (idx && typeof idx === "string") + idx = Number(idx); + return typeof idx === "number" && Number.isInteger(idx) && idx >= 0 ? idx : null; + } + exports.YAMLSeq = YAMLSeq; + } +}); + +// +var require_seq = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var YAMLSeq = require_YAMLSeq(); + var seq = { + collection: "seq", + default: true, + nodeClass: YAMLSeq.YAMLSeq, + tag: "tag:yaml.org,2002:seq", + resolve(seq2, onError) { + if (!identity.isSeq(seq2)) + onError("Expected a sequence for this tag"); + return seq2; + }, + createNode: (schema, obj, ctx) => YAMLSeq.YAMLSeq.from(schema, obj, ctx) + }; + exports.seq = seq; + } +}); + +// +var require_string = __commonJS({ + ""(exports) { + "use strict"; + var stringifyString = require_stringifyString(); + var string = { + identify: (value) => typeof value === "string", + default: true, + tag: "tag:yaml.org,2002:str", + resolve: (str) => str, + stringify(item, ctx, onComment, onChompKeep) { + ctx = Object.assign({ actualString: true }, ctx); + return stringifyString.stringifyString(item, ctx, onComment, onChompKeep); + } + }; + exports.string = string; + } +}); + +// +var require_null = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + var nullTag = { + identify: (value) => value == null, + createNode: () => new Scalar.Scalar(null), + default: true, + tag: "tag:yaml.org,2002:null", + test: /^(?:~|[Nn]ull|NULL)?$/, + resolve: () => new Scalar.Scalar(null), + stringify: ({ source }, ctx) => typeof source === "string" && nullTag.test.test(source) ? source : ctx.options.nullStr + }; + exports.nullTag = nullTag; + } +}); + +// +var require_bool = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + var boolTag = { + identify: (value) => typeof value === "boolean", + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/, + resolve: (str) => new Scalar.Scalar(str[0] === "t" || str[0] === "T"), + stringify({ source, value }, ctx) { + if (source && boolTag.test.test(source)) { + const sv = source[0] === "t" || source[0] === "T"; + if (value === sv) + return source; + } + return value ? ctx.options.trueStr : ctx.options.falseStr; + } + }; + exports.boolTag = boolTag; + } +}); + +// +var require_stringifyNumber = __commonJS({ + ""(exports) { + "use strict"; + function stringifyNumber({ format, minFractionDigits, tag, value }) { + if (typeof value === "bigint") + return String(value); + const num = typeof value === "number" ? value : Number(value); + if (!isFinite(num)) + return isNaN(num) ? ".nan" : num < 0 ? "-.inf" : ".inf"; + let n = JSON.stringify(value); + if (!format && minFractionDigits && (!tag || tag === "tag:yaml.org,2002:float") && /^\d/.test(n)) { + let i = n.indexOf("."); + if (i < 0) { + i = n.length; + n += "."; + } + let d = minFractionDigits - (n.length - i - 1); + while (d-- > 0) + n += "0"; + } + return n; + } + exports.stringifyNumber = stringifyNumber; + } +}); + +// +var require_float = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + var stringifyNumber = require_stringifyNumber(); + var floatNaN = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/, + resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, + stringify: stringifyNumber.stringifyNumber + }; + var floatExp = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "EXP", + test: /^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/, + resolve: (str) => parseFloat(str), + stringify(node) { + const num = Number(node.value); + return isFinite(num) ? num.toExponential() : stringifyNumber.stringifyNumber(node); + } + }; + var float = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/, + resolve(str) { + const node = new Scalar.Scalar(parseFloat(str)); + const dot = str.indexOf("."); + if (dot !== -1 && str[str.length - 1] === "0") + node.minFractionDigits = str.length - dot - 1; + return node; + }, + stringify: stringifyNumber.stringifyNumber + }; + exports.float = float; + exports.floatExp = floatExp; + exports.floatNaN = floatNaN; + } +}); + +// +var require_int = __commonJS({ + ""(exports) { + "use strict"; + var stringifyNumber = require_stringifyNumber(); + var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value); + var intResolve = (str, offset, radix, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str.substring(offset), radix); + function intStringify(node, radix, prefix) { + const { value } = node; + if (intIdentify(value) && value >= 0) + return prefix + value.toString(radix); + return stringifyNumber.stringifyNumber(node); + } + var intOct = { + identify: (value) => intIdentify(value) && value >= 0, + default: true, + tag: "tag:yaml.org,2002:int", + format: "OCT", + test: /^0o[0-7]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 8, opt), + stringify: (node) => intStringify(node, 8, "0o") + }; + var int = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^[-+]?[0-9]+$/, + resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt), + stringify: stringifyNumber.stringifyNumber + }; + var intHex = { + identify: (value) => intIdentify(value) && value >= 0, + default: true, + tag: "tag:yaml.org,2002:int", + format: "HEX", + test: /^0x[0-9a-fA-F]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt), + stringify: (node) => intStringify(node, 16, "0x") + }; + exports.int = int; + exports.intHex = intHex; + exports.intOct = intOct; + } +}); + +// +var require_schema = __commonJS({ + ""(exports) { + "use strict"; + var map = require_map(); + var _null = require_null(); + var seq = require_seq(); + var string = require_string(); + var bool = require_bool(); + var float = require_float(); + var int = require_int(); + var schema = [ + map.map, + seq.seq, + string.string, + _null.nullTag, + bool.boolTag, + int.intOct, + int.int, + int.intHex, + float.floatNaN, + float.floatExp, + float.float + ]; + exports.schema = schema; + } +}); + +// +var require_schema2 = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + var map = require_map(); + var seq = require_seq(); + function intIdentify(value) { + return typeof value === "bigint" || Number.isInteger(value); + } + var stringifyJSON = ({ value }) => JSON.stringify(value); + var jsonScalars = [ + { + identify: (value) => typeof value === "string", + default: true, + tag: "tag:yaml.org,2002:str", + resolve: (str) => str, + stringify: stringifyJSON + }, + { + identify: (value) => value == null, + createNode: () => new Scalar.Scalar(null), + default: true, + tag: "tag:yaml.org,2002:null", + test: /^null$/, + resolve: () => null, + stringify: stringifyJSON + }, + { + identify: (value) => typeof value === "boolean", + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^true$|^false$/, + resolve: (str) => str === "true", + stringify: stringifyJSON + }, + { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^-?(?:0|[1-9][0-9]*)$/, + resolve: (str, _onError, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str, 10), + stringify: ({ value }) => intIdentify(value) ? value.toString() : JSON.stringify(value) + }, + { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/, + resolve: (str) => parseFloat(str), + stringify: stringifyJSON + } + ]; + var jsonError = { + default: true, + tag: "", + test: /^/, + resolve(str, onError) { + onError(`Unresolved plain scalar ${JSON.stringify(str)}`); + return str; + } + }; + var schema = [map.map, seq.seq].concat(jsonScalars, jsonError); + exports.schema = schema; + } +}); + +// +var require_binary = __commonJS({ + ""(exports) { + "use strict"; + var node_buffer = __require("buffer"); + var Scalar = require_Scalar(); + var stringifyString = require_stringifyString(); + var binary = { + identify: (value) => value instanceof Uint8Array, + default: false, + tag: "tag:yaml.org,2002:binary", + resolve(src, onError) { + if (typeof node_buffer.Buffer === "function") { + return node_buffer.Buffer.from(src, "base64"); + } else if (typeof atob === "function") { + const str = atob(src.replace(/[\n\r]/g, "")); + const buffer = new Uint8Array(str.length); + for (let i = 0; i < str.length; ++i) + buffer[i] = str.charCodeAt(i); + return buffer; + } else { + onError("This environment does not support reading binary tags; either Buffer or atob is required"); + return src; + } + }, + stringify({ comment, type, value }, ctx, onComment, onChompKeep) { + const buf = value; + let str; + if (typeof node_buffer.Buffer === "function") { + str = buf instanceof node_buffer.Buffer ? buf.toString("base64") : node_buffer.Buffer.from(buf.buffer).toString("base64"); + } else if (typeof btoa === "function") { + let s = ""; + for (let i = 0; i < buf.length; ++i) + s += String.fromCharCode(buf[i]); + str = btoa(s); + } else { + throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required"); + } + if (!type) + type = Scalar.Scalar.BLOCK_LITERAL; + if (type !== Scalar.Scalar.QUOTE_DOUBLE) { + const lineWidth = Math.max(ctx.options.lineWidth - ctx.indent.length, ctx.options.minContentWidth); + const n = Math.ceil(str.length / lineWidth); + const lines = new Array(n); + for (let i = 0, o = 0; i < n; ++i, o += lineWidth) { + lines[i] = str.substr(o, lineWidth); + } + str = lines.join(type === Scalar.Scalar.BLOCK_LITERAL ? "\n" : " "); + } + return stringifyString.stringifyString({ comment, type, value: str }, ctx, onComment, onChompKeep); + } + }; + exports.binary = binary; + } +}); + +// +var require_pairs = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Pair = require_Pair(); + var Scalar = require_Scalar(); + var YAMLSeq = require_YAMLSeq(); + function resolvePairs(seq, onError) { + if (identity.isSeq(seq)) { + for (let i = 0; i < seq.items.length; ++i) { + let item = seq.items[i]; + if (identity.isPair(item)) + continue; + else if (identity.isMap(item)) { + if (item.items.length > 1) + onError("Each pair must have its own sequence indicator"); + const pair = item.items[0] || new Pair.Pair(new Scalar.Scalar(null)); + if (item.commentBefore) + pair.key.commentBefore = pair.key.commentBefore ? `${item.commentBefore} +${pair.key.commentBefore}` : item.commentBefore; + if (item.comment) { + const cn = pair.value ?? pair.key; + cn.comment = cn.comment ? `${item.comment} +${cn.comment}` : item.comment; + } + item = pair; + } + seq.items[i] = identity.isPair(item) ? item : new Pair.Pair(item); + } + } else + onError("Expected a sequence for this tag"); + return seq; + } + function createPairs(schema, iterable, ctx) { + const { replacer } = ctx; + const pairs2 = new YAMLSeq.YAMLSeq(schema); + pairs2.tag = "tag:yaml.org,2002:pairs"; + let i = 0; + if (iterable && Symbol.iterator in Object(iterable)) + for (let it of iterable) { + if (typeof replacer === "function") + it = replacer.call(iterable, String(i++), it); + let key, value; + if (Array.isArray(it)) { + if (it.length === 2) { + key = it[0]; + value = it[1]; + } else + throw new TypeError(`Expected [key, value] tuple: ${it}`); + } else if (it && it instanceof Object) { + const keys = Object.keys(it); + if (keys.length === 1) { + key = keys[0]; + value = it[key]; + } else { + throw new TypeError(`Expected tuple with one key, not ${keys.length} keys`); + } + } else { + key = it; + } + pairs2.items.push(Pair.createPair(key, value, ctx)); + } + return pairs2; + } + var pairs = { + collection: "seq", + default: false, + tag: "tag:yaml.org,2002:pairs", + resolve: resolvePairs, + createNode: createPairs + }; + exports.createPairs = createPairs; + exports.pairs = pairs; + exports.resolvePairs = resolvePairs; + } +}); + +// +var require_omap = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var toJS = require_toJS(); + var YAMLMap = require_YAMLMap(); + var YAMLSeq = require_YAMLSeq(); + var pairs = require_pairs(); + var YAMLOMap = class extends YAMLSeq.YAMLSeq { + constructor() { + super(); + this.add = YAMLMap.YAMLMap.prototype.add.bind(this); + this.delete = YAMLMap.YAMLMap.prototype.delete.bind(this); + this.get = YAMLMap.YAMLMap.prototype.get.bind(this); + this.has = YAMLMap.YAMLMap.prototype.has.bind(this); + this.set = YAMLMap.YAMLMap.prototype.set.bind(this); + this.tag = YAMLOMap.tag; + } + toJSON(_, ctx) { + if (!ctx) + return super.toJSON(_); + const map = /* @__PURE__ */ new Map(); + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(map); + for (const pair of this.items) { + let key, value; + if (identity.isPair(pair)) { + key = toJS.toJS(pair.key, "", ctx); + value = toJS.toJS(pair.value, key, ctx); + } else { + key = toJS.toJS(pair, "", ctx); + } + if (map.has(key)) + throw new Error("Ordered maps must not include duplicate keys"); + map.set(key, value); + } + return map; + } + static from(schema, iterable, ctx) { + const pairs$1 = pairs.createPairs(schema, iterable, ctx); + const omap2 = new this(); + omap2.items = pairs$1.items; + return omap2; + } + }; + YAMLOMap.tag = "tag:yaml.org,2002:omap"; + var omap = { + collection: "seq", + identify: (value) => value instanceof Map, + nodeClass: YAMLOMap, + default: false, + tag: "tag:yaml.org,2002:omap", + resolve(seq, onError) { + const pairs$1 = pairs.resolvePairs(seq, onError); + const seenKeys = []; + for (const { key } of pairs$1.items) { + if (identity.isScalar(key)) { + if (seenKeys.includes(key.value)) { + onError(`Ordered maps must not include duplicate keys: ${key.value}`); + } else { + seenKeys.push(key.value); + } + } + } + return Object.assign(new YAMLOMap(), pairs$1); + }, + createNode: (schema, iterable, ctx) => YAMLOMap.from(schema, iterable, ctx) + }; + exports.YAMLOMap = YAMLOMap; + exports.omap = omap; + } +}); + +// +var require_bool2 = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + function boolStringify({ value, source }, ctx) { + const boolObj = value ? trueTag : falseTag; + if (source && boolObj.test.test(source)) + return source; + return value ? ctx.options.trueStr : ctx.options.falseStr; + } + var trueTag = { + identify: (value) => value === true, + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/, + resolve: () => new Scalar.Scalar(true), + stringify: boolStringify + }; + var falseTag = { + identify: (value) => value === false, + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/, + resolve: () => new Scalar.Scalar(false), + stringify: boolStringify + }; + exports.falseTag = falseTag; + exports.trueTag = trueTag; + } +}); + +// +var require_float2 = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + var stringifyNumber = require_stringifyNumber(); + var floatNaN = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/, + resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, + stringify: stringifyNumber.stringifyNumber + }; + var floatExp = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "EXP", + test: /^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/, + resolve: (str) => parseFloat(str.replace(/_/g, "")), + stringify(node) { + const num = Number(node.value); + return isFinite(num) ? num.toExponential() : stringifyNumber.stringifyNumber(node); + } + }; + var float = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/, + resolve(str) { + const node = new Scalar.Scalar(parseFloat(str.replace(/_/g, ""))); + const dot = str.indexOf("."); + if (dot !== -1) { + const f = str.substring(dot + 1).replace(/_/g, ""); + if (f[f.length - 1] === "0") + node.minFractionDigits = f.length; + } + return node; + }, + stringify: stringifyNumber.stringifyNumber + }; + exports.float = float; + exports.floatExp = floatExp; + exports.floatNaN = floatNaN; + } +}); + +// +var require_int2 = __commonJS({ + ""(exports) { + "use strict"; + var stringifyNumber = require_stringifyNumber(); + var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value); + function intResolve(str, offset, radix, { intAsBigInt }) { + const sign = str[0]; + if (sign === "-" || sign === "+") + offset += 1; + str = str.substring(offset).replace(/_/g, ""); + if (intAsBigInt) { + switch (radix) { + case 2: + str = `0b${str}`; + break; + case 8: + str = `0o${str}`; + break; + case 16: + str = `0x${str}`; + break; + } + const n2 = BigInt(str); + return sign === "-" ? BigInt(-1) * n2 : n2; + } + const n = parseInt(str, radix); + return sign === "-" ? -1 * n : n; + } + function intStringify(node, radix, prefix) { + const { value } = node; + if (intIdentify(value)) { + const str = value.toString(radix); + return value < 0 ? "-" + prefix + str.substr(1) : prefix + str; + } + return stringifyNumber.stringifyNumber(node); + } + var intBin = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + format: "BIN", + test: /^[-+]?0b[0-1_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 2, opt), + stringify: (node) => intStringify(node, 2, "0b") + }; + var intOct = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + format: "OCT", + test: /^[-+]?0[0-7_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 1, 8, opt), + stringify: (node) => intStringify(node, 8, "0") + }; + var int = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^[-+]?[0-9][0-9_]*$/, + resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt), + stringify: stringifyNumber.stringifyNumber + }; + var intHex = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + format: "HEX", + test: /^[-+]?0x[0-9a-fA-F_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt), + stringify: (node) => intStringify(node, 16, "0x") + }; + exports.int = int; + exports.intBin = intBin; + exports.intHex = intHex; + exports.intOct = intOct; + } +}); + +// +var require_set = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Pair = require_Pair(); + var YAMLMap = require_YAMLMap(); + var YAMLSet = class extends YAMLMap.YAMLMap { + constructor(schema) { + super(schema); + this.tag = YAMLSet.tag; + } + add(key) { + let pair; + if (identity.isPair(key)) + pair = key; + else if (key && typeof key === "object" && "key" in key && "value" in key && key.value === null) + pair = new Pair.Pair(key.key, null); + else + pair = new Pair.Pair(key, null); + const prev = YAMLMap.findPair(this.items, pair.key); + if (!prev) + this.items.push(pair); + } + get(key, keepPair) { + const pair = YAMLMap.findPair(this.items, key); + return !keepPair && identity.isPair(pair) ? identity.isScalar(pair.key) ? pair.key.value : pair.key : pair; + } + set(key, value) { + if (typeof value !== "boolean") + throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`); + const prev = YAMLMap.findPair(this.items, key); + if (prev && !value) { + this.items.splice(this.items.indexOf(prev), 1); + } else if (!prev && value) { + this.items.push(new Pair.Pair(key)); + } + } + toJSON(_, ctx) { + return super.toJSON(_, ctx, Set); + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + if (this.hasAllNullValues(true)) + return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep); + else + throw new Error("Set items must all have null values"); + } + static from(schema, iterable, ctx) { + const { replacer } = ctx; + const set2 = new this(schema); + if (iterable && Symbol.iterator in Object(iterable)) + for (let value of iterable) { + if (typeof replacer === "function") + value = replacer.call(iterable, value, value); + set2.items.push(Pair.createPair(value, null, ctx)); + } + return set2; + } + }; + YAMLSet.tag = "tag:yaml.org,2002:set"; + var set = { + collection: "map", + identify: (value) => value instanceof Set, + nodeClass: YAMLSet, + default: false, + tag: "tag:yaml.org,2002:set", + createNode: (schema, iterable, ctx) => YAMLSet.from(schema, iterable, ctx), + resolve(map, onError) { + if (identity.isMap(map)) { + if (map.hasAllNullValues(true)) + return Object.assign(new YAMLSet(), map); + else + onError("Set items must all have null values"); + } else + onError("Expected a mapping for this tag"); + return map; + } + }; + exports.YAMLSet = YAMLSet; + exports.set = set; + } +}); + +// +var require_timestamp = __commonJS({ + ""(exports) { + "use strict"; + var stringifyNumber = require_stringifyNumber(); + function parseSexagesimal(str, asBigInt) { + const sign = str[0]; + const parts = sign === "-" || sign === "+" ? str.substring(1) : str; + const num = (n) => asBigInt ? BigInt(n) : Number(n); + const res = parts.replace(/_/g, "").split(":").reduce((res2, p) => res2 * num(60) + num(p), num(0)); + return sign === "-" ? num(-1) * res : res; + } + function stringifySexagesimal(node) { + let { value } = node; + let num = (n) => n; + if (typeof value === "bigint") + num = (n) => BigInt(n); + else if (isNaN(value) || !isFinite(value)) + return stringifyNumber.stringifyNumber(node); + let sign = ""; + if (value < 0) { + sign = "-"; + value *= num(-1); + } + const _60 = num(60); + const parts = [value % _60]; + if (value < 60) { + parts.unshift(0); + } else { + value = (value - parts[0]) / _60; + parts.unshift(value % _60); + if (value >= 60) { + value = (value - parts[0]) / _60; + parts.unshift(value); + } + } + return sign + parts.map((n) => String(n).padStart(2, "0")).join(":").replace(/000000\d*$/, ""); + } + var intTime = { + identify: (value) => typeof value === "bigint" || Number.isInteger(value), + default: true, + tag: "tag:yaml.org,2002:int", + format: "TIME", + test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/, + resolve: (str, _onError, { intAsBigInt }) => parseSexagesimal(str, intAsBigInt), + stringify: stringifySexagesimal + }; + var floatTime = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "TIME", + test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/, + resolve: (str) => parseSexagesimal(str, false), + stringify: stringifySexagesimal + }; + var timestamp = { + identify: (value) => value instanceof Date, + default: true, + tag: "tag:yaml.org,2002:timestamp", + test: RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"), + resolve(str) { + const match = str.match(timestamp.test); + if (!match) + throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd"); + const [, year, month, day, hour, minute, second] = match.map(Number); + const millisec = match[7] ? Number((match[7] + "00").substr(1, 3)) : 0; + let date = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec); + const tz = match[8]; + if (tz && tz !== "Z") { + let d = parseSexagesimal(tz, false); + if (Math.abs(d) < 30) + d *= 60; + date -= 6e4 * d; + } + return new Date(date); + }, + stringify: ({ value }) => value.toISOString().replace(/(T00:00:00)?\.000Z$/, "") + }; + exports.floatTime = floatTime; + exports.intTime = intTime; + exports.timestamp = timestamp; + } +}); + +// +var require_schema3 = __commonJS({ + ""(exports) { + "use strict"; + var map = require_map(); + var _null = require_null(); + var seq = require_seq(); + var string = require_string(); + var binary = require_binary(); + var bool = require_bool2(); + var float = require_float2(); + var int = require_int2(); + var merge3 = require_merge(); + var omap = require_omap(); + var pairs = require_pairs(); + var set = require_set(); + var timestamp = require_timestamp(); + var schema = [ + map.map, + seq.seq, + string.string, + _null.nullTag, + bool.trueTag, + bool.falseTag, + int.intBin, + int.intOct, + int.int, + int.intHex, + float.floatNaN, + float.floatExp, + float.float, + binary.binary, + merge3.merge, + omap.omap, + pairs.pairs, + set.set, + timestamp.intTime, + timestamp.floatTime, + timestamp.timestamp + ]; + exports.schema = schema; + } +}); + +// +var require_tags = __commonJS({ + ""(exports) { + "use strict"; + var map = require_map(); + var _null = require_null(); + var seq = require_seq(); + var string = require_string(); + var bool = require_bool(); + var float = require_float(); + var int = require_int(); + var schema = require_schema(); + var schema$1 = require_schema2(); + var binary = require_binary(); + var merge3 = require_merge(); + var omap = require_omap(); + var pairs = require_pairs(); + var schema$2 = require_schema3(); + var set = require_set(); + var timestamp = require_timestamp(); + var schemas = /* @__PURE__ */ new Map([ + ["core", schema.schema], + ["failsafe", [map.map, seq.seq, string.string]], + ["json", schema$1.schema], + ["yaml11", schema$2.schema], + ["yaml-1.1", schema$2.schema] + ]); + var tagsByName = { + binary: binary.binary, + bool: bool.boolTag, + float: float.float, + floatExp: float.floatExp, + floatNaN: float.floatNaN, + floatTime: timestamp.floatTime, + int: int.int, + intHex: int.intHex, + intOct: int.intOct, + intTime: timestamp.intTime, + map: map.map, + merge: merge3.merge, + null: _null.nullTag, + omap: omap.omap, + pairs: pairs.pairs, + seq: seq.seq, + set: set.set, + timestamp: timestamp.timestamp + }; + var coreKnownTags = { + "tag:yaml.org,2002:binary": binary.binary, + "tag:yaml.org,2002:merge": merge3.merge, + "tag:yaml.org,2002:omap": omap.omap, + "tag:yaml.org,2002:pairs": pairs.pairs, + "tag:yaml.org,2002:set": set.set, + "tag:yaml.org,2002:timestamp": timestamp.timestamp + }; + function getTags(customTags, schemaName, addMergeTag) { + const schemaTags = schemas.get(schemaName); + if (schemaTags && !customTags) { + return addMergeTag && !schemaTags.includes(merge3.merge) ? schemaTags.concat(merge3.merge) : schemaTags.slice(); + } + let tags = schemaTags; + if (!tags) { + if (Array.isArray(customTags)) + tags = []; + else { + const keys = Array.from(schemas.keys()).filter((key) => key !== "yaml11").map((key) => JSON.stringify(key)).join(", "); + throw new Error(`Unknown schema "${schemaName}"; use one of ${keys} or define customTags array`); + } + } + if (Array.isArray(customTags)) { + for (const tag of customTags) + tags = tags.concat(tag); + } else if (typeof customTags === "function") { + tags = customTags(tags.slice()); + } + if (addMergeTag) + tags = tags.concat(merge3.merge); + return tags.reduce((tags2, tag) => { + const tagObj = typeof tag === "string" ? tagsByName[tag] : tag; + if (!tagObj) { + const tagName = JSON.stringify(tag); + const keys = Object.keys(tagsByName).map((key) => JSON.stringify(key)).join(", "); + throw new Error(`Unknown custom tag ${tagName}; use one of ${keys}`); + } + if (!tags2.includes(tagObj)) + tags2.push(tagObj); + return tags2; + }, []); + } + exports.coreKnownTags = coreKnownTags; + exports.getTags = getTags; + } +}); + +// +var require_Schema = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var map = require_map(); + var seq = require_seq(); + var string = require_string(); + var tags = require_tags(); + var sortMapEntriesByKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0; + var Schema = class { + constructor({ compat, customTags, merge: merge3, resolveKnownTags, schema, sortMapEntries, toStringDefaults }) { + this.compat = Array.isArray(compat) ? tags.getTags(compat, "compat") : compat ? tags.getTags(null, compat) : null; + this.name = typeof schema === "string" && schema || "core"; + this.knownTags = resolveKnownTags ? tags.coreKnownTags : {}; + this.tags = tags.getTags(customTags, this.name, merge3); + this.toStringOptions = toStringDefaults ?? null; + Object.defineProperty(this, identity.MAP, { value: map.map }); + Object.defineProperty(this, identity.SCALAR, { value: string.string }); + Object.defineProperty(this, identity.SEQ, { value: seq.seq }); + this.sortMapEntries = typeof sortMapEntries === "function" ? sortMapEntries : sortMapEntries === true ? sortMapEntriesByKey : null; + } + clone() { + const copy = Object.create(Schema.prototype, Object.getOwnPropertyDescriptors(this)); + copy.tags = this.tags.slice(); + return copy; + } + }; + exports.Schema = Schema; + } +}); + +// +var require_stringifyDocument = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var stringify = require_stringify(); + var stringifyComment = require_stringifyComment(); + function stringifyDocument(doc, options) { + var _a; + const lines = []; + let hasDirectives = options.directives === true; + if (options.directives !== false && doc.directives) { + const dir = doc.directives.toString(doc); + if (dir) { + lines.push(dir); + hasDirectives = true; + } else if (doc.directives.docStart) + hasDirectives = true; + } + if (hasDirectives) + lines.push("---"); + const ctx = stringify.createStringifyContext(doc, options); + const { commentString } = ctx.options; + if (doc.commentBefore) { + if (lines.length !== 1) + lines.unshift(""); + const cs = commentString(doc.commentBefore); + lines.unshift(stringifyComment.indentComment(cs, "")); + } + let chompKeep = false; + let contentComment = null; + if (doc.contents) { + if (identity.isNode(doc.contents)) { + if (doc.contents.spaceBefore && hasDirectives) + lines.push(""); + if (doc.contents.commentBefore) { + const cs = commentString(doc.contents.commentBefore); + lines.push(stringifyComment.indentComment(cs, "")); + } + ctx.forceBlockIndent = !!doc.comment; + contentComment = doc.contents.comment; + } + const onChompKeep = contentComment ? void 0 : () => chompKeep = true; + let body = stringify.stringify(doc.contents, ctx, () => contentComment = null, onChompKeep); + if (contentComment) + body += stringifyComment.lineComment(body, "", commentString(contentComment)); + if ((body[0] === "|" || body[0] === ">") && lines[lines.length - 1] === "---") { + lines[lines.length - 1] = `--- ${body}`; + } else + lines.push(body); + } else { + lines.push(stringify.stringify(doc.contents, ctx)); + } + if ((_a = doc.directives) == null ? void 0 : _a.docEnd) { + if (doc.comment) { + const cs = commentString(doc.comment); + if (cs.includes("\n")) { + lines.push("..."); + lines.push(stringifyComment.indentComment(cs, "")); + } else { + lines.push(`... ${cs}`); + } + } else { + lines.push("..."); + } + } else { + let dc = doc.comment; + if (dc && chompKeep) + dc = dc.replace(/^\n+/, ""); + if (dc) { + if ((!chompKeep || contentComment) && lines[lines.length - 1] !== "") + lines.push(""); + lines.push(stringifyComment.indentComment(commentString(dc), "")); + } + } + return lines.join("\n") + "\n"; + } + exports.stringifyDocument = stringifyDocument; + } +}); + +// +var require_Document = __commonJS({ + ""(exports) { + "use strict"; + var Alias = require_Alias(); + var Collection2 = require_Collection(); + var identity = require_identity(); + var Pair = require_Pair(); + var toJS = require_toJS(); + var Schema = require_Schema(); + var stringifyDocument = require_stringifyDocument(); + var anchors = require_anchors(); + var applyReviver = require_applyReviver(); + var createNode = require_createNode(); + var directives = require_directives(); + var Document = class { + constructor(value, replacer, options) { + this.commentBefore = null; + this.comment = null; + this.errors = []; + this.warnings = []; + Object.defineProperty(this, identity.NODE_TYPE, { value: identity.DOC }); + let _replacer = null; + if (typeof replacer === "function" || Array.isArray(replacer)) { + _replacer = replacer; + } else if (options === void 0 && replacer) { + options = replacer; + replacer = void 0; + } + const opt = Object.assign({ + intAsBigInt: false, + keepSourceTokens: false, + logLevel: "warn", + prettyErrors: true, + strict: true, + stringKeys: false, + uniqueKeys: true, + version: "1.2" + }, options); + this.options = opt; + let { version } = opt; + if (options == null ? void 0 : options._directives) { + this.directives = options._directives.atDocument(); + if (this.directives.yaml.explicit) + version = this.directives.yaml.version; + } else + this.directives = new directives.Directives({ version }); + this.setSchema(version, options); + this.contents = value === void 0 ? null : this.createNode(value, _replacer, options); + } + clone() { + const copy = Object.create(Document.prototype, { + [identity.NODE_TYPE]: { value: identity.DOC } + }); + copy.commentBefore = this.commentBefore; + copy.comment = this.comment; + copy.errors = this.errors.slice(); + copy.warnings = this.warnings.slice(); + copy.options = Object.assign({}, this.options); + if (this.directives) + copy.directives = this.directives.clone(); + copy.schema = this.schema.clone(); + copy.contents = identity.isNode(this.contents) ? this.contents.clone(copy.schema) : this.contents; + if (this.range) + copy.range = this.range.slice(); + return copy; + } + add(value) { + if (assertCollection(this.contents)) + this.contents.add(value); + } + addIn(path, value) { + if (assertCollection(this.contents)) + this.contents.addIn(path, value); + } + createAlias(node, name) { + if (!node.anchor) { + const prev = anchors.anchorNames(this); + node.anchor = !name || prev.has(name) ? anchors.findNewAnchor(name || "a", prev) : name; + } + return new Alias.Alias(node.anchor); + } + createNode(value, replacer, options) { + let _replacer = void 0; + if (typeof replacer === "function") { + value = replacer.call({ "": value }, "", value); + _replacer = replacer; + } else if (Array.isArray(replacer)) { + const keyToStr = (v) => typeof v === "number" || v instanceof String || v instanceof Number; + const asStr = replacer.filter(keyToStr).map(String); + if (asStr.length > 0) + replacer = replacer.concat(asStr); + _replacer = replacer; + } else if (options === void 0 && replacer) { + options = replacer; + replacer = void 0; + } + const { aliasDuplicateObjects, anchorPrefix, flow, keepUndefined, onTagObj, tag } = options ?? {}; + const { onAnchor, setAnchors, sourceObjects } = anchors.createNodeAnchors( + this, + anchorPrefix || "a" + ); + const ctx = { + aliasDuplicateObjects: aliasDuplicateObjects ?? true, + keepUndefined: keepUndefined ?? false, + onAnchor, + onTagObj, + replacer: _replacer, + schema: this.schema, + sourceObjects + }; + const node = createNode.createNode(value, tag, ctx); + if (flow && identity.isCollection(node)) + node.flow = true; + setAnchors(); + return node; + } + createPair(key, value, options = {}) { + const k = this.createNode(key, null, options); + const v = this.createNode(value, null, options); + return new Pair.Pair(k, v); + } + delete(key) { + return assertCollection(this.contents) ? this.contents.delete(key) : false; + } + deleteIn(path) { + if (Collection2.isEmptyPath(path)) { + if (this.contents == null) + return false; + this.contents = null; + return true; + } + return assertCollection(this.contents) ? this.contents.deleteIn(path) : false; + } + get(key, keepScalar) { + return identity.isCollection(this.contents) ? this.contents.get(key, keepScalar) : void 0; + } + getIn(path, keepScalar) { + if (Collection2.isEmptyPath(path)) + return !keepScalar && identity.isScalar(this.contents) ? this.contents.value : this.contents; + return identity.isCollection(this.contents) ? this.contents.getIn(path, keepScalar) : void 0; + } + has(key) { + return identity.isCollection(this.contents) ? this.contents.has(key) : false; + } + hasIn(path) { + if (Collection2.isEmptyPath(path)) + return this.contents !== void 0; + return identity.isCollection(this.contents) ? this.contents.hasIn(path) : false; + } + set(key, value) { + if (this.contents == null) { + this.contents = Collection2.collectionFromPath(this.schema, [key], value); + } else if (assertCollection(this.contents)) { + this.contents.set(key, value); + } + } + setIn(path, value) { + if (Collection2.isEmptyPath(path)) { + this.contents = value; + } else if (this.contents == null) { + this.contents = Collection2.collectionFromPath(this.schema, Array.from(path), value); + } else if (assertCollection(this.contents)) { + this.contents.setIn(path, value); + } + } + setSchema(version, options = {}) { + if (typeof version === "number") + version = String(version); + let opt; + switch (version) { + case "1.1": + if (this.directives) + this.directives.yaml.version = "1.1"; + else + this.directives = new directives.Directives({ version: "1.1" }); + opt = { resolveKnownTags: false, schema: "yaml-1.1" }; + break; + case "1.2": + case "next": + if (this.directives) + this.directives.yaml.version = version; + else + this.directives = new directives.Directives({ version }); + opt = { resolveKnownTags: true, schema: "core" }; + break; + case null: + if (this.directives) + delete this.directives; + opt = null; + break; + default: { + const sv = JSON.stringify(version); + throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${sv}`); + } + } + if (options.schema instanceof Object) + this.schema = options.schema; + else if (opt) + this.schema = new Schema.Schema(Object.assign(opt, options)); + else + throw new Error(`With a null YAML version, the { schema: Schema } option is required`); + } + toJS({ json, jsonArg, mapAsMap, maxAliasCount, onAnchor, reviver } = {}) { + const ctx = { + anchors: /* @__PURE__ */ new Map(), + doc: this, + keep: !json, + mapAsMap: mapAsMap === true, + mapKeyWarned: false, + maxAliasCount: typeof maxAliasCount === "number" ? maxAliasCount : 100 + }; + const res = toJS.toJS(this.contents, jsonArg ?? "", ctx); + if (typeof onAnchor === "function") + for (const { count, res: res2 } of ctx.anchors.values()) + onAnchor(res2, count); + return typeof reviver === "function" ? applyReviver.applyReviver(reviver, { "": res }, "", res) : res; + } + toJSON(jsonArg, onAnchor) { + return this.toJS({ json: true, jsonArg, mapAsMap: false, onAnchor }); + } + toString(options = {}) { + if (this.errors.length > 0) + throw new Error("Document with errors cannot be stringified"); + if ("indent" in options && (!Number.isInteger(options.indent) || Number(options.indent) <= 0)) { + const s = JSON.stringify(options.indent); + throw new Error(`"indent" option must be a positive integer, not ${s}`); + } + return stringifyDocument.stringifyDocument(this, options); + } + }; + function assertCollection(contents) { + if (identity.isCollection(contents)) + return true; + throw new Error("Expected a YAML collection as document contents"); + } + exports.Document = Document; + } +}); + +// +var require_errors = __commonJS({ + ""(exports) { + "use strict"; + var YAMLError = class extends Error { + constructor(name, pos, code, message) { + super(); + this.name = name; + this.code = code; + this.message = message; + this.pos = pos; + } + }; + var YAMLParseError = class extends YAMLError { + constructor(pos, code, message) { + super("YAMLParseError", pos, code, message); + } + }; + var YAMLWarning = class extends YAMLError { + constructor(pos, code, message) { + super("YAMLWarning", pos, code, message); + } + }; + var prettifyError = (src, lc) => (error) => { + if (error.pos[0] === -1) + return; + error.linePos = error.pos.map((pos) => lc.linePos(pos)); + const { line, col } = error.linePos[0]; + error.message += ` at line ${line}, column ${col}`; + let ci = col - 1; + let lineStr = src.substring(lc.lineStarts[line - 1], lc.lineStarts[line]).replace(/[\n\r]+$/, ""); + if (ci >= 60 && lineStr.length > 80) { + const trimStart = Math.min(ci - 39, lineStr.length - 79); + lineStr = "\u2026" + lineStr.substring(trimStart); + ci -= trimStart - 1; + } + if (lineStr.length > 80) + lineStr = lineStr.substring(0, 79) + "\u2026"; + if (line > 1 && /^ *$/.test(lineStr.substring(0, ci))) { + let prev = src.substring(lc.lineStarts[line - 2], lc.lineStarts[line - 1]); + if (prev.length > 80) + prev = prev.substring(0, 79) + "\u2026\n"; + lineStr = prev + lineStr; + } + if (/[^ ]/.test(lineStr)) { + let count = 1; + const end = error.linePos[1]; + if (end && end.line === line && end.col > col) { + count = Math.max(1, Math.min(end.col - col, 80 - ci)); + } + const pointer = " ".repeat(ci) + "^".repeat(count); + error.message += `: + +${lineStr} +${pointer} +`; + } + }; + exports.YAMLError = YAMLError; + exports.YAMLParseError = YAMLParseError; + exports.YAMLWarning = YAMLWarning; + exports.prettifyError = prettifyError; + } +}); + +// +var require_resolve_props = __commonJS({ + ""(exports) { + "use strict"; + function resolveProps(tokens, { flow, indicator, next, offset, onError, parentIndent, startOnNewline }) { + let spaceBefore = false; + let atNewline = startOnNewline; + let hasSpace = startOnNewline; + let comment = ""; + let commentSep = ""; + let hasNewline = false; + let reqSpace = false; + let tab = null; + let anchor = null; + let tag = null; + let newlineAfterProp = null; + let comma = null; + let found = null; + let start = null; + for (const token of tokens) { + if (reqSpace) { + if (token.type !== "space" && token.type !== "newline" && token.type !== "comma") + onError(token.offset, "MISSING_CHAR", "Tags and anchors must be separated from the next token by white space"); + reqSpace = false; + } + if (tab) { + if (atNewline && token.type !== "comment" && token.type !== "newline") { + onError(tab, "TAB_AS_INDENT", "Tabs are not allowed as indentation"); + } + tab = null; + } + switch (token.type) { + case "space": + if (!flow && (indicator !== "doc-start" || (next == null ? void 0 : next.type) !== "flow-collection") && token.source.includes(" ")) { + tab = token; + } + hasSpace = true; + break; + case "comment": { + if (!hasSpace) + onError(token, "MISSING_CHAR", "Comments must be separated from other tokens by white space characters"); + const cb = token.source.substring(1) || " "; + if (!comment) + comment = cb; + else + comment += commentSep + cb; + commentSep = ""; + atNewline = false; + break; + } + case "newline": + if (atNewline) { + if (comment) + comment += token.source; + else if (!found || indicator !== "seq-item-ind") + spaceBefore = true; + } else + commentSep += token.source; + atNewline = true; + hasNewline = true; + if (anchor || tag) + newlineAfterProp = token; + hasSpace = true; + break; + case "anchor": + if (anchor) + onError(token, "MULTIPLE_ANCHORS", "A node can have at most one anchor"); + if (token.source.endsWith(":")) + onError(token.offset + token.source.length - 1, "BAD_ALIAS", "Anchor ending in : is ambiguous", true); + anchor = token; + if (start === null) + start = token.offset; + atNewline = false; + hasSpace = false; + reqSpace = true; + break; + case "tag": { + if (tag) + onError(token, "MULTIPLE_TAGS", "A node can have at most one tag"); + tag = token; + if (start === null) + start = token.offset; + atNewline = false; + hasSpace = false; + reqSpace = true; + break; + } + case indicator: + if (anchor || tag) + onError(token, "BAD_PROP_ORDER", `Anchors and tags must be after the ${token.source} indicator`); + if (found) + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${token.source} in ${flow ?? "collection"}`); + found = token; + atNewline = indicator === "seq-item-ind" || indicator === "explicit-key-ind"; + hasSpace = false; + break; + case "comma": + if (flow) { + if (comma) + onError(token, "UNEXPECTED_TOKEN", `Unexpected , in ${flow}`); + comma = token; + atNewline = false; + hasSpace = false; + break; + } + default: + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${token.type} token`); + atNewline = false; + hasSpace = false; + } + } + const last = tokens[tokens.length - 1]; + const end = last ? last.offset + last.source.length : offset; + if (reqSpace && next && next.type !== "space" && next.type !== "newline" && next.type !== "comma" && (next.type !== "scalar" || next.source !== "")) { + onError(next.offset, "MISSING_CHAR", "Tags and anchors must be separated from the next token by white space"); + } + if (tab && (atNewline && tab.indent <= parentIndent || (next == null ? void 0 : next.type) === "block-map" || (next == null ? void 0 : next.type) === "block-seq")) + onError(tab, "TAB_AS_INDENT", "Tabs are not allowed as indentation"); + return { + comma, + found, + spaceBefore, + comment, + hasNewline, + anchor, + tag, + newlineAfterProp, + end, + start: start ?? end + }; + } + exports.resolveProps = resolveProps; + } +}); + +// +var require_util_contains_newline = __commonJS({ + ""(exports) { + "use strict"; + function containsNewline(key) { + if (!key) + return null; + switch (key.type) { + case "alias": + case "scalar": + case "double-quoted-scalar": + case "single-quoted-scalar": + if (key.source.includes("\n")) + return true; + if (key.end) { + for (const st of key.end) + if (st.type === "newline") + return true; + } + return false; + case "flow-collection": + for (const it of key.items) { + for (const st of it.start) + if (st.type === "newline") + return true; + if (it.sep) { + for (const st of it.sep) + if (st.type === "newline") + return true; + } + if (containsNewline(it.key) || containsNewline(it.value)) + return true; + } + return false; + default: + return true; + } + } + exports.containsNewline = containsNewline; + } +}); + +// +var require_util_flow_indent_check = __commonJS({ + ""(exports) { + "use strict"; + var utilContainsNewline = require_util_contains_newline(); + function flowIndentCheck(indent, fc, onError) { + if ((fc == null ? void 0 : fc.type) === "flow-collection") { + const end = fc.end[0]; + if (end.indent === indent && (end.source === "]" || end.source === "}") && utilContainsNewline.containsNewline(fc)) { + const msg = "Flow end indicator should be more indented than parent"; + onError(end, "BAD_INDENT", msg, true); + } + } + } + exports.flowIndentCheck = flowIndentCheck; + } +}); + +// +var require_util_map_includes = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + function mapIncludes(ctx, items, search) { + const { uniqueKeys } = ctx.options; + if (uniqueKeys === false) + return false; + const isEqual = typeof uniqueKeys === "function" ? uniqueKeys : (a, b) => a === b || identity.isScalar(a) && identity.isScalar(b) && a.value === b.value; + return items.some((pair) => isEqual(pair.key, search)); + } + exports.mapIncludes = mapIncludes; + } +}); + +// +var require_resolve_block_map = __commonJS({ + ""(exports) { + "use strict"; + var Pair = require_Pair(); + var YAMLMap = require_YAMLMap(); + var resolveProps = require_resolve_props(); + var utilContainsNewline = require_util_contains_newline(); + var utilFlowIndentCheck = require_util_flow_indent_check(); + var utilMapIncludes = require_util_map_includes(); + var startColMsg = "All mapping items must start at the same column"; + function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError, tag) { + var _a; + const NodeClass = (tag == null ? void 0 : tag.nodeClass) ?? YAMLMap.YAMLMap; + const map = new NodeClass(ctx.schema); + if (ctx.atRoot) + ctx.atRoot = false; + let offset = bm.offset; + let commentEnd = null; + for (const collItem of bm.items) { + const { start, key, sep: sep2, value } = collItem; + const keyProps = resolveProps.resolveProps(start, { + indicator: "explicit-key-ind", + next: key ?? (sep2 == null ? void 0 : sep2[0]), + offset, + onError, + parentIndent: bm.indent, + startOnNewline: true + }); + const implicitKey = !keyProps.found; + if (implicitKey) { + if (key) { + if (key.type === "block-seq") + onError(offset, "BLOCK_AS_IMPLICIT_KEY", "A block sequence may not be used as an implicit map key"); + else if ("indent" in key && key.indent !== bm.indent) + onError(offset, "BAD_INDENT", startColMsg); + } + if (!keyProps.anchor && !keyProps.tag && !sep2) { + commentEnd = keyProps.end; + if (keyProps.comment) { + if (map.comment) + map.comment += "\n" + keyProps.comment; + else + map.comment = keyProps.comment; + } + continue; + } + if (keyProps.newlineAfterProp || utilContainsNewline.containsNewline(key)) { + onError(key ?? start[start.length - 1], "MULTILINE_IMPLICIT_KEY", "Implicit keys need to be on a single line"); + } + } else if (((_a = keyProps.found) == null ? void 0 : _a.indent) !== bm.indent) { + onError(offset, "BAD_INDENT", startColMsg); + } + ctx.atKey = true; + const keyStart = keyProps.end; + const keyNode = key ? composeNode(ctx, key, keyProps, onError) : composeEmptyNode(ctx, keyStart, start, null, keyProps, onError); + if (ctx.schema.compat) + utilFlowIndentCheck.flowIndentCheck(bm.indent, key, onError); + ctx.atKey = false; + if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode)) + onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique"); + const valueProps = resolveProps.resolveProps(sep2 ?? [], { + indicator: "map-value-ind", + next: value, + offset: keyNode.range[2], + onError, + parentIndent: bm.indent, + startOnNewline: !key || key.type === "block-scalar" + }); + offset = valueProps.end; + if (valueProps.found) { + if (implicitKey) { + if ((value == null ? void 0 : value.type) === "block-map" && !valueProps.hasNewline) + onError(offset, "BLOCK_AS_IMPLICIT_KEY", "Nested mappings are not allowed in compact mappings"); + if (ctx.options.strict && keyProps.start < valueProps.found.offset - 1024) + onError(keyNode.range, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit block mapping key"); + } + const valueNode = value ? composeNode(ctx, value, valueProps, onError) : composeEmptyNode(ctx, offset, sep2, null, valueProps, onError); + if (ctx.schema.compat) + utilFlowIndentCheck.flowIndentCheck(bm.indent, value, onError); + offset = valueNode.range[2]; + const pair = new Pair.Pair(keyNode, valueNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + map.items.push(pair); + } else { + if (implicitKey) + onError(keyNode.range, "MISSING_CHAR", "Implicit map keys need to be followed by map values"); + if (valueProps.comment) { + if (keyNode.comment) + keyNode.comment += "\n" + valueProps.comment; + else + keyNode.comment = valueProps.comment; + } + const pair = new Pair.Pair(keyNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + map.items.push(pair); + } + } + if (commentEnd && commentEnd < offset) + onError(commentEnd, "IMPOSSIBLE", "Map comment with trailing content"); + map.range = [bm.offset, offset, commentEnd ?? offset]; + return map; + } + exports.resolveBlockMap = resolveBlockMap; + } +}); + +// +var require_resolve_block_seq = __commonJS({ + ""(exports) { + "use strict"; + var YAMLSeq = require_YAMLSeq(); + var resolveProps = require_resolve_props(); + var utilFlowIndentCheck = require_util_flow_indent_check(); + function resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError, tag) { + const NodeClass = (tag == null ? void 0 : tag.nodeClass) ?? YAMLSeq.YAMLSeq; + const seq = new NodeClass(ctx.schema); + if (ctx.atRoot) + ctx.atRoot = false; + if (ctx.atKey) + ctx.atKey = false; + let offset = bs.offset; + let commentEnd = null; + for (const { start, value } of bs.items) { + const props = resolveProps.resolveProps(start, { + indicator: "seq-item-ind", + next: value, + offset, + onError, + parentIndent: bs.indent, + startOnNewline: true + }); + if (!props.found) { + if (props.anchor || props.tag || value) { + if (value && value.type === "block-seq") + onError(props.end, "BAD_INDENT", "All sequence items must start at the same column"); + else + onError(offset, "MISSING_CHAR", "Sequence item without - indicator"); + } else { + commentEnd = props.end; + if (props.comment) + seq.comment = props.comment; + continue; + } + } + const node = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end, start, null, props, onError); + if (ctx.schema.compat) + utilFlowIndentCheck.flowIndentCheck(bs.indent, value, onError); + offset = node.range[2]; + seq.items.push(node); + } + seq.range = [bs.offset, offset, commentEnd ?? offset]; + return seq; + } + exports.resolveBlockSeq = resolveBlockSeq; + } +}); + +// +var require_resolve_end = __commonJS({ + ""(exports) { + "use strict"; + function resolveEnd(end, offset, reqSpace, onError) { + let comment = ""; + if (end) { + let hasSpace = false; + let sep2 = ""; + for (const token of end) { + const { source, type } = token; + switch (type) { + case "space": + hasSpace = true; + break; + case "comment": { + if (reqSpace && !hasSpace) + onError(token, "MISSING_CHAR", "Comments must be separated from other tokens by white space characters"); + const cb = source.substring(1) || " "; + if (!comment) + comment = cb; + else + comment += sep2 + cb; + sep2 = ""; + break; + } + case "newline": + if (comment) + sep2 += source; + hasSpace = true; + break; + default: + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${type} at node end`); + } + offset += source.length; + } + } + return { comment, offset }; + } + exports.resolveEnd = resolveEnd; + } +}); + +// +var require_resolve_flow_collection = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Pair = require_Pair(); + var YAMLMap = require_YAMLMap(); + var YAMLSeq = require_YAMLSeq(); + var resolveEnd = require_resolve_end(); + var resolveProps = require_resolve_props(); + var utilContainsNewline = require_util_contains_newline(); + var utilMapIncludes = require_util_map_includes(); + var blockMsg = "Block collections are not allowed within flow collections"; + var isBlock = (token) => token && (token.type === "block-map" || token.type === "block-seq"); + function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onError, tag) { + const isMap = fc.start.source === "{"; + const fcName = isMap ? "flow map" : "flow sequence"; + const NodeClass = (tag == null ? void 0 : tag.nodeClass) ?? (isMap ? YAMLMap.YAMLMap : YAMLSeq.YAMLSeq); + const coll = new NodeClass(ctx.schema); + coll.flow = true; + const atRoot = ctx.atRoot; + if (atRoot) + ctx.atRoot = false; + if (ctx.atKey) + ctx.atKey = false; + let offset = fc.offset + fc.start.source.length; + for (let i = 0; i < fc.items.length; ++i) { + const collItem = fc.items[i]; + const { start, key, sep: sep2, value } = collItem; + const props = resolveProps.resolveProps(start, { + flow: fcName, + indicator: "explicit-key-ind", + next: key ?? (sep2 == null ? void 0 : sep2[0]), + offset, + onError, + parentIndent: fc.indent, + startOnNewline: false + }); + if (!props.found) { + if (!props.anchor && !props.tag && !sep2 && !value) { + if (i === 0 && props.comma) + onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`); + else if (i < fc.items.length - 1) + onError(props.start, "UNEXPECTED_TOKEN", `Unexpected empty item in ${fcName}`); + if (props.comment) { + if (coll.comment) + coll.comment += "\n" + props.comment; + else + coll.comment = props.comment; + } + offset = props.end; + continue; + } + if (!isMap && ctx.options.strict && utilContainsNewline.containsNewline(key)) + onError( + key, + "MULTILINE_IMPLICIT_KEY", + "Implicit keys of flow sequence pairs need to be on a single line" + ); + } + if (i === 0) { + if (props.comma) + onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`); + } else { + if (!props.comma) + onError(props.start, "MISSING_CHAR", `Missing , between ${fcName} items`); + if (props.comment) { + let prevItemComment = ""; + loop: + for (const st of start) { + switch (st.type) { + case "comma": + case "space": + break; + case "comment": + prevItemComment = st.source.substring(1); + break loop; + default: + break loop; + } + } + if (prevItemComment) { + let prev = coll.items[coll.items.length - 1]; + if (identity.isPair(prev)) + prev = prev.value ?? prev.key; + if (prev.comment) + prev.comment += "\n" + prevItemComment; + else + prev.comment = prevItemComment; + props.comment = props.comment.substring(prevItemComment.length + 1); + } + } + } + if (!isMap && !sep2 && !props.found) { + const valueNode = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end, sep2, null, props, onError); + coll.items.push(valueNode); + offset = valueNode.range[2]; + if (isBlock(value)) + onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg); + } else { + ctx.atKey = true; + const keyStart = props.end; + const keyNode = key ? composeNode(ctx, key, props, onError) : composeEmptyNode(ctx, keyStart, start, null, props, onError); + if (isBlock(key)) + onError(keyNode.range, "BLOCK_IN_FLOW", blockMsg); + ctx.atKey = false; + const valueProps = resolveProps.resolveProps(sep2 ?? [], { + flow: fcName, + indicator: "map-value-ind", + next: value, + offset: keyNode.range[2], + onError, + parentIndent: fc.indent, + startOnNewline: false + }); + if (valueProps.found) { + if (!isMap && !props.found && ctx.options.strict) { + if (sep2) + for (const st of sep2) { + if (st === valueProps.found) + break; + if (st.type === "newline") { + onError(st, "MULTILINE_IMPLICIT_KEY", "Implicit keys of flow sequence pairs need to be on a single line"); + break; + } + } + if (props.start < valueProps.found.offset - 1024) + onError(valueProps.found, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit flow sequence key"); + } + } else if (value) { + if ("source" in value && value.source && value.source[0] === ":") + onError(value, "MISSING_CHAR", `Missing space after : in ${fcName}`); + else + onError(valueProps.start, "MISSING_CHAR", `Missing , or : between ${fcName} items`); + } + const valueNode = value ? composeNode(ctx, value, valueProps, onError) : valueProps.found ? composeEmptyNode(ctx, valueProps.end, sep2, null, valueProps, onError) : null; + if (valueNode) { + if (isBlock(value)) + onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg); + } else if (valueProps.comment) { + if (keyNode.comment) + keyNode.comment += "\n" + valueProps.comment; + else + keyNode.comment = valueProps.comment; + } + const pair = new Pair.Pair(keyNode, valueNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + if (isMap) { + const map = coll; + if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode)) + onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique"); + map.items.push(pair); + } else { + const map = new YAMLMap.YAMLMap(ctx.schema); + map.flow = true; + map.items.push(pair); + const endRange = (valueNode ?? keyNode).range; + map.range = [keyNode.range[0], endRange[1], endRange[2]]; + coll.items.push(map); + } + offset = valueNode ? valueNode.range[2] : valueProps.end; + } + } + const expectedEnd = isMap ? "}" : "]"; + const [ce, ...ee] = fc.end; + let cePos = offset; + if (ce && ce.source === expectedEnd) + cePos = ce.offset + ce.source.length; + else { + const name = fcName[0].toUpperCase() + fcName.substring(1); + const msg = atRoot ? `${name} must end with a ${expectedEnd}` : `${name} in block collection must be sufficiently indented and end with a ${expectedEnd}`; + onError(offset, atRoot ? "MISSING_CHAR" : "BAD_INDENT", msg); + if (ce && ce.source.length !== 1) + ee.unshift(ce); + } + if (ee.length > 0) { + const end = resolveEnd.resolveEnd(ee, cePos, ctx.options.strict, onError); + if (end.comment) { + if (coll.comment) + coll.comment += "\n" + end.comment; + else + coll.comment = end.comment; + } + coll.range = [fc.offset, cePos, end.offset]; + } else { + coll.range = [fc.offset, cePos, cePos]; + } + return coll; + } + exports.resolveFlowCollection = resolveFlowCollection; + } +}); + +// +var require_compose_collection = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Scalar = require_Scalar(); + var YAMLMap = require_YAMLMap(); + var YAMLSeq = require_YAMLSeq(); + var resolveBlockMap = require_resolve_block_map(); + var resolveBlockSeq = require_resolve_block_seq(); + var resolveFlowCollection = require_resolve_flow_collection(); + function resolveCollection(CN, ctx, token, onError, tagName, tag) { + const coll = token.type === "block-map" ? resolveBlockMap.resolveBlockMap(CN, ctx, token, onError, tag) : token.type === "block-seq" ? resolveBlockSeq.resolveBlockSeq(CN, ctx, token, onError, tag) : resolveFlowCollection.resolveFlowCollection(CN, ctx, token, onError, tag); + const Coll = coll.constructor; + if (tagName === "!" || tagName === Coll.tagName) { + coll.tag = Coll.tagName; + return coll; + } + if (tagName) + coll.tag = tagName; + return coll; + } + function composeCollection(CN, ctx, token, props, onError) { + var _a; + const tagToken = props.tag; + const tagName = !tagToken ? null : ctx.directives.tagName(tagToken.source, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg)); + if (token.type === "block-seq") { + const { anchor, newlineAfterProp: nl } = props; + const lastProp = anchor && tagToken ? anchor.offset > tagToken.offset ? anchor : tagToken : anchor ?? tagToken; + if (lastProp && (!nl || nl.offset < lastProp.offset)) { + const message = "Missing newline after block sequence props"; + onError(lastProp, "MISSING_CHAR", message); + } + } + const expType = token.type === "block-map" ? "map" : token.type === "block-seq" ? "seq" : token.start.source === "{" ? "map" : "seq"; + if (!tagToken || !tagName || tagName === "!" || tagName === YAMLMap.YAMLMap.tagName && expType === "map" || tagName === YAMLSeq.YAMLSeq.tagName && expType === "seq") { + return resolveCollection(CN, ctx, token, onError, tagName); + } + let tag = ctx.schema.tags.find((t) => t.tag === tagName && t.collection === expType); + if (!tag) { + const kt = ctx.schema.knownTags[tagName]; + if (kt && kt.collection === expType) { + ctx.schema.tags.push(Object.assign({}, kt, { default: false })); + tag = kt; + } else { + if (kt == null ? void 0 : kt.collection) { + onError(tagToken, "BAD_COLLECTION_TYPE", `${kt.tag} used for ${expType} collection, but expects ${kt.collection}`, true); + } else { + onError(tagToken, "TAG_RESOLVE_FAILED", `Unresolved tag: ${tagName}`, true); + } + return resolveCollection(CN, ctx, token, onError, tagName); + } + } + const coll = resolveCollection(CN, ctx, token, onError, tagName, tag); + const res = ((_a = tag.resolve) == null ? void 0 : _a.call(tag, coll, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg), ctx.options)) ?? coll; + const node = identity.isNode(res) ? res : new Scalar.Scalar(res); + node.range = coll.range; + node.tag = tagName; + if (tag == null ? void 0 : tag.format) + node.format = tag.format; + return node; + } + exports.composeCollection = composeCollection; + } +}); + +// +var require_resolve_block_scalar = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + function resolveBlockScalar(ctx, scalar, onError) { + const start = scalar.offset; + const header = parseBlockScalarHeader(scalar, ctx.options.strict, onError); + if (!header) + return { value: "", type: null, comment: "", range: [start, start, start] }; + const type = header.mode === ">" ? Scalar.Scalar.BLOCK_FOLDED : Scalar.Scalar.BLOCK_LITERAL; + const lines = scalar.source ? splitLines(scalar.source) : []; + let chompStart = lines.length; + for (let i = lines.length - 1; i >= 0; --i) { + const content = lines[i][1]; + if (content === "" || content === "\r") + chompStart = i; + else + break; + } + if (chompStart === 0) { + const value2 = header.chomp === "+" && lines.length > 0 ? "\n".repeat(Math.max(1, lines.length - 1)) : ""; + let end2 = start + header.length; + if (scalar.source) + end2 += scalar.source.length; + return { value: value2, type, comment: header.comment, range: [start, end2, end2] }; + } + let trimIndent = scalar.indent + header.indent; + let offset = scalar.offset + header.length; + let contentStart = 0; + for (let i = 0; i < chompStart; ++i) { + const [indent, content] = lines[i]; + if (content === "" || content === "\r") { + if (header.indent === 0 && indent.length > trimIndent) + trimIndent = indent.length; + } else { + if (indent.length < trimIndent) { + const message = "Block scalars with more-indented leading empty lines must use an explicit indentation indicator"; + onError(offset + indent.length, "MISSING_CHAR", message); + } + if (header.indent === 0) + trimIndent = indent.length; + contentStart = i; + if (trimIndent === 0 && !ctx.atRoot) { + const message = "Block scalar values in collections must be indented"; + onError(offset, "BAD_INDENT", message); + } + break; + } + offset += indent.length + content.length + 1; + } + for (let i = lines.length - 1; i >= chompStart; --i) { + if (lines[i][0].length > trimIndent) + chompStart = i + 1; + } + let value = ""; + let sep2 = ""; + let prevMoreIndented = false; + for (let i = 0; i < contentStart; ++i) + value += lines[i][0].slice(trimIndent) + "\n"; + for (let i = contentStart; i < chompStart; ++i) { + let [indent, content] = lines[i]; + offset += indent.length + content.length + 1; + const crlf = content[content.length - 1] === "\r"; + if (crlf) + content = content.slice(0, -1); + if (content && indent.length < trimIndent) { + const src = header.indent ? "explicit indentation indicator" : "first line"; + const message = `Block scalar lines must not be less indented than their ${src}`; + onError(offset - content.length - (crlf ? 2 : 1), "BAD_INDENT", message); + indent = ""; + } + if (type === Scalar.Scalar.BLOCK_LITERAL) { + value += sep2 + indent.slice(trimIndent) + content; + sep2 = "\n"; + } else if (indent.length > trimIndent || content[0] === " ") { + if (sep2 === " ") + sep2 = "\n"; + else if (!prevMoreIndented && sep2 === "\n") + sep2 = "\n\n"; + value += sep2 + indent.slice(trimIndent) + content; + sep2 = "\n"; + prevMoreIndented = true; + } else if (content === "") { + if (sep2 === "\n") + value += "\n"; + else + sep2 = "\n"; + } else { + value += sep2 + content; + sep2 = " "; + prevMoreIndented = false; + } + } + switch (header.chomp) { + case "-": + break; + case "+": + for (let i = chompStart; i < lines.length; ++i) + value += "\n" + lines[i][0].slice(trimIndent); + if (value[value.length - 1] !== "\n") + value += "\n"; + break; + default: + value += "\n"; + } + const end = start + header.length + scalar.source.length; + return { value, type, comment: header.comment, range: [start, end, end] }; + } + function parseBlockScalarHeader({ offset, props }, strict, onError) { + if (props[0].type !== "block-scalar-header") { + onError(props[0], "IMPOSSIBLE", "Block scalar header not found"); + return null; + } + const { source } = props[0]; + const mode = source[0]; + let indent = 0; + let chomp = ""; + let error = -1; + for (let i = 1; i < source.length; ++i) { + const ch = source[i]; + if (!chomp && (ch === "-" || ch === "+")) + chomp = ch; + else { + const n = Number(ch); + if (!indent && n) + indent = n; + else if (error === -1) + error = offset + i; + } + } + if (error !== -1) + onError(error, "UNEXPECTED_TOKEN", `Block scalar header includes extra characters: ${source}`); + let hasSpace = false; + let comment = ""; + let length = source.length; + for (let i = 1; i < props.length; ++i) { + const token = props[i]; + switch (token.type) { + case "space": + hasSpace = true; + case "newline": + length += token.source.length; + break; + case "comment": + if (strict && !hasSpace) { + const message = "Comments must be separated from other tokens by white space characters"; + onError(token, "MISSING_CHAR", message); + } + length += token.source.length; + comment = token.source.substring(1); + break; + case "error": + onError(token, "UNEXPECTED_TOKEN", token.message); + length += token.source.length; + break; + default: { + const message = `Unexpected token in block scalar header: ${token.type}`; + onError(token, "UNEXPECTED_TOKEN", message); + const ts = token.source; + if (ts && typeof ts === "string") + length += ts.length; + } + } + } + return { mode, indent, chomp, comment, length }; + } + function splitLines(source) { + const split = source.split(/\n( *)/); + const first = split[0]; + const m = first.match(/^( *)/); + const line0 = (m == null ? void 0 : m[1]) ? [m[1], first.slice(m[1].length)] : ["", first]; + const lines = [line0]; + for (let i = 1; i < split.length; i += 2) + lines.push([split[i], split[i + 1]]); + return lines; + } + exports.resolveBlockScalar = resolveBlockScalar; + } +}); + +// +var require_resolve_flow_scalar = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + var resolveEnd = require_resolve_end(); + function resolveFlowScalar(scalar, strict, onError) { + const { offset, type, source, end } = scalar; + let _type; + let value; + const _onError = (rel, code, msg) => onError(offset + rel, code, msg); + switch (type) { + case "scalar": + _type = Scalar.Scalar.PLAIN; + value = plainValue(source, _onError); + break; + case "single-quoted-scalar": + _type = Scalar.Scalar.QUOTE_SINGLE; + value = singleQuotedValue(source, _onError); + break; + case "double-quoted-scalar": + _type = Scalar.Scalar.QUOTE_DOUBLE; + value = doubleQuotedValue(source, _onError); + break; + default: + onError(scalar, "UNEXPECTED_TOKEN", `Expected a flow scalar value, but found: ${type}`); + return { + value: "", + type: null, + comment: "", + range: [offset, offset + source.length, offset + source.length] + }; + } + const valueEnd = offset + source.length; + const re = resolveEnd.resolveEnd(end, valueEnd, strict, onError); + return { + value, + type: _type, + comment: re.comment, + range: [offset, valueEnd, re.offset] + }; + } + function plainValue(source, onError) { + let badChar = ""; + switch (source[0]) { + case " ": + badChar = "a tab character"; + break; + case ",": + badChar = "flow indicator character ,"; + break; + case "%": + badChar = "directive indicator character %"; + break; + case "|": + case ">": { + badChar = `block scalar indicator ${source[0]}`; + break; + } + case "@": + case "`": { + badChar = `reserved character ${source[0]}`; + break; + } + } + if (badChar) + onError(0, "BAD_SCALAR_START", `Plain value cannot start with ${badChar}`); + return foldLines(source); + } + function singleQuotedValue(source, onError) { + if (source[source.length - 1] !== "'" || source.length === 1) + onError(source.length, "MISSING_CHAR", "Missing closing 'quote"); + return foldLines(source.slice(1, -1)).replace(/''/g, "'"); + } + function foldLines(source) { + let first, line; + try { + first = new RegExp("(.*?)(? wsStart ? source.slice(wsStart, i + 1) : ch; + } else { + res += ch; + } + } + if (source[source.length - 1] !== '"' || source.length === 1) + onError(source.length, "MISSING_CHAR", 'Missing closing "quote'); + return res; + } + function foldNewline(source, offset) { + let fold = ""; + let ch = source[offset + 1]; + while (ch === " " || ch === " " || ch === "\n" || ch === "\r") { + if (ch === "\r" && source[offset + 2] !== "\n") + break; + if (ch === "\n") + fold += "\n"; + offset += 1; + ch = source[offset + 1]; + } + if (!fold) + fold = " "; + return { fold, offset }; + } + var escapeCodes = { + "0": "\0", + a: "\x07", + b: "\b", + e: "\x1B", + f: "\f", + n: "\n", + r: "\r", + t: " ", + v: "\v", + N: "\x85", + _: "\xA0", + L: "\u2028", + P: "\u2029", + " ": " ", + '"': '"', + "/": "/", + "\\": "\\", + " ": " " + }; + function parseCharCode(source, offset, length, onError) { + const cc = source.substr(offset, length); + const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc); + const code = ok ? parseInt(cc, 16) : NaN; + if (isNaN(code)) { + const raw = source.substr(offset - 2, length + 2); + onError(offset - 2, "BAD_DQ_ESCAPE", `Invalid escape sequence ${raw}`); + return raw; + } + return String.fromCodePoint(code); + } + exports.resolveFlowScalar = resolveFlowScalar; + } +}); + +// +var require_compose_scalar = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Scalar = require_Scalar(); + var resolveBlockScalar = require_resolve_block_scalar(); + var resolveFlowScalar = require_resolve_flow_scalar(); + function composeScalar(ctx, token, tagToken, onError) { + const { value, type, comment, range } = token.type === "block-scalar" ? resolveBlockScalar.resolveBlockScalar(ctx, token, onError) : resolveFlowScalar.resolveFlowScalar(token, ctx.options.strict, onError); + const tagName = tagToken ? ctx.directives.tagName(tagToken.source, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg)) : null; + let tag; + if (ctx.options.stringKeys && ctx.atKey) { + tag = ctx.schema[identity.SCALAR]; + } else if (tagName) + tag = findScalarTagByName(ctx.schema, value, tagName, tagToken, onError); + else if (token.type === "scalar") + tag = findScalarTagByTest(ctx, value, token, onError); + else + tag = ctx.schema[identity.SCALAR]; + let scalar; + try { + const res = tag.resolve(value, (msg) => onError(tagToken ?? token, "TAG_RESOLVE_FAILED", msg), ctx.options); + scalar = identity.isScalar(res) ? res : new Scalar.Scalar(res); + } catch (error) { + const msg = error instanceof Error ? error.message : String(error); + onError(tagToken ?? token, "TAG_RESOLVE_FAILED", msg); + scalar = new Scalar.Scalar(value); + } + scalar.range = range; + scalar.source = value; + if (type) + scalar.type = type; + if (tagName) + scalar.tag = tagName; + if (tag.format) + scalar.format = tag.format; + if (comment) + scalar.comment = comment; + return scalar; + } + function findScalarTagByName(schema, value, tagName, tagToken, onError) { + var _a; + if (tagName === "!") + return schema[identity.SCALAR]; + const matchWithTest = []; + for (const tag of schema.tags) { + if (!tag.collection && tag.tag === tagName) { + if (tag.default && tag.test) + matchWithTest.push(tag); + else + return tag; + } + } + for (const tag of matchWithTest) + if ((_a = tag.test) == null ? void 0 : _a.test(value)) + return tag; + const kt = schema.knownTags[tagName]; + if (kt && !kt.collection) { + schema.tags.push(Object.assign({}, kt, { default: false, test: void 0 })); + return kt; + } + onError(tagToken, "TAG_RESOLVE_FAILED", `Unresolved tag: ${tagName}`, tagName !== "tag:yaml.org,2002:str"); + return schema[identity.SCALAR]; + } + function findScalarTagByTest({ atKey, directives, schema }, value, token, onError) { + const tag = schema.tags.find((tag2) => { + var _a; + return (tag2.default === true || atKey && tag2.default === "key") && ((_a = tag2.test) == null ? void 0 : _a.test(value)); + }) || schema[identity.SCALAR]; + if (schema.compat) { + const compat = schema.compat.find((tag2) => { + var _a; + return tag2.default && ((_a = tag2.test) == null ? void 0 : _a.test(value)); + }) ?? schema[identity.SCALAR]; + if (tag.tag !== compat.tag) { + const ts = directives.tagString(tag.tag); + const cs = directives.tagString(compat.tag); + const msg = `Value may be parsed as either ${ts} or ${cs}`; + onError(token, "TAG_RESOLVE_FAILED", msg, true); + } + } + return tag; + } + exports.composeScalar = composeScalar; + } +}); + +// +var require_util_empty_scalar_position = __commonJS({ + ""(exports) { + "use strict"; + function emptyScalarPosition(offset, before, pos) { + if (before) { + if (pos === null) + pos = before.length; + for (let i = pos - 1; i >= 0; --i) { + let st = before[i]; + switch (st.type) { + case "space": + case "comment": + case "newline": + offset -= st.source.length; + continue; + } + st = before[++i]; + while ((st == null ? void 0 : st.type) === "space") { + offset += st.source.length; + st = before[++i]; + } + break; + } + } + return offset; + } + exports.emptyScalarPosition = emptyScalarPosition; + } +}); + +// +var require_compose_node = __commonJS({ + ""(exports) { + "use strict"; + var Alias = require_Alias(); + var identity = require_identity(); + var composeCollection = require_compose_collection(); + var composeScalar = require_compose_scalar(); + var resolveEnd = require_resolve_end(); + var utilEmptyScalarPosition = require_util_empty_scalar_position(); + var CN = { composeNode, composeEmptyNode }; + function composeNode(ctx, token, props, onError) { + const atKey = ctx.atKey; + const { spaceBefore, comment, anchor, tag } = props; + let node; + let isSrcToken = true; + switch (token.type) { + case "alias": + node = composeAlias(ctx, token, onError); + if (anchor || tag) + onError(token, "ALIAS_PROPS", "An alias node must not specify any properties"); + break; + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + case "block-scalar": + node = composeScalar.composeScalar(ctx, token, tag, onError); + if (anchor) + node.anchor = anchor.source.substring(1); + break; + case "block-map": + case "block-seq": + case "flow-collection": + node = composeCollection.composeCollection(CN, ctx, token, props, onError); + if (anchor) + node.anchor = anchor.source.substring(1); + break; + default: { + const message = token.type === "error" ? token.message : `Unsupported token (type: ${token.type})`; + onError(token, "UNEXPECTED_TOKEN", message); + node = composeEmptyNode(ctx, token.offset, void 0, null, props, onError); + isSrcToken = false; + } + } + if (anchor && node.anchor === "") + onError(anchor, "BAD_ALIAS", "Anchor cannot be an empty string"); + if (atKey && ctx.options.stringKeys && (!identity.isScalar(node) || typeof node.value !== "string" || node.tag && node.tag !== "tag:yaml.org,2002:str")) { + const msg = "With stringKeys, all keys must be strings"; + onError(tag ?? token, "NON_STRING_KEY", msg); + } + if (spaceBefore) + node.spaceBefore = true; + if (comment) { + if (token.type === "scalar" && token.source === "") + node.comment = comment; + else + node.commentBefore = comment; + } + if (ctx.options.keepSourceTokens && isSrcToken) + node.srcToken = token; + return node; + } + function composeEmptyNode(ctx, offset, before, pos, { spaceBefore, comment, anchor, tag, end }, onError) { + const token = { + type: "scalar", + offset: utilEmptyScalarPosition.emptyScalarPosition(offset, before, pos), + indent: -1, + source: "" + }; + const node = composeScalar.composeScalar(ctx, token, tag, onError); + if (anchor) { + node.anchor = anchor.source.substring(1); + if (node.anchor === "") + onError(anchor, "BAD_ALIAS", "Anchor cannot be an empty string"); + } + if (spaceBefore) + node.spaceBefore = true; + if (comment) { + node.comment = comment; + node.range[2] = end; + } + return node; + } + function composeAlias({ options }, { offset, source, end }, onError) { + const alias = new Alias.Alias(source.substring(1)); + if (alias.source === "") + onError(offset, "BAD_ALIAS", "Alias cannot be an empty string"); + if (alias.source.endsWith(":")) + onError(offset + source.length - 1, "BAD_ALIAS", "Alias ending in : is ambiguous", true); + const valueEnd = offset + source.length; + const re = resolveEnd.resolveEnd(end, valueEnd, options.strict, onError); + alias.range = [offset, valueEnd, re.offset]; + if (re.comment) + alias.comment = re.comment; + return alias; + } + exports.composeEmptyNode = composeEmptyNode; + exports.composeNode = composeNode; + } +}); + +// +var require_compose_doc = __commonJS({ + ""(exports) { + "use strict"; + var Document = require_Document(); + var composeNode = require_compose_node(); + var resolveEnd = require_resolve_end(); + var resolveProps = require_resolve_props(); + function composeDoc(options, directives, { offset, start, value, end }, onError) { + const opts = Object.assign({ _directives: directives }, options); + const doc = new Document.Document(void 0, opts); + const ctx = { + atKey: false, + atRoot: true, + directives: doc.directives, + options: doc.options, + schema: doc.schema + }; + const props = resolveProps.resolveProps(start, { + indicator: "doc-start", + next: value ?? (end == null ? void 0 : end[0]), + offset, + onError, + parentIndent: 0, + startOnNewline: true + }); + if (props.found) { + doc.directives.docStart = true; + if (value && (value.type === "block-map" || value.type === "block-seq") && !props.hasNewline) + onError(props.end, "MISSING_CHAR", "Block collection cannot start on same line with directives-end marker"); + } + doc.contents = value ? composeNode.composeNode(ctx, value, props, onError) : composeNode.composeEmptyNode(ctx, props.end, start, null, props, onError); + const contentEnd = doc.contents.range[2]; + const re = resolveEnd.resolveEnd(end, contentEnd, false, onError); + if (re.comment) + doc.comment = re.comment; + doc.range = [offset, contentEnd, re.offset]; + return doc; + } + exports.composeDoc = composeDoc; + } +}); + +// +var require_composer = __commonJS({ + ""(exports) { + "use strict"; + var node_process = __require("process"); + var directives = require_directives(); + var Document = require_Document(); + var errors = require_errors(); + var identity = require_identity(); + var composeDoc = require_compose_doc(); + var resolveEnd = require_resolve_end(); + function getErrorPos(src) { + if (typeof src === "number") + return [src, src + 1]; + if (Array.isArray(src)) + return src.length === 2 ? src : [src[0], src[1]]; + const { offset, source } = src; + return [offset, offset + (typeof source === "string" ? source.length : 1)]; + } + function parsePrelude(prelude) { + var _a; + let comment = ""; + let atComment = false; + let afterEmptyLine = false; + for (let i = 0; i < prelude.length; ++i) { + const source = prelude[i]; + switch (source[0]) { + case "#": + comment += (comment === "" ? "" : afterEmptyLine ? "\n\n" : "\n") + (source.substring(1) || " "); + atComment = true; + afterEmptyLine = false; + break; + case "%": + if (((_a = prelude[i + 1]) == null ? void 0 : _a[0]) !== "#") + i += 1; + atComment = false; + break; + default: + if (!atComment) + afterEmptyLine = true; + atComment = false; + } + } + return { comment, afterEmptyLine }; + } + var Composer = class { + constructor(options = {}) { + this.doc = null; + this.atDirectives = false; + this.prelude = []; + this.errors = []; + this.warnings = []; + this.onError = (source, code, message, warning) => { + const pos = getErrorPos(source); + if (warning) + this.warnings.push(new errors.YAMLWarning(pos, code, message)); + else + this.errors.push(new errors.YAMLParseError(pos, code, message)); + }; + this.directives = new directives.Directives({ version: options.version || "1.2" }); + this.options = options; + } + decorate(doc, afterDoc) { + const { comment, afterEmptyLine } = parsePrelude(this.prelude); + if (comment) { + const dc = doc.contents; + if (afterDoc) { + doc.comment = doc.comment ? `${doc.comment} +${comment}` : comment; + } else if (afterEmptyLine || doc.directives.docStart || !dc) { + doc.commentBefore = comment; + } else if (identity.isCollection(dc) && !dc.flow && dc.items.length > 0) { + let it = dc.items[0]; + if (identity.isPair(it)) + it = it.key; + const cb = it.commentBefore; + it.commentBefore = cb ? `${comment} +${cb}` : comment; + } else { + const cb = dc.commentBefore; + dc.commentBefore = cb ? `${comment} +${cb}` : comment; + } + } + if (afterDoc) { + Array.prototype.push.apply(doc.errors, this.errors); + Array.prototype.push.apply(doc.warnings, this.warnings); + } else { + doc.errors = this.errors; + doc.warnings = this.warnings; + } + this.prelude = []; + this.errors = []; + this.warnings = []; + } + streamInfo() { + return { + comment: parsePrelude(this.prelude).comment, + directives: this.directives, + errors: this.errors, + warnings: this.warnings + }; + } + *compose(tokens, forceDoc = false, endOffset = -1) { + for (const token of tokens) + yield* this.next(token); + yield* this.end(forceDoc, endOffset); + } + *next(token) { + if (node_process.env.LOG_STREAM) + console.dir(token, { depth: null }); + switch (token.type) { + case "directive": + this.directives.add(token.source, (offset, message, warning) => { + const pos = getErrorPos(token); + pos[0] += offset; + this.onError(pos, "BAD_DIRECTIVE", message, warning); + }); + this.prelude.push(token.source); + this.atDirectives = true; + break; + case "document": { + const doc = composeDoc.composeDoc(this.options, this.directives, token, this.onError); + if (this.atDirectives && !doc.directives.docStart) + this.onError(token, "MISSING_CHAR", "Missing directives-end/doc-start indicator line"); + this.decorate(doc, false); + if (this.doc) + yield this.doc; + this.doc = doc; + this.atDirectives = false; + break; + } + case "byte-order-mark": + case "space": + break; + case "comment": + case "newline": + this.prelude.push(token.source); + break; + case "error": { + const msg = token.source ? `${token.message}: ${JSON.stringify(token.source)}` : token.message; + const error = new errors.YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", msg); + if (this.atDirectives || !this.doc) + this.errors.push(error); + else + this.doc.errors.push(error); + break; + } + case "doc-end": { + if (!this.doc) { + const msg = "Unexpected doc-end without preceding document"; + this.errors.push(new errors.YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", msg)); + break; + } + this.doc.directives.docEnd = true; + const end = resolveEnd.resolveEnd(token.end, token.offset + token.source.length, this.doc.options.strict, this.onError); + this.decorate(this.doc, true); + if (end.comment) { + const dc = this.doc.comment; + this.doc.comment = dc ? `${dc} +${end.comment}` : end.comment; + } + this.doc.range[2] = end.offset; + break; + } + default: + this.errors.push(new errors.YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", `Unsupported token ${token.type}`)); + } + } + *end(forceDoc = false, endOffset = -1) { + if (this.doc) { + this.decorate(this.doc, true); + yield this.doc; + this.doc = null; + } else if (forceDoc) { + const opts = Object.assign({ _directives: this.directives }, this.options); + const doc = new Document.Document(void 0, opts); + if (this.atDirectives) + this.onError(endOffset, "MISSING_CHAR", "Missing directives-end indicator line"); + doc.range = [0, endOffset, endOffset]; + this.decorate(doc, false); + yield doc; + } + } + }; + exports.Composer = Composer; + } +}); + +// +var require_cst_scalar = __commonJS({ + ""(exports) { + "use strict"; + var resolveBlockScalar = require_resolve_block_scalar(); + var resolveFlowScalar = require_resolve_flow_scalar(); + var errors = require_errors(); + var stringifyString = require_stringifyString(); + function resolveAsScalar(token, strict = true, onError) { + if (token) { + const _onError = (pos, code, message) => { + const offset = typeof pos === "number" ? pos : Array.isArray(pos) ? pos[0] : pos.offset; + if (onError) + onError(offset, code, message); + else + throw new errors.YAMLParseError([offset, offset + 1], code, message); + }; + switch (token.type) { + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return resolveFlowScalar.resolveFlowScalar(token, strict, _onError); + case "block-scalar": + return resolveBlockScalar.resolveBlockScalar({ options: { strict } }, token, _onError); + } + } + return null; + } + function createScalarToken(value, context2) { + const { implicitKey = false, indent, inFlow = false, offset = -1, type = "PLAIN" } = context2; + const source = stringifyString.stringifyString({ type, value }, { + implicitKey, + indent: indent > 0 ? " ".repeat(indent) : "", + inFlow, + options: { blockQuote: true, lineWidth: -1 } + }); + const end = context2.end ?? [ + { type: "newline", offset: -1, indent, source: "\n" } + ]; + switch (source[0]) { + case "|": + case ">": { + const he = source.indexOf("\n"); + const head = source.substring(0, he); + const body = source.substring(he + 1) + "\n"; + const props = [ + { type: "block-scalar-header", offset, indent, source: head } + ]; + if (!addEndtoBlockProps(props, end)) + props.push({ type: "newline", offset: -1, indent, source: "\n" }); + return { type: "block-scalar", offset, indent, props, source: body }; + } + case '"': + return { type: "double-quoted-scalar", offset, indent, source, end }; + case "'": + return { type: "single-quoted-scalar", offset, indent, source, end }; + default: + return { type: "scalar", offset, indent, source, end }; + } + } + function setScalarValue(token, value, context2 = {}) { + let { afterKey = false, implicitKey = false, inFlow = false, type } = context2; + let indent = "indent" in token ? token.indent : null; + if (afterKey && typeof indent === "number") + indent += 2; + if (!type) + switch (token.type) { + case "single-quoted-scalar": + type = "QUOTE_SINGLE"; + break; + case "double-quoted-scalar": + type = "QUOTE_DOUBLE"; + break; + case "block-scalar": { + const header = token.props[0]; + if (header.type !== "block-scalar-header") + throw new Error("Invalid block scalar header"); + type = header.source[0] === ">" ? "BLOCK_FOLDED" : "BLOCK_LITERAL"; + break; + } + default: + type = "PLAIN"; + } + const source = stringifyString.stringifyString({ type, value }, { + implicitKey: implicitKey || indent === null, + indent: indent !== null && indent > 0 ? " ".repeat(indent) : "", + inFlow, + options: { blockQuote: true, lineWidth: -1 } + }); + switch (source[0]) { + case "|": + case ">": + setBlockScalarValue(token, source); + break; + case '"': + setFlowScalarValue(token, source, "double-quoted-scalar"); + break; + case "'": + setFlowScalarValue(token, source, "single-quoted-scalar"); + break; + default: + setFlowScalarValue(token, source, "scalar"); + } + } + function setBlockScalarValue(token, source) { + const he = source.indexOf("\n"); + const head = source.substring(0, he); + const body = source.substring(he + 1) + "\n"; + if (token.type === "block-scalar") { + const header = token.props[0]; + if (header.type !== "block-scalar-header") + throw new Error("Invalid block scalar header"); + header.source = head; + token.source = body; + } else { + const { offset } = token; + const indent = "indent" in token ? token.indent : -1; + const props = [ + { type: "block-scalar-header", offset, indent, source: head } + ]; + if (!addEndtoBlockProps(props, "end" in token ? token.end : void 0)) + props.push({ type: "newline", offset: -1, indent, source: "\n" }); + for (const key of Object.keys(token)) + if (key !== "type" && key !== "offset") + delete token[key]; + Object.assign(token, { type: "block-scalar", indent, props, source: body }); + } + } + function addEndtoBlockProps(props, end) { + if (end) + for (const st of end) + switch (st.type) { + case "space": + case "comment": + props.push(st); + break; + case "newline": + props.push(st); + return true; + } + return false; + } + function setFlowScalarValue(token, source, type) { + switch (token.type) { + case "scalar": + case "double-quoted-scalar": + case "single-quoted-scalar": + token.type = type; + token.source = source; + break; + case "block-scalar": { + const end = token.props.slice(1); + let oa = source.length; + if (token.props[0].type === "block-scalar-header") + oa -= token.props[0].source.length; + for (const tok of end) + tok.offset += oa; + delete token.props; + Object.assign(token, { type, source, end }); + break; + } + case "block-map": + case "block-seq": { + const offset = token.offset + source.length; + const nl = { type: "newline", offset, indent: token.indent, source: "\n" }; + delete token.items; + Object.assign(token, { type, source, end: [nl] }); + break; + } + default: { + const indent = "indent" in token ? token.indent : -1; + const end = "end" in token && Array.isArray(token.end) ? token.end.filter((st) => st.type === "space" || st.type === "comment" || st.type === "newline") : []; + for (const key of Object.keys(token)) + if (key !== "type" && key !== "offset") + delete token[key]; + Object.assign(token, { type, indent, source, end }); + } + } + } + exports.createScalarToken = createScalarToken; + exports.resolveAsScalar = resolveAsScalar; + exports.setScalarValue = setScalarValue; + } +}); + +// +var require_cst_stringify = __commonJS({ + ""(exports) { + "use strict"; + var stringify = (cst) => "type" in cst ? stringifyToken(cst) : stringifyItem(cst); + function stringifyToken(token) { + switch (token.type) { + case "block-scalar": { + let res = ""; + for (const tok of token.props) + res += stringifyToken(tok); + return res + token.source; + } + case "block-map": + case "block-seq": { + let res = ""; + for (const item of token.items) + res += stringifyItem(item); + return res; + } + case "flow-collection": { + let res = token.start.source; + for (const item of token.items) + res += stringifyItem(item); + for (const st of token.end) + res += st.source; + return res; + } + case "document": { + let res = stringifyItem(token); + if (token.end) + for (const st of token.end) + res += st.source; + return res; + } + default: { + let res = token.source; + if ("end" in token && token.end) + for (const st of token.end) + res += st.source; + return res; + } + } + } + function stringifyItem({ start, key, sep: sep2, value }) { + let res = ""; + for (const st of start) + res += st.source; + if (key) + res += stringifyToken(key); + if (sep2) + for (const st of sep2) + res += st.source; + if (value) + res += stringifyToken(value); + return res; + } + exports.stringify = stringify; + } +}); + +// +var require_cst_visit = __commonJS({ + ""(exports) { + "use strict"; + var BREAK = Symbol("break visit"); + var SKIP = Symbol("skip children"); + var REMOVE = Symbol("remove item"); + function visit(cst, visitor) { + if ("type" in cst && cst.type === "document") + cst = { start: cst.start, value: cst.value }; + _visit(Object.freeze([]), cst, visitor); + } + visit.BREAK = BREAK; + visit.SKIP = SKIP; + visit.REMOVE = REMOVE; + visit.itemAtPath = (cst, path) => { + let item = cst; + for (const [field, index] of path) { + const tok = item == null ? void 0 : item[field]; + if (tok && "items" in tok) { + item = tok.items[index]; + } else + return void 0; + } + return item; + }; + visit.parentCollection = (cst, path) => { + const parent = visit.itemAtPath(cst, path.slice(0, -1)); + const field = path[path.length - 1][0]; + const coll = parent == null ? void 0 : parent[field]; + if (coll && "items" in coll) + return coll; + throw new Error("Parent collection not found"); + }; + function _visit(path, item, visitor) { + let ctrl = visitor(item, path); + if (typeof ctrl === "symbol") + return ctrl; + for (const field of ["key", "value"]) { + const token = item[field]; + if (token && "items" in token) { + for (let i = 0; i < token.items.length; ++i) { + const ci = _visit(Object.freeze(path.concat([[field, i]])), token.items[i], visitor); + if (typeof ci === "number") + i = ci - 1; + else if (ci === BREAK) + return BREAK; + else if (ci === REMOVE) { + token.items.splice(i, 1); + i -= 1; + } + } + if (typeof ctrl === "function" && field === "key") + ctrl = ctrl(item, path); + } + } + return typeof ctrl === "function" ? ctrl(item, path) : ctrl; + } + exports.visit = visit; + } +}); + +// +var require_cst = __commonJS({ + ""(exports) { + "use strict"; + var cstScalar = require_cst_scalar(); + var cstStringify = require_cst_stringify(); + var cstVisit = require_cst_visit(); + var BOM = "\uFEFF"; + var DOCUMENT = ""; + var FLOW_END = ""; + var SCALAR = ""; + var isCollection = (token) => !!token && "items" in token; + var isScalar = (token) => !!token && (token.type === "scalar" || token.type === "single-quoted-scalar" || token.type === "double-quoted-scalar" || token.type === "block-scalar"); + function prettyToken(token) { + switch (token) { + case BOM: + return ""; + case DOCUMENT: + return ""; + case FLOW_END: + return ""; + case SCALAR: + return ""; + default: + return JSON.stringify(token); + } + } + function tokenType(source) { + switch (source) { + case BOM: + return "byte-order-mark"; + case DOCUMENT: + return "doc-mode"; + case FLOW_END: + return "flow-error-end"; + case SCALAR: + return "scalar"; + case "---": + return "doc-start"; + case "...": + return "doc-end"; + case "": + case "\n": + case "\r\n": + return "newline"; + case "-": + return "seq-item-ind"; + case "?": + return "explicit-key-ind"; + case ":": + return "map-value-ind"; + case "{": + return "flow-map-start"; + case "}": + return "flow-map-end"; + case "[": + return "flow-seq-start"; + case "]": + return "flow-seq-end"; + case ",": + return "comma"; + } + switch (source[0]) { + case " ": + case " ": + return "space"; + case "#": + return "comment"; + case "%": + return "directive-line"; + case "*": + return "alias"; + case "&": + return "anchor"; + case "!": + return "tag"; + case "'": + return "single-quoted-scalar"; + case '"': + return "double-quoted-scalar"; + case "|": + case ">": + return "block-scalar-header"; + } + return null; + } + exports.createScalarToken = cstScalar.createScalarToken; + exports.resolveAsScalar = cstScalar.resolveAsScalar; + exports.setScalarValue = cstScalar.setScalarValue; + exports.stringify = cstStringify.stringify; + exports.visit = cstVisit.visit; + exports.BOM = BOM; + exports.DOCUMENT = DOCUMENT; + exports.FLOW_END = FLOW_END; + exports.SCALAR = SCALAR; + exports.isCollection = isCollection; + exports.isScalar = isScalar; + exports.prettyToken = prettyToken; + exports.tokenType = tokenType; + } +}); + +// +var require_lexer = __commonJS({ + ""(exports) { + "use strict"; + var cst = require_cst(); + function isEmpty(ch) { + switch (ch) { + case void 0: + case " ": + case "\n": + case "\r": + case " ": + return true; + default: + return false; + } + } + var hexDigits = new Set("0123456789ABCDEFabcdef"); + var tagChars = new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"); + var flowIndicatorChars = new Set(",[]{}"); + var invalidAnchorChars = new Set(" ,[]{}\n\r "); + var isNotAnchorChar = (ch) => !ch || invalidAnchorChars.has(ch); + var Lexer = class { + constructor() { + this.atEnd = false; + this.blockScalarIndent = -1; + this.blockScalarKeep = false; + this.buffer = ""; + this.flowKey = false; + this.flowLevel = 0; + this.indentNext = 0; + this.indentValue = 0; + this.lineEndPos = null; + this.next = null; + this.pos = 0; + } + *lex(source, incomplete = false) { + if (source) { + if (typeof source !== "string") + throw TypeError("source is not a string"); + this.buffer = this.buffer ? this.buffer + source : source; + this.lineEndPos = null; + } + this.atEnd = !incomplete; + let next = this.next ?? "stream"; + while (next && (incomplete || this.hasChars(1))) + next = yield* this.parseNext(next); + } + atLineEnd() { + let i = this.pos; + let ch = this.buffer[i]; + while (ch === " " || ch === " ") + ch = this.buffer[++i]; + if (!ch || ch === "#" || ch === "\n") + return true; + if (ch === "\r") + return this.buffer[i + 1] === "\n"; + return false; + } + charAt(n) { + return this.buffer[this.pos + n]; + } + continueScalar(offset) { + let ch = this.buffer[offset]; + if (this.indentNext > 0) { + let indent = 0; + while (ch === " ") + ch = this.buffer[++indent + offset]; + if (ch === "\r") { + const next = this.buffer[indent + offset + 1]; + if (next === "\n" || !next && !this.atEnd) + return offset + indent + 1; + } + return ch === "\n" || indent >= this.indentNext || !ch && !this.atEnd ? offset + indent : -1; + } + if (ch === "-" || ch === ".") { + const dt = this.buffer.substr(offset, 3); + if ((dt === "---" || dt === "...") && isEmpty(this.buffer[offset + 3])) + return -1; + } + return offset; + } + getLine() { + let end = this.lineEndPos; + if (typeof end !== "number" || end !== -1 && end < this.pos) { + end = this.buffer.indexOf("\n", this.pos); + this.lineEndPos = end; + } + if (end === -1) + return this.atEnd ? this.buffer.substring(this.pos) : null; + if (this.buffer[end - 1] === "\r") + end -= 1; + return this.buffer.substring(this.pos, end); + } + hasChars(n) { + return this.pos + n <= this.buffer.length; + } + setNext(state) { + this.buffer = this.buffer.substring(this.pos); + this.pos = 0; + this.lineEndPos = null; + this.next = state; + return null; + } + peek(n) { + return this.buffer.substr(this.pos, n); + } + *parseNext(next) { + switch (next) { + case "stream": + return yield* this.parseStream(); + case "line-start": + return yield* this.parseLineStart(); + case "block-start": + return yield* this.parseBlockStart(); + case "doc": + return yield* this.parseDocument(); + case "flow": + return yield* this.parseFlowCollection(); + case "quoted-scalar": + return yield* this.parseQuotedScalar(); + case "block-scalar": + return yield* this.parseBlockScalar(); + case "plain-scalar": + return yield* this.parsePlainScalar(); + } + } + *parseStream() { + let line = this.getLine(); + if (line === null) + return this.setNext("stream"); + if (line[0] === cst.BOM) { + yield* this.pushCount(1); + line = line.substring(1); + } + if (line[0] === "%") { + let dirEnd = line.length; + let cs = line.indexOf("#"); + while (cs !== -1) { + const ch = line[cs - 1]; + if (ch === " " || ch === " ") { + dirEnd = cs - 1; + break; + } else { + cs = line.indexOf("#", cs + 1); + } + } + while (true) { + const ch = line[dirEnd - 1]; + if (ch === " " || ch === " ") + dirEnd -= 1; + else + break; + } + const n = (yield* this.pushCount(dirEnd)) + (yield* this.pushSpaces(true)); + yield* this.pushCount(line.length - n); + this.pushNewline(); + return "stream"; + } + if (this.atLineEnd()) { + const sp = yield* this.pushSpaces(true); + yield* this.pushCount(line.length - sp); + yield* this.pushNewline(); + return "stream"; + } + yield cst.DOCUMENT; + return yield* this.parseLineStart(); + } + *parseLineStart() { + const ch = this.charAt(0); + if (!ch && !this.atEnd) + return this.setNext("line-start"); + if (ch === "-" || ch === ".") { + if (!this.atEnd && !this.hasChars(4)) + return this.setNext("line-start"); + const s = this.peek(3); + if ((s === "---" || s === "...") && isEmpty(this.charAt(3))) { + yield* this.pushCount(3); + this.indentValue = 0; + this.indentNext = 0; + return s === "---" ? "doc" : "stream"; + } + } + this.indentValue = yield* this.pushSpaces(false); + if (this.indentNext > this.indentValue && !isEmpty(this.charAt(1))) + this.indentNext = this.indentValue; + return yield* this.parseBlockStart(); + } + *parseBlockStart() { + const [ch0, ch1] = this.peek(2); + if (!ch1 && !this.atEnd) + return this.setNext("block-start"); + if ((ch0 === "-" || ch0 === "?" || ch0 === ":") && isEmpty(ch1)) { + const n = (yield* this.pushCount(1)) + (yield* this.pushSpaces(true)); + this.indentNext = this.indentValue + 1; + this.indentValue += n; + return yield* this.parseBlockStart(); + } + return "doc"; + } + *parseDocument() { + yield* this.pushSpaces(true); + const line = this.getLine(); + if (line === null) + return this.setNext("doc"); + let n = yield* this.pushIndicators(); + switch (line[n]) { + case "#": + yield* this.pushCount(line.length - n); + case void 0: + yield* this.pushNewline(); + return yield* this.parseLineStart(); + case "{": + case "[": + yield* this.pushCount(1); + this.flowKey = false; + this.flowLevel = 1; + return "flow"; + case "}": + case "]": + yield* this.pushCount(1); + return "doc"; + case "*": + yield* this.pushUntil(isNotAnchorChar); + return "doc"; + case '"': + case "'": + return yield* this.parseQuotedScalar(); + case "|": + case ">": + n += yield* this.parseBlockScalarHeader(); + n += yield* this.pushSpaces(true); + yield* this.pushCount(line.length - n); + yield* this.pushNewline(); + return yield* this.parseBlockScalar(); + default: + return yield* this.parsePlainScalar(); + } + } + *parseFlowCollection() { + let nl, sp; + let indent = -1; + do { + nl = yield* this.pushNewline(); + if (nl > 0) { + sp = yield* this.pushSpaces(false); + this.indentValue = indent = sp; + } else { + sp = 0; + } + sp += yield* this.pushSpaces(true); + } while (nl + sp > 0); + const line = this.getLine(); + if (line === null) + return this.setNext("flow"); + if (indent !== -1 && indent < this.indentNext && line[0] !== "#" || indent === 0 && (line.startsWith("---") || line.startsWith("...")) && isEmpty(line[3])) { + const atFlowEndMarker = indent === this.indentNext - 1 && this.flowLevel === 1 && (line[0] === "]" || line[0] === "}"); + if (!atFlowEndMarker) { + this.flowLevel = 0; + yield cst.FLOW_END; + return yield* this.parseLineStart(); + } + } + let n = 0; + while (line[n] === ",") { + n += yield* this.pushCount(1); + n += yield* this.pushSpaces(true); + this.flowKey = false; + } + n += yield* this.pushIndicators(); + switch (line[n]) { + case void 0: + return "flow"; + case "#": + yield* this.pushCount(line.length - n); + return "flow"; + case "{": + case "[": + yield* this.pushCount(1); + this.flowKey = false; + this.flowLevel += 1; + return "flow"; + case "}": + case "]": + yield* this.pushCount(1); + this.flowKey = true; + this.flowLevel -= 1; + return this.flowLevel ? "flow" : "doc"; + case "*": + yield* this.pushUntil(isNotAnchorChar); + return "flow"; + case '"': + case "'": + this.flowKey = true; + return yield* this.parseQuotedScalar(); + case ":": { + const next = this.charAt(1); + if (this.flowKey || isEmpty(next) || next === ",") { + this.flowKey = false; + yield* this.pushCount(1); + yield* this.pushSpaces(true); + return "flow"; + } + } + default: + this.flowKey = false; + return yield* this.parsePlainScalar(); + } + } + *parseQuotedScalar() { + const quote = this.charAt(0); + let end = this.buffer.indexOf(quote, this.pos + 1); + if (quote === "'") { + while (end !== -1 && this.buffer[end + 1] === "'") + end = this.buffer.indexOf("'", end + 2); + } else { + while (end !== -1) { + let n = 0; + while (this.buffer[end - 1 - n] === "\\") + n += 1; + if (n % 2 === 0) + break; + end = this.buffer.indexOf('"', end + 1); + } + } + const qb = this.buffer.substring(0, end); + let nl = qb.indexOf("\n", this.pos); + if (nl !== -1) { + while (nl !== -1) { + const cs = this.continueScalar(nl + 1); + if (cs === -1) + break; + nl = qb.indexOf("\n", cs); + } + if (nl !== -1) { + end = nl - (qb[nl - 1] === "\r" ? 2 : 1); + } + } + if (end === -1) { + if (!this.atEnd) + return this.setNext("quoted-scalar"); + end = this.buffer.length; + } + yield* this.pushToIndex(end + 1, false); + return this.flowLevel ? "flow" : "doc"; + } + *parseBlockScalarHeader() { + this.blockScalarIndent = -1; + this.blockScalarKeep = false; + let i = this.pos; + while (true) { + const ch = this.buffer[++i]; + if (ch === "+") + this.blockScalarKeep = true; + else if (ch > "0" && ch <= "9") + this.blockScalarIndent = Number(ch) - 1; + else if (ch !== "-") + break; + } + return yield* this.pushUntil((ch) => isEmpty(ch) || ch === "#"); + } + *parseBlockScalar() { + let nl = this.pos - 1; + let indent = 0; + let ch; + loop: + for (let i2 = this.pos; ch = this.buffer[i2]; ++i2) { + switch (ch) { + case " ": + indent += 1; + break; + case "\n": + nl = i2; + indent = 0; + break; + case "\r": { + const next = this.buffer[i2 + 1]; + if (!next && !this.atEnd) + return this.setNext("block-scalar"); + if (next === "\n") + break; + } + default: + break loop; + } + } + if (!ch && !this.atEnd) + return this.setNext("block-scalar"); + if (indent >= this.indentNext) { + if (this.blockScalarIndent === -1) + this.indentNext = indent; + else { + this.indentNext = this.blockScalarIndent + (this.indentNext === 0 ? 1 : this.indentNext); + } + do { + const cs = this.continueScalar(nl + 1); + if (cs === -1) + break; + nl = this.buffer.indexOf("\n", cs); + } while (nl !== -1); + if (nl === -1) { + if (!this.atEnd) + return this.setNext("block-scalar"); + nl = this.buffer.length; + } + } + let i = nl + 1; + ch = this.buffer[i]; + while (ch === " ") + ch = this.buffer[++i]; + if (ch === " ") { + while (ch === " " || ch === " " || ch === "\r" || ch === "\n") + ch = this.buffer[++i]; + nl = i - 1; + } else if (!this.blockScalarKeep) { + do { + let i2 = nl - 1; + let ch2 = this.buffer[i2]; + if (ch2 === "\r") + ch2 = this.buffer[--i2]; + const lastChar = i2; + while (ch2 === " ") + ch2 = this.buffer[--i2]; + if (ch2 === "\n" && i2 >= this.pos && i2 + 1 + indent > lastChar) + nl = i2; + else + break; + } while (true); + } + yield cst.SCALAR; + yield* this.pushToIndex(nl + 1, true); + return yield* this.parseLineStart(); + } + *parsePlainScalar() { + const inFlow = this.flowLevel > 0; + let end = this.pos - 1; + let i = this.pos - 1; + let ch; + while (ch = this.buffer[++i]) { + if (ch === ":") { + const next = this.buffer[i + 1]; + if (isEmpty(next) || inFlow && flowIndicatorChars.has(next)) + break; + end = i; + } else if (isEmpty(ch)) { + let next = this.buffer[i + 1]; + if (ch === "\r") { + if (next === "\n") { + i += 1; + ch = "\n"; + next = this.buffer[i + 1]; + } else + end = i; + } + if (next === "#" || inFlow && flowIndicatorChars.has(next)) + break; + if (ch === "\n") { + const cs = this.continueScalar(i + 1); + if (cs === -1) + break; + i = Math.max(i, cs - 2); + } + } else { + if (inFlow && flowIndicatorChars.has(ch)) + break; + end = i; + } + } + if (!ch && !this.atEnd) + return this.setNext("plain-scalar"); + yield cst.SCALAR; + yield* this.pushToIndex(end + 1, true); + return inFlow ? "flow" : "doc"; + } + *pushCount(n) { + if (n > 0) { + yield this.buffer.substr(this.pos, n); + this.pos += n; + return n; + } + return 0; + } + *pushToIndex(i, allowEmpty) { + const s = this.buffer.slice(this.pos, i); + if (s) { + yield s; + this.pos += s.length; + return s.length; + } else if (allowEmpty) + yield ""; + return 0; + } + *pushIndicators() { + switch (this.charAt(0)) { + case "!": + return (yield* this.pushTag()) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + case "&": + return (yield* this.pushUntil(isNotAnchorChar)) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + case "-": + case "?": + case ":": { + const inFlow = this.flowLevel > 0; + const ch1 = this.charAt(1); + if (isEmpty(ch1) || inFlow && flowIndicatorChars.has(ch1)) { + if (!inFlow) + this.indentNext = this.indentValue + 1; + else if (this.flowKey) + this.flowKey = false; + return (yield* this.pushCount(1)) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + } + } + } + return 0; + } + *pushTag() { + if (this.charAt(1) === "<") { + let i = this.pos + 2; + let ch = this.buffer[i]; + while (!isEmpty(ch) && ch !== ">") + ch = this.buffer[++i]; + return yield* this.pushToIndex(ch === ">" ? i + 1 : i, false); + } else { + let i = this.pos + 1; + let ch = this.buffer[i]; + while (ch) { + if (tagChars.has(ch)) + ch = this.buffer[++i]; + else if (ch === "%" && hexDigits.has(this.buffer[i + 1]) && hexDigits.has(this.buffer[i + 2])) { + ch = this.buffer[i += 3]; + } else + break; + } + return yield* this.pushToIndex(i, false); + } + } + *pushNewline() { + const ch = this.buffer[this.pos]; + if (ch === "\n") + return yield* this.pushCount(1); + else if (ch === "\r" && this.charAt(1) === "\n") + return yield* this.pushCount(2); + else + return 0; + } + *pushSpaces(allowTabs) { + let i = this.pos - 1; + let ch; + do { + ch = this.buffer[++i]; + } while (ch === " " || allowTabs && ch === " "); + const n = i - this.pos; + if (n > 0) { + yield this.buffer.substr(this.pos, n); + this.pos = i; + } + return n; + } + *pushUntil(test) { + let i = this.pos; + let ch = this.buffer[i]; + while (!test(ch)) + ch = this.buffer[++i]; + return yield* this.pushToIndex(i, false); + } + }; + exports.Lexer = Lexer; + } +}); + +// +var require_line_counter = __commonJS({ + ""(exports) { + "use strict"; + var LineCounter = class { + constructor() { + this.lineStarts = []; + this.addNewLine = (offset) => this.lineStarts.push(offset); + this.linePos = (offset) => { + let low = 0; + let high = this.lineStarts.length; + while (low < high) { + const mid = low + high >> 1; + if (this.lineStarts[mid] < offset) + low = mid + 1; + else + high = mid; + } + if (this.lineStarts[low] === offset) + return { line: low + 1, col: 1 }; + if (low === 0) + return { line: 0, col: offset }; + const start = this.lineStarts[low - 1]; + return { line: low, col: offset - start + 1 }; + }; + } + }; + exports.LineCounter = LineCounter; + } +}); + +// +var require_parser = __commonJS({ + ""(exports) { + "use strict"; + var node_process = __require("process"); + var cst = require_cst(); + var lexer = require_lexer(); + function includesToken(list, type) { + for (let i = 0; i < list.length; ++i) + if (list[i].type === type) + return true; + return false; + } + function findNonEmptyIndex(list) { + for (let i = 0; i < list.length; ++i) { + switch (list[i].type) { + case "space": + case "comment": + case "newline": + break; + default: + return i; + } + } + return -1; + } + function isFlowToken(token) { + switch (token == null ? void 0 : token.type) { + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + case "flow-collection": + return true; + default: + return false; + } + } + function getPrevProps(parent) { + switch (parent.type) { + case "document": + return parent.start; + case "block-map": { + const it = parent.items[parent.items.length - 1]; + return it.sep ?? it.start; + } + case "block-seq": + return parent.items[parent.items.length - 1].start; + default: + return []; + } + } + function getFirstKeyStartProps(prev) { + var _a; + if (prev.length === 0) + return []; + let i = prev.length; + loop: + while (--i >= 0) { + switch (prev[i].type) { + case "doc-start": + case "explicit-key-ind": + case "map-value-ind": + case "seq-item-ind": + case "newline": + break loop; + } + } + while (((_a = prev[++i]) == null ? void 0 : _a.type) === "space") { + } + return prev.splice(i, prev.length); + } + function fixFlowSeqItems(fc) { + if (fc.start.type === "flow-seq-start") { + for (const it of fc.items) { + if (it.sep && !it.value && !includesToken(it.start, "explicit-key-ind") && !includesToken(it.sep, "map-value-ind")) { + if (it.key) + it.value = it.key; + delete it.key; + if (isFlowToken(it.value)) { + if (it.value.end) + Array.prototype.push.apply(it.value.end, it.sep); + else + it.value.end = it.sep; + } else + Array.prototype.push.apply(it.start, it.sep); + delete it.sep; + } + } + } + } + var Parser = class { + constructor(onNewLine) { + this.atNewLine = true; + this.atScalar = false; + this.indent = 0; + this.offset = 0; + this.onKeyLine = false; + this.stack = []; + this.source = ""; + this.type = ""; + this.lexer = new lexer.Lexer(); + this.onNewLine = onNewLine; + } + *parse(source, incomplete = false) { + if (this.onNewLine && this.offset === 0) + this.onNewLine(0); + for (const lexeme of this.lexer.lex(source, incomplete)) + yield* this.next(lexeme); + if (!incomplete) + yield* this.end(); + } + *next(source) { + this.source = source; + if (node_process.env.LOG_TOKENS) + console.log("|", cst.prettyToken(source)); + if (this.atScalar) { + this.atScalar = false; + yield* this.step(); + this.offset += source.length; + return; + } + const type = cst.tokenType(source); + if (!type) { + const message = `Not a YAML token: ${source}`; + yield* this.pop({ type: "error", offset: this.offset, message, source }); + this.offset += source.length; + } else if (type === "scalar") { + this.atNewLine = false; + this.atScalar = true; + this.type = "scalar"; + } else { + this.type = type; + yield* this.step(); + switch (type) { + case "newline": + this.atNewLine = true; + this.indent = 0; + if (this.onNewLine) + this.onNewLine(this.offset + source.length); + break; + case "space": + if (this.atNewLine && source[0] === " ") + this.indent += source.length; + break; + case "explicit-key-ind": + case "map-value-ind": + case "seq-item-ind": + if (this.atNewLine) + this.indent += source.length; + break; + case "doc-mode": + case "flow-error-end": + return; + default: + this.atNewLine = false; + } + this.offset += source.length; + } + } + *end() { + while (this.stack.length > 0) + yield* this.pop(); + } + get sourceToken() { + const st = { + type: this.type, + offset: this.offset, + indent: this.indent, + source: this.source + }; + return st; + } + *step() { + const top = this.peek(1); + if (this.type === "doc-end" && (!top || top.type !== "doc-end")) { + while (this.stack.length > 0) + yield* this.pop(); + this.stack.push({ + type: "doc-end", + offset: this.offset, + source: this.source + }); + return; + } + if (!top) + return yield* this.stream(); + switch (top.type) { + case "document": + return yield* this.document(top); + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return yield* this.scalar(top); + case "block-scalar": + return yield* this.blockScalar(top); + case "block-map": + return yield* this.blockMap(top); + case "block-seq": + return yield* this.blockSequence(top); + case "flow-collection": + return yield* this.flowCollection(top); + case "doc-end": + return yield* this.documentEnd(top); + } + yield* this.pop(); + } + peek(n) { + return this.stack[this.stack.length - n]; + } + *pop(error) { + const token = error ?? this.stack.pop(); + if (!token) { + const message = "Tried to pop an empty stack"; + yield { type: "error", offset: this.offset, source: "", message }; + } else if (this.stack.length === 0) { + yield token; + } else { + const top = this.peek(1); + if (token.type === "block-scalar") { + token.indent = "indent" in top ? top.indent : 0; + } else if (token.type === "flow-collection" && top.type === "document") { + token.indent = 0; + } + if (token.type === "flow-collection") + fixFlowSeqItems(token); + switch (top.type) { + case "document": + top.value = token; + break; + case "block-scalar": + top.props.push(token); + break; + case "block-map": { + const it = top.items[top.items.length - 1]; + if (it.value) { + top.items.push({ start: [], key: token, sep: [] }); + this.onKeyLine = true; + return; + } else if (it.sep) { + it.value = token; + } else { + Object.assign(it, { key: token, sep: [] }); + this.onKeyLine = !it.explicitKey; + return; + } + break; + } + case "block-seq": { + const it = top.items[top.items.length - 1]; + if (it.value) + top.items.push({ start: [], value: token }); + else + it.value = token; + break; + } + case "flow-collection": { + const it = top.items[top.items.length - 1]; + if (!it || it.value) + top.items.push({ start: [], key: token, sep: [] }); + else if (it.sep) + it.value = token; + else + Object.assign(it, { key: token, sep: [] }); + return; + } + default: + yield* this.pop(); + yield* this.pop(token); + } + if ((top.type === "document" || top.type === "block-map" || top.type === "block-seq") && (token.type === "block-map" || token.type === "block-seq")) { + const last = token.items[token.items.length - 1]; + if (last && !last.sep && !last.value && last.start.length > 0 && findNonEmptyIndex(last.start) === -1 && (token.indent === 0 || last.start.every((st) => st.type !== "comment" || st.indent < token.indent))) { + if (top.type === "document") + top.end = last.start; + else + top.items.push({ start: last.start }); + token.items.splice(-1, 1); + } + } + } + } + *stream() { + switch (this.type) { + case "directive-line": + yield { type: "directive", offset: this.offset, source: this.source }; + return; + case "byte-order-mark": + case "space": + case "comment": + case "newline": + yield this.sourceToken; + return; + case "doc-mode": + case "doc-start": { + const doc = { + type: "document", + offset: this.offset, + start: [] + }; + if (this.type === "doc-start") + doc.start.push(this.sourceToken); + this.stack.push(doc); + return; + } + } + yield { + type: "error", + offset: this.offset, + message: `Unexpected ${this.type} token in YAML stream`, + source: this.source + }; + } + *document(doc) { + if (doc.value) + return yield* this.lineEnd(doc); + switch (this.type) { + case "doc-start": { + if (findNonEmptyIndex(doc.start) !== -1) { + yield* this.pop(); + yield* this.step(); + } else + doc.start.push(this.sourceToken); + return; + } + case "anchor": + case "tag": + case "space": + case "comment": + case "newline": + doc.start.push(this.sourceToken); + return; + } + const bv = this.startBlockValue(doc); + if (bv) + this.stack.push(bv); + else { + yield { + type: "error", + offset: this.offset, + message: `Unexpected ${this.type} token in YAML document`, + source: this.source + }; + } } - const result = { - type: type.toLowerCase(), - parameters: new NullObject() - }; - if (index === -1) { - return result; + *scalar(scalar) { + if (this.type === "map-value-ind") { + const prev = getPrevProps(this.peek(2)); + const start = getFirstKeyStartProps(prev); + let sep2; + if (scalar.end) { + sep2 = scalar.end; + sep2.push(this.sourceToken); + delete scalar.end; + } else + sep2 = [this.sourceToken]; + const map = { + type: "block-map", + offset: scalar.offset, + indent: scalar.indent, + items: [{ start, key: scalar, sep: sep2 }] + }; + this.onKeyLine = true; + this.stack[this.stack.length - 1] = map; + } else + yield* this.lineEnd(scalar); + } + *blockScalar(scalar) { + switch (this.type) { + case "space": + case "comment": + case "newline": + scalar.props.push(this.sourceToken); + return; + case "scalar": + scalar.source = this.source; + this.atNewLine = true; + this.indent = 0; + if (this.onNewLine) { + let nl = this.source.indexOf("\n") + 1; + while (nl !== 0) { + this.onNewLine(this.offset + nl); + nl = this.source.indexOf("\n", nl) + 1; + } + } + yield* this.pop(); + break; + default: + yield* this.pop(); + yield* this.step(); + } } - let key; - let match; - let value; - paramRE.lastIndex = index; - while (match = paramRE.exec(header)) { - if (match.index !== index) { - throw new TypeError("invalid parameter format"); + *blockMap(map) { + var _a; + const it = map.items[map.items.length - 1]; + switch (this.type) { + case "newline": + this.onKeyLine = false; + if (it.value) { + const end = "end" in it.value ? it.value.end : void 0; + const last = Array.isArray(end) ? end[end.length - 1] : void 0; + if ((last == null ? void 0 : last.type) === "comment") + end == null ? void 0 : end.push(this.sourceToken); + else + map.items.push({ start: [this.sourceToken] }); + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + it.start.push(this.sourceToken); + } + return; + case "space": + case "comment": + if (it.value) { + map.items.push({ start: [this.sourceToken] }); + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + if (this.atIndentedComment(it.start, map.indent)) { + const prev = map.items[map.items.length - 2]; + const end = (_a = prev == null ? void 0 : prev.value) == null ? void 0 : _a.end; + if (Array.isArray(end)) { + Array.prototype.push.apply(end, it.start); + end.push(this.sourceToken); + map.items.pop(); + return; + } + } + it.start.push(this.sourceToken); + } + return; } - index += match[0].length; - key = match[1].toLowerCase(); - value = match[2]; - if (value[0] === '"') { - value = value.slice(1, value.length - 1); - quotedPairRE.test(value) && (value = value.replace(quotedPairRE, "$1")); + if (this.indent >= map.indent) { + const atMapIndent = !this.onKeyLine && this.indent === map.indent; + const atNextItem = atMapIndent && (it.sep || it.explicitKey) && this.type !== "seq-item-ind"; + let start = []; + if (atNextItem && it.sep && !it.value) { + const nl = []; + for (let i = 0; i < it.sep.length; ++i) { + const st = it.sep[i]; + switch (st.type) { + case "newline": + nl.push(i); + break; + case "space": + break; + case "comment": + if (st.indent > map.indent) + nl.length = 0; + break; + default: + nl.length = 0; + } + } + if (nl.length >= 2) + start = it.sep.splice(nl[1]); + } + switch (this.type) { + case "anchor": + case "tag": + if (atNextItem || it.value) { + start.push(this.sourceToken); + map.items.push({ start }); + this.onKeyLine = true; + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + it.start.push(this.sourceToken); + } + return; + case "explicit-key-ind": + if (!it.sep && !it.explicitKey) { + it.start.push(this.sourceToken); + it.explicitKey = true; + } else if (atNextItem || it.value) { + start.push(this.sourceToken); + map.items.push({ start, explicitKey: true }); + } else { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: [this.sourceToken], explicitKey: true }] + }); + } + this.onKeyLine = true; + return; + case "map-value-ind": + if (it.explicitKey) { + if (!it.sep) { + if (includesToken(it.start, "newline")) { + Object.assign(it, { key: null, sep: [this.sourceToken] }); + } else { + const start2 = getFirstKeyStartProps(it.start); + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: start2, key: null, sep: [this.sourceToken] }] + }); + } + } else if (it.value) { + map.items.push({ start: [], key: null, sep: [this.sourceToken] }); + } else if (includesToken(it.sep, "map-value-ind")) { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, key: null, sep: [this.sourceToken] }] + }); + } else if (isFlowToken(it.key) && !includesToken(it.sep, "newline")) { + const start2 = getFirstKeyStartProps(it.start); + const key = it.key; + const sep2 = it.sep; + sep2.push(this.sourceToken); + delete it.key; + delete it.sep; + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: start2, key, sep: sep2 }] + }); + } else if (start.length > 0) { + it.sep = it.sep.concat(start, this.sourceToken); + } else { + it.sep.push(this.sourceToken); + } + } else { + if (!it.sep) { + Object.assign(it, { key: null, sep: [this.sourceToken] }); + } else if (it.value || atNextItem) { + map.items.push({ start, key: null, sep: [this.sourceToken] }); + } else if (includesToken(it.sep, "map-value-ind")) { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: [], key: null, sep: [this.sourceToken] }] + }); + } else { + it.sep.push(this.sourceToken); + } + } + this.onKeyLine = true; + return; + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": { + const fs = this.flowScalar(this.type); + if (atNextItem || it.value) { + map.items.push({ start, key: fs, sep: [] }); + this.onKeyLine = true; + } else if (it.sep) { + this.stack.push(fs); + } else { + Object.assign(it, { key: fs, sep: [] }); + this.onKeyLine = true; + } + return; + } + default: { + const bv = this.startBlockValue(map); + if (bv) { + if (atMapIndent && bv.type !== "block-seq") { + map.items.push({ start }); + } + this.stack.push(bv); + return; + } + } + } } - result.parameters[key] = value; + yield* this.pop(); + yield* this.step(); } - if (index !== header.length) { - throw new TypeError("invalid parameter format"); + *blockSequence(seq) { + var _a; + const it = seq.items[seq.items.length - 1]; + switch (this.type) { + case "newline": + if (it.value) { + const end = "end" in it.value ? it.value.end : void 0; + const last = Array.isArray(end) ? end[end.length - 1] : void 0; + if ((last == null ? void 0 : last.type) === "comment") + end == null ? void 0 : end.push(this.sourceToken); + else + seq.items.push({ start: [this.sourceToken] }); + } else + it.start.push(this.sourceToken); + return; + case "space": + case "comment": + if (it.value) + seq.items.push({ start: [this.sourceToken] }); + else { + if (this.atIndentedComment(it.start, seq.indent)) { + const prev = seq.items[seq.items.length - 2]; + const end = (_a = prev == null ? void 0 : prev.value) == null ? void 0 : _a.end; + if (Array.isArray(end)) { + Array.prototype.push.apply(end, it.start); + end.push(this.sourceToken); + seq.items.pop(); + return; + } + } + it.start.push(this.sourceToken); + } + return; + case "anchor": + case "tag": + if (it.value || this.indent <= seq.indent) + break; + it.start.push(this.sourceToken); + return; + case "seq-item-ind": + if (this.indent !== seq.indent) + break; + if (it.value || includesToken(it.start, "seq-item-ind")) + seq.items.push({ start: [this.sourceToken] }); + else + it.start.push(this.sourceToken); + return; + } + if (this.indent > seq.indent) { + const bv = this.startBlockValue(seq); + if (bv) { + this.stack.push(bv); + return; + } + } + yield* this.pop(); + yield* this.step(); } - return result; - } - function safeParse3(header) { - if (typeof header !== "string") { - return defaultContentType; + *flowCollection(fc) { + const it = fc.items[fc.items.length - 1]; + if (this.type === "flow-error-end") { + let top; + do { + yield* this.pop(); + top = this.peek(1); + } while (top && top.type === "flow-collection"); + } else if (fc.end.length === 0) { + switch (this.type) { + case "comma": + case "explicit-key-ind": + if (!it || it.sep) + fc.items.push({ start: [this.sourceToken] }); + else + it.start.push(this.sourceToken); + return; + case "map-value-ind": + if (!it || it.value) + fc.items.push({ start: [], key: null, sep: [this.sourceToken] }); + else if (it.sep) + it.sep.push(this.sourceToken); + else + Object.assign(it, { key: null, sep: [this.sourceToken] }); + return; + case "space": + case "comment": + case "newline": + case "anchor": + case "tag": + if (!it || it.value) + fc.items.push({ start: [this.sourceToken] }); + else if (it.sep) + it.sep.push(this.sourceToken); + else + it.start.push(this.sourceToken); + return; + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": { + const fs = this.flowScalar(this.type); + if (!it || it.value) + fc.items.push({ start: [], key: fs, sep: [] }); + else if (it.sep) + this.stack.push(fs); + else + Object.assign(it, { key: fs, sep: [] }); + return; + } + case "flow-map-end": + case "flow-seq-end": + fc.end.push(this.sourceToken); + return; + } + const bv = this.startBlockValue(fc); + if (bv) + this.stack.push(bv); + else { + yield* this.pop(); + yield* this.step(); + } + } else { + const parent = this.peek(2); + if (parent.type === "block-map" && (this.type === "map-value-ind" && parent.indent === fc.indent || this.type === "newline" && !parent.items[parent.items.length - 1].sep)) { + yield* this.pop(); + yield* this.step(); + } else if (this.type === "map-value-ind" && parent.type !== "flow-collection") { + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + fixFlowSeqItems(fc); + const sep2 = fc.end.splice(1, fc.end.length); + sep2.push(this.sourceToken); + const map = { + type: "block-map", + offset: fc.offset, + indent: fc.indent, + items: [{ start, key: fc, sep: sep2 }] + }; + this.onKeyLine = true; + this.stack[this.stack.length - 1] = map; + } else { + yield* this.lineEnd(fc); + } + } } - let index = header.indexOf(";"); - const type = index !== -1 ? header.slice(0, index).trim() : header.trim(); - if (mediaTypeRE.test(type) === false) { - return defaultContentType; + flowScalar(type) { + if (this.onNewLine) { + let nl = this.source.indexOf("\n") + 1; + while (nl !== 0) { + this.onNewLine(this.offset + nl); + nl = this.source.indexOf("\n", nl) + 1; + } + } + return { + type, + offset: this.offset, + indent: this.indent, + source: this.source + }; } - const result = { - type: type.toLowerCase(), - parameters: new NullObject() - }; - if (index === -1) { - return result; + startBlockValue(parent) { + switch (this.type) { + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return this.flowScalar(this.type); + case "block-scalar-header": + return { + type: "block-scalar", + offset: this.offset, + indent: this.indent, + props: [this.sourceToken], + source: "" + }; + case "flow-map-start": + case "flow-seq-start": + return { + type: "flow-collection", + offset: this.offset, + indent: this.indent, + start: this.sourceToken, + items: [], + end: [] + }; + case "seq-item-ind": + return { + type: "block-seq", + offset: this.offset, + indent: this.indent, + items: [{ start: [this.sourceToken] }] + }; + case "explicit-key-ind": { + this.onKeyLine = true; + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + start.push(this.sourceToken); + return { + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, explicitKey: true }] + }; + } + case "map-value-ind": { + this.onKeyLine = true; + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + return { + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, key: null, sep: [this.sourceToken] }] + }; + } + } + return null; } - let key; - let match; - let value; - paramRE.lastIndex = index; - while (match = paramRE.exec(header)) { - if (match.index !== index) { - return defaultContentType; + atIndentedComment(start, indent) { + if (this.type !== "comment") + return false; + if (this.indent <= indent) + return false; + return start.every((st) => st.type === "newline" || st.type === "space"); + } + *documentEnd(docEnd) { + if (this.type !== "doc-mode") { + if (docEnd.end) + docEnd.end.push(this.sourceToken); + else + docEnd.end = [this.sourceToken]; + if (this.type === "newline") + yield* this.pop(); + } + } + *lineEnd(token) { + switch (this.type) { + case "comma": + case "doc-start": + case "doc-end": + case "flow-seq-end": + case "flow-map-end": + case "map-value-ind": + yield* this.pop(); + yield* this.step(); + break; + case "newline": + this.onKeyLine = false; + case "space": + case "comment": + default: + if (token.end) + token.end.push(this.sourceToken); + else + token.end = [this.sourceToken]; + if (this.type === "newline") + yield* this.pop(); } - index += match[0].length; - key = match[1].toLowerCase(); - value = match[2]; - if (value[0] === '"') { - value = value.slice(1, value.length - 1); - quotedPairRE.test(value) && (value = value.replace(quotedPairRE, "$1")); + } + }; + exports.Parser = Parser; + } +}); + +// +var require_public_api = __commonJS({ + ""(exports) { + "use strict"; + var composer = require_composer(); + var Document = require_Document(); + var errors = require_errors(); + var log = require_log(); + var identity = require_identity(); + var lineCounter = require_line_counter(); + var parser = require_parser(); + function parseOptions(options) { + const prettyErrors = options.prettyErrors !== false; + const lineCounter$1 = options.lineCounter || prettyErrors && new lineCounter.LineCounter() || null; + return { lineCounter: lineCounter$1, prettyErrors }; + } + function parseAllDocuments(source, options = {}) { + const { lineCounter: lineCounter2, prettyErrors } = parseOptions(options); + const parser$1 = new parser.Parser(lineCounter2 == null ? void 0 : lineCounter2.addNewLine); + const composer$1 = new composer.Composer(options); + const docs = Array.from(composer$1.compose(parser$1.parse(source))); + if (prettyErrors && lineCounter2) + for (const doc of docs) { + doc.errors.forEach(errors.prettifyError(source, lineCounter2)); + doc.warnings.forEach(errors.prettifyError(source, lineCounter2)); + } + if (docs.length > 0) + return docs; + return Object.assign([], { empty: true }, composer$1.streamInfo()); + } + function parseDocument(source, options = {}) { + const { lineCounter: lineCounter2, prettyErrors } = parseOptions(options); + const parser$1 = new parser.Parser(lineCounter2 == null ? void 0 : lineCounter2.addNewLine); + const composer$1 = new composer.Composer(options); + let doc = null; + for (const _doc of composer$1.compose(parser$1.parse(source), true, source.length)) { + if (!doc) + doc = _doc; + else if (doc.options.logLevel !== "silent") { + doc.errors.push(new errors.YAMLParseError(_doc.range.slice(0, 2), "MULTIPLE_DOCS", "Source contains multiple documents; please use YAML.parseAllDocuments()")); + break; } - result.parameters[key] = value; } - if (index !== header.length) { - return defaultContentType; + if (prettyErrors && lineCounter2) { + doc.errors.forEach(errors.prettifyError(source, lineCounter2)); + doc.warnings.forEach(errors.prettifyError(source, lineCounter2)); } - return result; + return doc; } - module.exports.default = { parse: parse3, safeParse: safeParse3 }; - module.exports.parse = parse3; - module.exports.safeParse = safeParse3; - module.exports.defaultContentType = defaultContentType; + function parse3(src, reviver, options) { + let _reviver = void 0; + if (typeof reviver === "function") { + _reviver = reviver; + } else if (options === void 0 && reviver && typeof reviver === "object") { + options = reviver; + } + const doc = parseDocument(src, options); + if (!doc) + return null; + doc.warnings.forEach((warning) => log.warn(doc.options.logLevel, warning)); + if (doc.errors.length > 0) { + if (doc.options.logLevel !== "silent") + throw doc.errors[0]; + else + doc.errors = []; + } + return doc.toJS(Object.assign({ reviver: _reviver }, options)); + } + function stringify(value, replacer, options) { + let _replacer = null; + if (typeof replacer === "function" || Array.isArray(replacer)) { + _replacer = replacer; + } else if (options === void 0 && replacer) { + options = replacer; + } + if (typeof options === "string") + options = options.length; + if (typeof options === "number") { + const indent = Math.round(options); + options = indent < 1 ? void 0 : indent > 8 ? { indent: 8 } : { indent }; + } + if (value === void 0) { + const { keepUndefined } = options ?? replacer ?? {}; + if (!keepUndefined) + return void 0; + } + if (identity.isDocument(value) && !_replacer) + return value.toString(options); + return new Document.Document(value, _replacer, options).toString(options); + } + exports.parse = parse3; + exports.parseAllDocuments = parseAllDocuments; + exports.parseDocument = parseDocument; + exports.stringify = stringify; + } +}); + +// +var require_dist2 = __commonJS({ + ""(exports) { + "use strict"; + var composer = require_composer(); + var Document = require_Document(); + var Schema = require_Schema(); + var errors = require_errors(); + var Alias = require_Alias(); + var identity = require_identity(); + var Pair = require_Pair(); + var Scalar = require_Scalar(); + var YAMLMap = require_YAMLMap(); + var YAMLSeq = require_YAMLSeq(); + var cst = require_cst(); + var lexer = require_lexer(); + var lineCounter = require_line_counter(); + var parser = require_parser(); + var publicApi = require_public_api(); + var visit = require_visit(); + exports.Composer = composer.Composer; + exports.Document = Document.Document; + exports.Schema = Schema.Schema; + exports.YAMLError = errors.YAMLError; + exports.YAMLParseError = errors.YAMLParseError; + exports.YAMLWarning = errors.YAMLWarning; + exports.Alias = Alias.Alias; + exports.isAlias = identity.isAlias; + exports.isCollection = identity.isCollection; + exports.isDocument = identity.isDocument; + exports.isMap = identity.isMap; + exports.isNode = identity.isNode; + exports.isPair = identity.isPair; + exports.isScalar = identity.isScalar; + exports.isSeq = identity.isSeq; + exports.Pair = Pair.Pair; + exports.Scalar = Scalar.Scalar; + exports.YAMLMap = YAMLMap.YAMLMap; + exports.YAMLSeq = YAMLSeq.YAMLSeq; + exports.CST = cst; + exports.Lexer = lexer.Lexer; + exports.LineCounter = lineCounter.LineCounter; + exports.Parser = parser.Parser; + exports.parse = publicApi.parse; + exports.parseAllDocuments = publicApi.parseAllDocuments; + exports.parseDocument = publicApi.parseDocument; + exports.stringify = publicApi.stringify; + exports.visit = visit.visit; + exports.visitAsync = visit.visitAsync; } }); @@ -10086,19 +25052,19 @@ var createStyler = (open, close, parent) => { parent }; }; -var createBuilder = (self, _styler, _isEmpty) => { +var createBuilder = (self2, _styler, _isEmpty) => { const builder = (...arguments_) => applyStyle(builder, arguments_.length === 1 ? "" + arguments_[0] : arguments_.join(" ")); Object.setPrototypeOf(builder, proto); - builder[GENERATOR] = self; + builder[GENERATOR] = self2; builder[STYLER] = _styler; builder[IS_EMPTY] = _isEmpty; return builder; }; -var applyStyle = (self, string) => { - if (self.level <= 0 || !string) { - return self[IS_EMPTY] ? "" : string; +var applyStyle = (self2, string) => { + if (self2.level <= 0 || !string) { + return self2[IS_EMPTY] ? "" : string; } - let styler = self[STYLER]; + let styler = self2[STYLER]; if (styler === void 0) { return string; } @@ -10138,15 +25104,23 @@ if (hasFlag2("no-color") || hasFlag2("no-colors") || hasFlag2("color=false") || flagForceColor2 = 1; } function envForceColor2() { - if ("FORCE_COLOR" in env2) { - if (env2.FORCE_COLOR === "true") { - return 1; - } - if (env2.FORCE_COLOR === "false") { - return 0; - } - return env2.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env2.FORCE_COLOR, 10), 3); + if (!("FORCE_COLOR" in env2)) { + return; + } + if (env2.FORCE_COLOR === "true") { + return 1; + } + if (env2.FORCE_COLOR === "false") { + return 0; + } + if (env2.FORCE_COLOR.length === 0) { + return 1; } + const level = Math.min(Number.parseInt(env2.FORCE_COLOR, 10), 3); + if (![0, 1, 2, 3].includes(level)) { + return; + } + return level; } function translateLevel2(level) { if (level === 0) { @@ -10194,10 +25168,10 @@ function _supportsColor2(haveStream, { streamIsTTY, sniffFlags = true } = {}) { return 1; } if ("CI" in env2) { - if ("GITHUB_ACTIONS" in env2 || "GITEA_ACTIONS" in env2) { + if (["GITHUB_ACTIONS", "GITEA_ACTIONS", "CIRCLECI"].some((key) => key in env2)) { return 3; } - if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "BUILDKITE", "DRONE"].some((sign) => sign in env2) || env2.CI_NAME === "codeship") { + if (["TRAVIS", "APPVEYOR", "GITLAB_CI", "BUILDKITE", "DRONE"].some((sign) => sign in env2) || env2.CI_NAME === "codeship") { return 1; } return min; @@ -10625,19 +25599,37 @@ var managedLabels = createTypedObject(ManagedLabel)({ DETECTED_HTTP_CHANGE: { description: "Issues related to HTTP and HTTP Client", name: "area: common/http", - commitCheck: (c) => c.type === "common/http" || c.type === "http", + commitCheck: (c) => c.scope === "common/http" || c.scope === "http", repositories: [ManagedRepositories.ANGULAR] }, DETECTED_COMPILER_CHANGE: { description: "Issues related to `ngc`, Angular's template compiler", name: "area: compiler", - commitCheck: (c) => c.type === "compiler" || c.type === "compiler-cli", + commitCheck: (c) => c.scope === "compiler" || c.scope === "compiler-cli", repositories: [ManagedRepositories.ANGULAR] }, DETECTED_PLATFORM_BROWSER_CHANGE: { description: "Issues related to the framework runtime", name: "area: core", - commitCheck: (c) => c.type === "platform-browser" || c.type === "core", + commitCheck: (c) => c.scope === "platform-browser" || c.scope === "core" || c.scope === "platform-browser-dynamic", + repositories: [ManagedRepositories.ANGULAR] + }, + DETECTED_PLATFORM_SERVER_CHANGE: { + description: "Issues related to server-side rendering", + name: "area: server", + commitCheck: (c) => c.scope === "platform-server", + repositories: [ManagedRepositories.ANGULAR] + }, + DETECTED_ZONES_CHANGE: { + description: "Issues related to zone.js", + name: "area: zones", + commitCheck: (c) => c.scope === "zone.js", + repositories: [ManagedRepositories.ANGULAR] + }, + DETECTED_LOCALIZE_CHANGE: { + description: "Issues related to localization and internationalization", + name: "area: i18n", + commitCheck: (c) => c.scope === "localize", repositories: [ManagedRepositories.ANGULAR] } }); @@ -11244,9 +26236,9 @@ function addQueryParameters(url, parameters) { return `${name}=${encodeURIComponent(parameters[name])}`; }).join("&"); } -var urlVariableRegex = /\{[^}]+\}/g; +var urlVariableRegex = /\{[^{}}]+\}/g; function removeNonChars(variableName) { - return variableName.replace(/^\W+|\W+$/g, "").split(/,/); + return variableName.replace(/(?:^\W+)|(?:(? { const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; return `application/vnd.github.${preview}-preview${format}`; @@ -11496,7 +26488,7 @@ var RequestError = class extends Error { if (options.request.headers.authorization) { requestCopy.headers = Object.assign({}, options.request.headers, { authorization: options.request.headers.authorization.replace( - / .*$/, + /(?]+)>; rel="deprecation"/); + const matches = responseHeaders.link && responseHeaders.link.match(/<([^<>]+)>; rel="deprecation"/); const deprecationLink = matches && matches.pop(); log.warn( `[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${responseHeaders.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}` @@ -11628,7 +26620,7 @@ async function getResponseData(response) { return response.text().catch(() => ""); } const mimetype = (0, import_fast_content_type_parse.safeParse)(contentType); - if (mimetype.type === "application/json") { + if (isJSONResponse(mimetype)) { let text = ""; try { text = await response.text(); @@ -11642,6 +26634,9 @@ async function getResponseData(response) { return response.arrayBuffer().catch(() => new ArrayBuffer(0)); } } +function isJSONResponse(mimetype) { + return mimetype.type === "application/json" || mimetype.type === "application/scim+json"; +} function toErrorMessage(data) { if (typeof data === "string") { return data; @@ -11782,9 +26777,9 @@ function addQueryParameters2(url, parameters) { return `${name}=${encodeURIComponent(parameters[name])}`; }).join("&"); } -var urlVariableRegex2 = /\{[^}]+\}/g; +var urlVariableRegex2 = /\{[^{}}]+\}/g; function removeNonChars2(variableName) { - return variableName.replace(/^\W+|\W+$/g, "").split(/,/); + return variableName.replace(/(?:^\W+)|(?:(? { const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; return `application/vnd.github.${preview}-preview${format}`; @@ -12034,7 +27029,7 @@ var RequestError2 = class extends Error { if (options.request.headers.authorization) { requestCopy.headers = Object.assign({}, options.request.headers, { authorization: options.request.headers.authorization.replace( - / .*$/, + /(?]+)>; rel="deprecation"/); + const matches = responseHeaders.link && responseHeaders.link.match(/<([^<>]+)>; rel="deprecation"/); const deprecationLink = matches && matches.pop(); log.warn( `[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${responseHeaders.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}` @@ -12166,7 +27161,7 @@ async function getResponseData2(response) { return response.text().catch(() => ""); } const mimetype = (0, import_fast_content_type_parse2.safeParse)(contentType); - if (mimetype.type === "application/json") { + if (isJSONResponse2(mimetype)) { let text = ""; try { text = await response.text(); @@ -12180,6 +27175,9 @@ async function getResponseData2(response) { return response.arrayBuffer().catch(() => new ArrayBuffer(0)); } } +function isJSONResponse2(mimetype) { + return mimetype.type === "application/json" || mimetype.type === "application/scim+json"; +} function toErrorMessage2(data) { if (typeof data === "string") { return data; @@ -12247,7 +27245,8 @@ var NON_VARIABLE_OPTIONS = [ "headers", "request", "query", - "mediaType" + "mediaType", + "operationName" ]; var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; @@ -12326,13 +27325,14 @@ function withCustomRequest(customRequest) { } // -var REGEX_IS_INSTALLATION_LEGACY = /^v1\./; -var REGEX_IS_INSTALLATION = /^ghs_/; -var REGEX_IS_USER_TO_SERVER = /^ghu_/; +var b64url = "(?:[a-zA-Z0-9_-]+)"; +var sep = "\\."; +var jwtRE = new RegExp(`^${b64url}${sep}${b64url}${sep}${b64url}$`); +var isJWT = jwtRE.test.bind(jwtRE); async function auth(token) { - const isApp = token.split(/\./).length === 3; - const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token); - const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token); + const isApp = isJWT(token); + const isInstallation = token.startsWith("v1.") || token.startsWith("ghs_"); + const isUserToServer = token.startsWith("ghu_"); const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth"; return { type: "token", @@ -12370,7 +27370,7 @@ var createTokenAuth = function createTokenAuth2(token) { }; // -var VERSION6 = "6.1.3"; +var VERSION6 = "6.1.4"; // var noop = () => { @@ -12558,7 +27558,7 @@ function iterator(octokit, route, parameters) { const response = await requestMethod({ method, url, headers }); const normalizedResponse = normalizePaginatedListResponse(response); url = ((normalizedResponse.headers.link || "").match( - /<([^>]+)>;\s*rel="next"/ + /<([^<>]+)>;\s*rel="next"/ ) || [])[1]; return { value: normalizedResponse }; } catch (error) { @@ -12620,7 +27620,7 @@ function paginateRest(octokit) { paginateRest.VERSION = VERSION8; // -var VERSION9 = "13.2.6"; +var VERSION9 = "13.3.1"; // var Endpoints = { @@ -12631,6 +27631,9 @@ var Endpoints = { addCustomLabelsToSelfHostedRunnerForRepo: [ "POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" ], + addRepoAccessToSelfHostedRunnerGroupInOrg: [ + "PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id}" + ], addSelectedRepoToOrgSecret: [ "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}" ], @@ -13059,6 +28062,9 @@ var Endpoints = { getGithubActionsBillingUser: [ "GET /users/{username}/settings/billing/actions" ], + getGithubBillingUsageReportOrg: [ + "GET /organizations/{org}/settings/billing/usage" + ], getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], getGithubPackagesBillingUser: [ "GET /users/{username}/settings/billing/packages" @@ -13095,9 +28101,21 @@ var Endpoints = { update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"] }, codeScanning: { + commitAutofix: [ + "POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix/commits" + ], + createAutofix: [ + "POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix" + ], + createVariantAnalysis: [ + "POST /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses" + ], deleteAnalysis: [ "DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}" ], + deleteCodeqlDatabase: [ + "DELETE /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}" + ], getAlert: [ "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", {}, @@ -13106,11 +28124,20 @@ var Endpoints = { getAnalysis: [ "GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}" ], + getAutofix: [ + "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix" + ], getCodeqlDatabase: [ "GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}" ], getDefaultSetup: ["GET /repos/{owner}/{repo}/code-scanning/default-setup"], getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"], + getVariantAnalysis: [ + "GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}" + ], + getVariantAnalysisRepoTask: [ + "GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}/repos/{repo_owner}/{repo_name}" + ], listAlertInstances: [ "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances" ], @@ -13133,6 +28160,64 @@ var Endpoints = { ], uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] }, + codeSecurity: { + attachConfiguration: [ + "POST /orgs/{org}/code-security/configurations/{configuration_id}/attach" + ], + attachEnterpriseConfiguration: [ + "POST /enterprises/{enterprise}/code-security/configurations/{configuration_id}/attach" + ], + createConfiguration: ["POST /orgs/{org}/code-security/configurations"], + createConfigurationForEnterprise: [ + "POST /enterprises/{enterprise}/code-security/configurations" + ], + deleteConfiguration: [ + "DELETE /orgs/{org}/code-security/configurations/{configuration_id}" + ], + deleteConfigurationForEnterprise: [ + "DELETE /enterprises/{enterprise}/code-security/configurations/{configuration_id}" + ], + detachConfiguration: [ + "DELETE /orgs/{org}/code-security/configurations/detach" + ], + getConfiguration: [ + "GET /orgs/{org}/code-security/configurations/{configuration_id}" + ], + getConfigurationForRepository: [ + "GET /repos/{owner}/{repo}/code-security-configuration" + ], + getConfigurationsForEnterprise: [ + "GET /enterprises/{enterprise}/code-security/configurations" + ], + getConfigurationsForOrg: ["GET /orgs/{org}/code-security/configurations"], + getDefaultConfigurations: [ + "GET /orgs/{org}/code-security/configurations/defaults" + ], + getDefaultConfigurationsForEnterprise: [ + "GET /enterprises/{enterprise}/code-security/configurations/defaults" + ], + getRepositoriesForConfiguration: [ + "GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories" + ], + getRepositoriesForEnterpriseConfiguration: [ + "GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}/repositories" + ], + getSingleConfigurationForEnterprise: [ + "GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}" + ], + setConfigurationAsDefault: [ + "PUT /orgs/{org}/code-security/configurations/{configuration_id}/defaults" + ], + setConfigurationAsDefaultForEnterprise: [ + "PUT /enterprises/{enterprise}/code-security/configurations/{configuration_id}/defaults" + ], + updateConfiguration: [ + "PATCH /orgs/{org}/code-security/configurations/{configuration_id}" + ], + updateEnterpriseConfiguration: [ + "PATCH /enterprises/{enterprise}/code-security/configurations/{configuration_id}" + ] + }, codesOfConduct: { getAllCodesOfConduct: ["GET /codes_of_conduct"], getConductCode: ["GET /codes_of_conduct/{key}"] @@ -13263,12 +28348,13 @@ var Endpoints = { cancelCopilotSeatAssignmentForUsers: [ "DELETE /orgs/{org}/copilot/billing/selected_users" ], + copilotMetricsForOrganization: ["GET /orgs/{org}/copilot/metrics"], + copilotMetricsForTeam: ["GET /orgs/{org}/team/{team_slug}/copilot/metrics"], getCopilotOrganizationDetails: ["GET /orgs/{org}/copilot/billing"], getCopilotSeatDetailsForUser: [ "GET /orgs/{org}/members/{username}/copilot" ], listCopilotSeats: ["GET /orgs/{org}/copilot/billing/seats"], - usageMetricsForEnterprise: ["GET /enterprises/{enterprise}/copilot/usage"], usageMetricsForOrg: ["GET /orgs/{org}/copilot/usage"], usageMetricsForTeam: ["GET /orgs/{org}/team/{team_slug}/copilot/usage"] }, @@ -13399,6 +28485,9 @@ var Endpoints = { "POST /repos/{owner}/{repo}/issues/{issue_number}/assignees" ], addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], + addSubIssue: [ + "POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues" + ], checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], checkUserCanBeAssignedToIssue: [ "GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}" @@ -13441,6 +28530,9 @@ var Endpoints = { "GET /repos/{owner}/{repo}/issues/{issue_number}/labels" ], listMilestones: ["GET /repos/{owner}/{repo}/milestones"], + listSubIssues: [ + "GET /repos/{owner}/{repo}/issues/{issue_number}/sub_issues" + ], lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], removeAllLabels: [ "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels" @@ -13451,6 +28543,12 @@ var Endpoints = { removeLabel: [ "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}" ], + removeSubIssue: [ + "DELETE /repos/{owner}/{repo}/issues/{issue_number}/sub_issue" + ], + reprioritizeSubIssue: [ + "PATCH /repos/{owner}/{repo}/issues/{issue_number}/sub_issues/priority" + ], setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], @@ -13524,7 +28622,11 @@ var Endpoints = { }, orgs: { addSecurityManagerTeam: [ - "PUT /orgs/{org}/security-managers/teams/{team_slug}" + "PUT /orgs/{org}/security-managers/teams/{team_slug}", + {}, + { + deprecated: "octokit.rest.orgs.addSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#add-a-security-manager-team" + } ], assignTeamToOrgRole: [ "PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" @@ -13540,7 +28642,6 @@ var Endpoints = { convertMemberToOutsideCollaborator: [ "PUT /orgs/{org}/outside_collaborators/{username}" ], - createCustomOrganizationRole: ["POST /orgs/{org}/organization-roles"], createInvitation: ["POST /orgs/{org}/invitations"], createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"], createOrUpdateCustomPropertiesValuesForRepos: [ @@ -13551,12 +28652,13 @@ var Endpoints = { ], createWebhook: ["POST /orgs/{org}/hooks"], delete: ["DELETE /orgs/{org}"], - deleteCustomOrganizationRole: [ - "DELETE /orgs/{org}/organization-roles/{role_id}" - ], deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], enableOrDisableSecurityProductOnAllOrgRepos: [ - "POST /orgs/{org}/{security_product}/{enablement}" + "POST /orgs/{org}/{security_product}/{enablement}", + {}, + { + deprecated: "octokit.rest.orgs.enableOrDisableSecurityProductOnAllOrgRepos() is deprecated, see https://docs.github.com/rest/orgs/orgs#enable-or-disable-a-security-feature-for-an-organization" + } ], get: ["GET /orgs/{org}"], getAllCustomProperties: ["GET /orgs/{org}/properties/schema"], @@ -13573,6 +28675,7 @@ var Endpoints = { ], list: ["GET /organizations"], listAppInstallations: ["GET /orgs/{org}/installations"], + listAttestations: ["GET /orgs/{org}/attestations/{subject_digest}"], listBlockedUsers: ["GET /orgs/{org}/blocks"], listCustomPropertiesValuesForRepos: ["GET /orgs/{org}/properties/values"], listFailedInvitations: ["GET /orgs/{org}/failed_invitations"], @@ -13598,12 +28701,15 @@ var Endpoints = { listPatGrants: ["GET /orgs/{org}/personal-access-tokens"], listPendingInvitations: ["GET /orgs/{org}/invitations"], listPublicMembers: ["GET /orgs/{org}/public_members"], - listSecurityManagerTeams: ["GET /orgs/{org}/security-managers"], + listSecurityManagerTeams: [ + "GET /orgs/{org}/security-managers", + {}, + { + deprecated: "octokit.rest.orgs.listSecurityManagerTeams() is deprecated, see https://docs.github.com/rest/orgs/security-managers#list-security-manager-teams" + } + ], listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], listWebhooks: ["GET /orgs/{org}/hooks"], - patchCustomOrganizationRole: [ - "PATCH /orgs/{org}/organization-roles/{role_id}" - ], pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], redeliverWebhookDelivery: [ "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" @@ -13620,7 +28726,11 @@ var Endpoints = { "DELETE /orgs/{org}/public_members/{username}" ], removeSecurityManagerTeam: [ - "DELETE /orgs/{org}/security-managers/teams/{team_slug}" + "DELETE /orgs/{org}/security-managers/teams/{team_slug}", + {}, + { + deprecated: "octokit.rest.orgs.removeSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#remove-a-security-manager-team" + } ], reviewPatGrantRequest: [ "POST /orgs/{org}/personal-access-token-requests/{pat_request_id}" @@ -13746,6 +28856,18 @@ var Endpoints = { "POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" ] }, + privateRegistries: { + createOrgPrivateRegistry: ["POST /orgs/{org}/private-registries"], + deleteOrgPrivateRegistry: [ + "DELETE /orgs/{org}/private-registries/{secret_name}" + ], + getOrgPrivateRegistry: ["GET /orgs/{org}/private-registries/{secret_name}"], + getOrgPublicKey: ["GET /orgs/{org}/private-registries/public-key"], + listOrgPrivateRegistries: ["GET /orgs/{org}/private-registries"], + updateOrgPrivateRegistry: [ + "PATCH /orgs/{org}/private-registries/{secret_name}" + ] + }, projects: { addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"], createCard: ["POST /projects/columns/{column_id}/cards"], @@ -13948,6 +29070,7 @@ var Endpoints = { compareCommitsWithBasehead: [ "GET /repos/{owner}/{repo}/compare/{basehead}" ], + createAttestation: ["POST /repos/{owner}/{repo}/attestations"], createAutolink: ["POST /repos/{owner}/{repo}/autolinks"], createCommitComment: [ "POST /repos/{owner}/{repo}/commits/{commit_sha}/comments" @@ -13983,7 +29106,6 @@ var Endpoints = { createPagesSite: ["POST /repos/{owner}/{repo}/pages"], createRelease: ["POST /repos/{owner}/{repo}/releases"], createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"], - createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"], createUsingTemplate: [ "POST /repos/{template_owner}/{template_repo}/generate" ], @@ -14035,9 +29157,6 @@ var Endpoints = { "DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}" ], deleteRepoRuleset: ["DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}"], - deleteTagProtection: [ - "DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}" - ], deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], disableAutomatedSecurityFixes: [ "DELETE /repos/{owner}/{repo}/automated-security-fixes" @@ -14172,6 +29291,9 @@ var Endpoints = { "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}" ], listActivities: ["GET /repos/{owner}/{repo}/activity"], + listAttestations: [ + "GET /repos/{owner}/{repo}/attestations/{subject_digest}" + ], listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"], listBranches: ["GET /repos/{owner}/{repo}/branches"], listBranchesForHeadCommit: [ @@ -14214,7 +29336,6 @@ var Endpoints = { "GET /repos/{owner}/{repo}/releases/{release_id}/assets" ], listReleases: ["GET /repos/{owner}/{repo}/releases"], - listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"], listTags: ["GET /repos/{owner}/{repo}/tags"], listTeams: ["GET /repos/{owner}/{repo}/teams"], listWebhookDeliveries: [ @@ -14329,9 +29450,13 @@ var Endpoints = { users: ["GET /search/users"] }, secretScanning: { + createPushProtectionBypass: [ + "POST /repos/{owner}/{repo}/secret-scanning/push-protection-bypasses" + ], getAlert: [ "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}" ], + getScanHistory: ["GET /repos/{owner}/{repo}/secret-scanning/scan-history"], listAlertsForEnterprise: [ "GET /enterprises/{enterprise}/secret-scanning/alerts" ], @@ -14485,6 +29610,7 @@ var Endpoints = { ], follow: ["PUT /user/following/{username}"], getAuthenticated: ["GET /user"], + getById: ["GET /user/{account_id}"], getByUsername: ["GET /users/{username}"], getContextForUser: ["GET /users/{username}/hovercard"], getGpgKeyForAuthenticated: [ @@ -14503,6 +29629,7 @@ var Endpoints = { "GET /user/ssh_signing_keys/{ssh_signing_key_id}" ], list: ["GET /users"], + listAttestations: ["GET /users/{username}/attestations/{subject_digest}"], listBlockedByAuthenticated: [ "GET /user/blocks", {}, @@ -14703,7 +29830,7 @@ function legacyRestEndpointMethods(octokit) { legacyRestEndpointMethods.VERSION = VERSION9; // -var VERSION10 = "21.0.2"; +var VERSION10 = "21.1.1"; // var Octokit2 = Octokit.plugin(requestLog, legacyRestEndpointMethods, paginateRest).defaults( @@ -14960,6 +30087,11 @@ Alternatively, a new token can be created at: ${GITHUB_TOKEN_GENERATE_URL} AuthenticatedGitClient._token = null; AuthenticatedGitClient._authenticatedInstance = null; +// +var import_which = __toESM(require_lib2(), 1); +var import_lockfile = __toESM(require_lockfile(), 1); +var import_yaml = __toESM(require_dist2(), 1); + // async function getDeployments() { const { github } = await AuthenticatedGitClient.get(); diff --git a/.github/actions/saucelabs-legacy/action.yml b/.github/actions/saucelabs-legacy/action.yml index 27557b38bf2a..77746c7c4892 100644 --- a/.github/actions/saucelabs-legacy/action.yml +++ b/.github/actions/saucelabs-legacy/action.yml @@ -5,9 +5,9 @@ runs: using: 'composite' steps: - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/saucelabs@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Starting Saucelabs tunnel service shell: bash run: ./tools/saucelabs/sauce-service.sh run & diff --git a/.github/actions/yarn-install/action.yml b/.github/actions/yarn-install/action.yml index 3dd8d7ed6595..aa61149af1ac 100644 --- a/.github/actions/yarn-install/action.yml +++ b/.github/actions/yarn-install/action.yml @@ -4,7 +4,7 @@ description: 'Installs the dependencies using Yarn' runs: using: 'composite' steps: - - uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4 + - uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4 with: path: | ./node_modules/ diff --git a/.github/workflows/adev-preview-build.yml b/.github/workflows/adev-preview-build.yml index 4ed5325b68cb..c8eb9c4dfd2f 100644 --- a/.github/workflows/adev-preview-build.yml +++ b/.github/workflows/adev-preview-build.yml @@ -21,16 +21,16 @@ jobs: (github.event.action == 'synchronize' && contains(github.event.pull_request.labels.*.name, 'adev: preview')) steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - name: Build adev to ensure it continues to work run: yarn bazel build //adev:build --full_build_adev --config=release - - uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@002a34e9875f55bf1850fb57d34261b33b2fd492 with: workflow-artifact-name: 'adev-preview' pull-number: '${{github.event.pull_request.number}}' diff --git a/.github/workflows/adev-preview-deploy.yml b/.github/workflows/adev-preview-deploy.yml index 901b371aee1a..92cdfd0afe1b 100644 --- a/.github/workflows/adev-preview-deploy.yml +++ b/.github/workflows/adev-preview-deploy.yml @@ -40,7 +40,7 @@ jobs: npx -y firebase-tools@latest target:clear --config adev/firebase.json --project ${{env.PREVIEW_PROJECT}} hosting angular-docs npx -y firebase-tools@latest target:apply --config adev/firebase.json --project ${{env.PREVIEW_PROJECT}} hosting angular-docs ${{env.PREVIEW_SITE}} - - uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@002a34e9875f55bf1850fb57d34261b33b2fd492 with: github-token: '${{secrets.GITHUB_TOKEN}}' workflow-artifact-name: 'adev-preview' diff --git a/.github/workflows/assistant-to-the-branch-manager.yml b/.github/workflows/assistant-to-the-branch-manager.yml index faad5f28e26a..9bc5c725a2ed 100644 --- a/.github/workflows/assistant-to-the-branch-manager.yml +++ b/.github/workflows/assistant-to-the-branch-manager.yml @@ -16,6 +16,6 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - - uses: angular/dev-infra/github-actions/branch-manager@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/branch-manager@002a34e9875f55bf1850fb57d34261b33b2fd492 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/benchmark-compare.yml b/.github/workflows/benchmark-compare.yml index 3b8f5b84b83c..940187d357eb 100644 --- a/.github/workflows/benchmark-compare.yml +++ b/.github/workflows/benchmark-compare.yml @@ -38,7 +38,7 @@ jobs: - uses: ./.github/actions/yarn-install - - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 with: bazelrc: ./.bazelrc.user diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6380f97b9513..c4ca54203804 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Install node modules @@ -41,13 +41,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - name: Run unit tests @@ -59,13 +59,13 @@ jobs: runs-on: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile --network-timeout 100000 - name: Run CI tests for framework @@ -76,30 +76,32 @@ jobs: labels: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - name: Build adev in fast mode to ensure it continues to work run: yarn bazel build //adev:build --config=release - - name: Run tests - run: yarn bazel test //adev/... + # TODO: re-enable tests once the next release is shipped + # Tests are broken because of https://github.com/angular/angular/issues/54858 + # - name: Run tests + # run: yarn bazel test //adev/... publish-snapshots: runs-on: labels: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - run: echo "https://${{secrets.SNAPSHOT_BUILDS_GITHUB_TOKEN}}:@github.com" > ${HOME}/.git_credentials @@ -111,7 +113,7 @@ jobs: labels: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true node-module-directories: | @@ -119,9 +121,9 @@ jobs: ./packages/zone.js/node_modules ./packages/zone.js/test/typings/node_modules - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - run: | @@ -158,7 +160,7 @@ jobs: SAUCE_TUNNEL_IDENTIFIER: angular-framework-${{ github.run_number }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Install node modules @@ -171,11 +173,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - name: Build adev to ensure it continues to work diff --git a/.github/workflows/dev-infra.yml b/.github/workflows/dev-infra.yml index dec5276091ec..ee6170373828 100644 --- a/.github/workflows/dev-infra.yml +++ b/.github/workflows/dev-infra.yml @@ -13,13 +13,13 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: angular/dev-infra/github-actions/commit-message-based-labels@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/commit-message-based-labels@002a34e9875f55bf1850fb57d34261b33b2fd492 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} post_approval_changes: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: angular/dev-infra/github-actions/post-approval-changes@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/post-approval-changes@002a34e9875f55bf1850fb57d34261b33b2fd492 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/google-internal-tests.yml b/.github/workflows/google-internal-tests.yml index c06d486970ec..3016d863a1c1 100644 --- a/.github/workflows/google-internal-tests.yml +++ b/.github/workflows/google-internal-tests.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: angular/dev-infra/github-actions/google-internal-tests@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/google-internal-tests@002a34e9875f55bf1850fb57d34261b33b2fd492 with: run-tests-guide-url: http://go/angular-g3sync-start github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/manual.yml b/.github/workflows/manual.yml index 062bd915a3f2..5e8a8e3c51bc 100644 --- a/.github/workflows/manual.yml +++ b/.github/workflows/manual.yml @@ -13,17 +13,17 @@ jobs: JOBS: 2 steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Install node modules run: yarn install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/saucelabs@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Set up Sauce Tunnel Daemon run: yarn bazel run //tools/saucelabs-daemon/background-service -- $JOBS & env: diff --git a/.github/workflows/merge-ready-status.yml b/.github/workflows/merge-ready-status.yml index 84e1f4b2c975..d53308734be6 100644 --- a/.github/workflows/merge-ready-status.yml +++ b/.github/workflows/merge-ready-status.yml @@ -9,6 +9,6 @@ jobs: status: runs-on: ubuntu-latest steps: - - uses: angular/dev-infra/github-actions/unified-status-check@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/unified-status-check@002a34e9875f55bf1850fb57d34261b33b2fd492 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml index 5c462853df65..78c5a8e9e70d 100644 --- a/.github/workflows/perf.yml +++ b/.github/workflows/perf.yml @@ -21,7 +21,7 @@ jobs: workflows: ${{ steps.workflows.outputs.workflows }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn -s install --frozen-lockfile - id: workflows @@ -36,9 +36,9 @@ jobs: workflow: ${{ fromJSON(needs.list.outputs.workflows) }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn -s install --frozen-lockfile # We utilize the google-github-actions/auth action to allow us to get an active credential using workflow diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index e524cb9f57aa..2dc0b361e267 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Install node modules @@ -39,7 +39,7 @@ jobs: - name: Check code format run: yarn ng-dev format changed --check ${{ github.event.pull_request.base.sha }} - name: Check Package Licenses - uses: angular/dev-infra/github-actions/linting/licenses@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/linting/licenses@002a34e9875f55bf1850fb57d34261b33b2fd492 with: allow-dependencies-licenses: 'pkg:npm/google-protobuf@' @@ -47,13 +47,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - name: Run unit tests @@ -65,13 +65,13 @@ jobs: runs-on: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile --network-timeout 100000 - name: Run CI tests for framework @@ -83,19 +83,19 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile --network-timeout 100000 - name: Run CI tests for framework run: yarn tsx ./scripts/build/build-packages-dist.mts - name: Archive build artifacts - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: name: pr-artifacts-${{ github.event.number }} path: dist/packages-dist/ @@ -105,24 +105,26 @@ jobs: labels: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - name: Build adev in fast mode to ensure it continues to work run: yarn bazel build //adev:build --config=release - - name: Run tests - run: yarn bazel test //adev/... + # TODO: re-enable tests once the next release is shipped + # Tests are broken because of https://github.com/angular/angular/issues/54858 + # - name: Run tests + # run: yarn bazel test //adev/... zone-js: runs-on: labels: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true node-module-directories: | @@ -130,9 +132,9 @@ jobs: ./packages/zone.js/node_modules ./packages/zone.js/test/typings/node_modules - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - run: | @@ -169,7 +171,7 @@ jobs: SAUCE_TUNNEL_IDENTIFIER: angular-framework-${{ github.run_number }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Install node modules diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 970aefa63a76..f4ac5f2d6104 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -30,7 +30,7 @@ jobs: persist-credentials: false - name: 'Run analysis' - uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 # v2.4.0 + uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 with: results_file: results.sarif results_format: sarif @@ -39,7 +39,7 @@ jobs: # Upload the results as artifacts. - name: 'Upload artifact' - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: name: SARIF file path: results.sarif @@ -47,6 +47,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@48ab28a6f5dbc2a99bf1e0131198dd8f1df78169 # v3.28.0 + uses: github/codeql-action/upload-sarif@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10 with: sarif_file: results.sarif diff --git a/.github/workflows/update-cli-help.yml b/.github/workflows/update-cli-help.yml index ab56712d9854..3703c2865425 100644 --- a/.github/workflows/update-cli-help.yml +++ b/.github/workflows/update-cli-help.yml @@ -32,7 +32,7 @@ jobs: env: ANGULAR_CLI_BUILDS_READONLY_GITHUB_TOKEN: ${{ secrets.ANGULAR_CLI_BUILDS_READONLY_GITHUB_TOKEN }} - name: Create a PR (if necessary) - uses: angular/dev-infra/github-actions/create-pr-for-changes@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/create-pr-for-changes@002a34e9875f55bf1850fb57d34261b33b2fd492 with: branch-prefix: update-cli-help pr-title: 'docs: update Angular CLI help [${{github.ref_name}}]' diff --git a/.ng-dev/commit-message.mts b/.ng-dev/commit-message.mts index 5dd41e73e532..5284f4fa0c29 100644 --- a/.ng-dev/commit-message.mts +++ b/.ng-dev/commit-message.mts @@ -32,7 +32,6 @@ export const commitMessage: CommitMessageConfig = { 'router', 'service-worker', 'upgrade', - 've', 'zone.js', ], }; diff --git a/.ng-dev/pull-request.mts b/.ng-dev/pull-request.mts index 344c28e3185c..237ea813ec9b 100644 --- a/.ng-dev/pull-request.mts +++ b/.ng-dev/pull-request.mts @@ -22,4 +22,12 @@ export const pullRequest: PullRequestConfig = { assertEnforceTested: true, assertIsolatedSeparateFiles: true, }, + + requiredStatuses: [ + {type: 'check', name: 'test'}, + {type: 'check', name: 'lint'}, + {type: 'check', name: 'adev'}, + {type: 'check', name: 'zone-js'}, + {type: 'status', name: 'google-internal-tests'}, + ], }; diff --git a/.nvmrc b/.nvmrc index f4e1dd5b00ce..1117d417c6ac 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18.20.0 +18.20.5 diff --git a/.pullapprove.yml b/.pullapprove.yml index 8357b0095e38..e1c994e987ff 100644 --- a/.pullapprove.yml +++ b/.pullapprove.yml @@ -56,8 +56,8 @@ version: 3 -availability: - users_unavailable: ['atscott'] +# availability: +# users_unavailable: ['atscott'] # Meta field that goes unused by PullApprove to allow for defining aliases to be # used throughout the config. @@ -133,6 +133,7 @@ groups: - devversion - kirjs - JoostK + - mmalerba # ========================================================= # Framework: General (most code in our packages) @@ -143,7 +144,6 @@ groups: - > contains_any_globs(files.exclude('packages/core/primitives/*'), [ 'contributing-docs/public-api-surface.md', - 'goldens/circular-deps/packages.json', 'integration/**/{*,.*}', 'modules/**/{*,.*}', 'packages/animations/**/{*,.*}', @@ -175,6 +175,7 @@ groups: - ~jelbourn - thePunderWoman - pkozlowski-opensource + - mmalerba # ========================================================= # Framework: Security-sensitive files which require extra review @@ -227,9 +228,9 @@ groups: <<: *defaults conditions: - > - contains_any_globs(files, [ + contains_any_globs(files.exclude('yarn.lock'), [ 'packages/zone.js/**/{*,.*}', - ]) + ]) reviewers: users: - JiaLiPassion @@ -285,6 +286,7 @@ groups: - mgechev - MarkTechson - kirjs + - mmalerba # ========================================================= # Angular DevTools @@ -391,6 +393,7 @@ groups: - thePunderWoman - pkozlowski-opensource - kirjs + - mmalerba - ~iteriani - ~tbondwilkinson - ~rahatarmanahmed @@ -420,33 +423,12 @@ groups: - ~jelbourn - thePunderWoman - pkozlowski-opensource + - mmalerba reviews: request: 2 # Request reviews from 2 people required: 1 # Require that 1 person approve reviewed_for: required - # ================================================ - # Circular dependencies - # ================================================ - circular-dependencies: - <<: *defaults - conditions: - - *no-groups-above-this-pending - - *no-groups-above-this-rejected - - > - contains_any_globs(files, [ - 'goldens/circular-deps/packages.json' - ]) - reviewers: - users: - - alxhub - - AndrewKushnir - - atscott - - ~jelbourn - - thePunderWoman - - pkozlowski-opensource - - kirjs - #################################################################################### # Special Cases #################################################################################### @@ -516,6 +498,7 @@ groups: - iteriani # Thomas Nguyen - tbondwilkinson # Tom Wilkinson - rahatarmanahmed # Rahat Ahmed + - ENAML # Ethan Cline labels: pending: 'requires: TGP' approved: 'requires: TGP' diff --git a/CHANGELOG.md b/CHANGELOG.md index e64860496b2b..e61857ec052b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,128 +1,311 @@ - -# 19.0.6 (2025-01-08) + +# 19.2.0 (2025-02-26) +### common +| Commit | Type | Description | +| -- | -- | -- | +| [3e39da593a](https://github.com/angular/angular/commit/3e39da593a0a0c047a2a03b8d5fcabf9dbace40f) | feat | introduce experimental `httpResource` ([#59876](https://github.com/angular/angular/pull/59876)) | +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [5b20bab96d](https://github.com/angular/angular/commit/5b20bab96d20fe89b5cc4b4af28edbaae2604da1) | feat | Add Skip Hydration diagnostic. ([#59576](https://github.com/angular/angular/pull/59576)) | +| [fe8a68329b](https://github.com/angular/angular/commit/fe8a68329b50363f914a728579392f3fc68670a6) | feat | support untagged template literals in expressions ([#59230](https://github.com/angular/angular/pull/59230)) | ### compiler-cli | Commit | Type | Description | | -- | -- | -- | -| [06a55e9817](https://github.com/angular/angular/commit/06a55e98173ff7bdd4e2ac1263309f9b935240f0) | fix | account for more expression types when determining HMR dependencies ([#59323](https://github.com/angular/angular/pull/59323)) | -| [17fb20f85d](https://github.com/angular/angular/commit/17fb20f85db9f3c172c194c0436644f34b7176b1) | fix | preserve defer block dependencies during HMR when class metadata is disabled ([#59313](https://github.com/angular/angular/pull/59313)) | +| [ed705a856a](https://github.com/angular/angular/commit/ed705a856a164f91d33e2173b4f371329d07c472) | feat | detect missing structural directive imports ([#59443](https://github.com/angular/angular/pull/59443)) | ### core | Commit | Type | Description | | -- | -- | -- | -| [07afce81b8](https://github.com/angular/angular/commit/07afce81b8ce28d1b308ff25017a4d4993881f36) | fix | Ensure that a destroyed `effect` never run. ([#59415](https://github.com/angular/angular/pull/59415)) | +| [2588985f43](https://github.com/angular/angular/commit/2588985f433b20a6a5a8d239347291f5d6fb2451) | feat | pass signal node to throwInvalidWriteToSignalErrorFn ([#59600](https://github.com/angular/angular/pull/59600)) | +| [168516462a](https://github.com/angular/angular/commit/168516462a9673b158fcaa38b8ce17bf684a8ac9) | feat | support default value in `resource()` ([#59655](https://github.com/angular/angular/pull/59655)) | +| [bc2ad7bfd3](https://github.com/angular/angular/commit/bc2ad7bfd37a61992b550943de5da0eab2eec98b) | feat | support streaming resources ([#59573](https://github.com/angular/angular/pull/59573)) | +| [146ab9a76e](https://github.com/angular/angular/commit/146ab9a76e6b4d8db7d08d34e2571ba5207f8756) | feat | support TypeScript 5.8 ([#59830](https://github.com/angular/angular/pull/59830)) | +| [6c92d65349](https://github.com/angular/angular/commit/6c92d653493404a5f13aa59cde390bcbed973fb6) | fix | add `hasValue` narrowing to `ResourceRef` ([#59708](https://github.com/angular/angular/pull/59708)) | +| [96e602ebe9](https://github.com/angular/angular/commit/96e602ebe9cdf7355befad22c11f9f91e0436e01) | fix | cancel in-progress request when same value is assigned ([#59280](https://github.com/angular/angular/pull/59280)) | +| [6789c7ef94](https://github.com/angular/angular/commit/6789c7ef947952551d7598fe37a3d86093b75720) | fix | Defer afterRender until after first CD ([#59455](https://github.com/angular/angular/pull/59455)) ([#59551](https://github.com/angular/angular/pull/59551)) | +| [c87e581dd9](https://github.com/angular/angular/commit/c87e581dd9e240c88cea50f222942873bdccd01d) | fix | Don't run effects in check no changes pass ([#59455](https://github.com/angular/angular/pull/59455)) ([#59551](https://github.com/angular/angular/pull/59551)) | +| [127fc0dc84](https://github.com/angular/angular/commit/127fc0dc847a4e8b62be36cdd980a067c4da974f) | fix | fix `resource()`'s `previous.state` ([#59708](https://github.com/angular/angular/pull/59708)) | +| [b592b1b051](https://github.com/angular/angular/commit/b592b1b0516786c52c7d0638c4e7545b0de8a545) | fix | fix race condition in resource() ([#59851](https://github.com/angular/angular/pull/59851)) | +| [a299e02e91](https://github.com/angular/angular/commit/a299e02e9141cdc4d74185deb58308fa010bb36e) | fix | preserve tracing snapshot until tick finishes ([#59796](https://github.com/angular/angular/pull/59796)) | +### forms +| Commit | Type | Description | +| -- | -- | -- | +| [fa0c3e3210](https://github.com/angular/angular/commit/fa0c3e3210885a36e5c9e9eb76e821032f5cd215) | feat | support type set in form validators ([#45793](https://github.com/angular/angular/pull/45793)) | +### migrations +| Commit | Type | Description | +| -- | -- | -- | +| [1cd3a7db83](https://github.com/angular/angular/commit/1cd3a7db83e1d05a31d23324676420b614cdabe2) | feat | add migration to convert templates to use self-closing tags ([#57342](https://github.com/angular/angular/pull/57342)) | ### platform-browser | Commit | Type | Description | | -- | -- | -- | -| [dbb8980d03](https://github.com/angular/angular/commit/dbb8980d03485ad1cf0e19503c4e770b1ba0767e) | fix | avoid circular DI error in async renderer ([#59271](https://github.com/angular/angular/pull/59271)) | -| [6d00efde95](https://github.com/angular/angular/commit/6d00efde952971573359b32cab06d0a513600fe0) | fix | styles not replaced during HMR when using animations renderer ([#59393](https://github.com/angular/angular/pull/59393)) | -### router +| [e6cb411e43](https://github.com/angular/angular/commit/e6cb411e4393a4b1f5852d3d7c5b9622504399b1) | fix | automatically disable animations on the server ([#59762](https://github.com/angular/angular/pull/59762)) | +### platform-server | Commit | Type | Description | | -- | -- | -- | -| [144bccb687](https://github.com/angular/angular/commit/144bccb6872ece8fa1cf4954b5839054ccf20aa1) | fix | avoid component ID collisions with user code ([#59300](https://github.com/angular/angular/pull/59300)) | +| [fc5d187da5](https://github.com/angular/angular/commit/fc5d187da5e8895d60caa35b7b59e234998eddf0) | fix | decouple server from animations module ([#59762](https://github.com/angular/angular/pull/59762)) | - -# 19.1.0-next.4 (2024-12-18) -### core + +# 19.1.7 (2025-02-19) +### common | Commit | Type | Description | | -- | -- | -- | -| [57f3550219](https://github.com/angular/angular/commit/57f3550219f2a57c7c26c9183e48ee66845e0439) | feat | add utility for resolving defer block information to ng global ([#59184](https://github.com/angular/angular/pull/59184)) | -| [22f191f763](https://github.com/angular/angular/commit/22f191f76339a08bb8f0f2dfbc60dde0f2e38e73) | feat | extend the set of profiler events ([#59183](https://github.com/angular/angular/pull/59183)) | -| [1f4ff2fa36](https://github.com/angular/angular/commit/1f4ff2fa36f5d6240cbc4a40839d3d89501519d8) | fix | avoid triggering `on timer` and `on idle` on the server ([#59177](https://github.com/angular/angular/pull/59177)) | -| [cf89f14766](https://github.com/angular/angular/commit/cf89f14766b0ed0204f7012d44a4732fccb35398) | fix | Fix nested timer serialization ([#59173](https://github.com/angular/angular/pull/59173)) | -### platform-server +| [e9f10eb4c9](https://github.com/angular/angular/commit/e9f10eb4c950692992098619b9628ecefd1b36ce) | fix | clean up `urlChanges` subscribers when root scope is destroyed ([#59703](https://github.com/angular/angular/pull/59703)) | +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [16fc074689](https://github.com/angular/angular/commit/16fc074689d31ef6886c49525b020bc6c1529d0e) | fix | avoid crash in isolated transform operations ([#59869](https://github.com/angular/angular/pull/59869)) | +### forms | Commit | Type | Description | | -- | -- | -- | -| [300b141cc8](https://github.com/angular/angular/commit/300b141cc8652fd714b02f05c943cb79167ea844) | fix | Warn user when transfer state happens more than once ([#58935](https://github.com/angular/angular/pull/58935)) | +| [ec1e4c3d94](https://github.com/angular/angular/commit/ec1e4c3d9430f5ea4380252098d2b4b71d8a950f) | fix | Fix typing on `FormRecord`. ([#59993](https://github.com/angular/angular/pull/59993)) | - -# 19.0.5 (2024-12-18) + +# 19.1.6 (2025-02-12) +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [01f669a274](https://github.com/angular/angular/commit/01f669a27425c5034a04274763cc60801f961aa2) | fix | handle tracking expressions requiring temporary variables ([#58520](https://github.com/angular/angular/pull/58520)) | +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [dcfb9f1959](https://github.com/angular/angular/commit/dcfb9f1959164baf45f5f954b4bf681d650d8a2d) | fix | handle deferred blocks with shared dependencies correctly ([#59926](https://github.com/angular/angular/pull/59926)) | ### core | Commit | Type | Description | | -- | -- | -- | -| [3793218e77](https://github.com/angular/angular/commit/3793218e77d699ddfae95a53ad048d4bfb9f042c) | fix | avoid triggering `on timer` and `on idle` on the server ([#59177](https://github.com/angular/angular/pull/59177)) | -| [cfc96ed82c](https://github.com/angular/angular/commit/cfc96ed82cbe958ea7548718f76a2e7a3d6826a9) | fix | Fix nested timer serialization ([#59173](https://github.com/angular/angular/pull/59173)) | -### platform-server +| [cab7a9b69c](https://github.com/angular/angular/commit/cab7a9b69c3a5d789432a87a554e8489c78a0f15) | fix | invalidate HMR component if replacement throws an error ([#59854](https://github.com/angular/angular/pull/59854)) | +### migrations | Commit | Type | Description | | -- | -- | -- | -| [9085a8fbd8](https://github.com/angular/angular/commit/9085a8fbd8cb61e3ce45adfa9ca2e96ba0be6f62) | fix | Warn user when transfer state happens more than once ([#58935](https://github.com/angular/angular/pull/58935)) | +| [710759ddcc](https://github.com/angular/angular/commit/710759ddcc0ecbad68deb20821b535fd5deb69c6) | fix | account for let declarations in control flow migration ([#59861](https://github.com/angular/angular/pull/59861)) | +| [46f36a58bf](https://github.com/angular/angular/commit/46f36a58bf3a7b9131b6330e84d4adb3e73f3601) | fix | count used dependencies inside existing control flow ([#59861](https://github.com/angular/angular/pull/59861)) | - -# 19.1.0-next.3 (2024-12-12) + +# 19.1.5 (2025-02-06) ### compiler-cli | Commit | Type | Description | | -- | -- | -- | -| [c5c20e9d86](https://github.com/angular/angular/commit/c5c20e9d86d72b33840dcf0adea02876437a589f) | fix | check event side of two-way bindings ([#59002](https://github.com/angular/angular/pull/59002)) | -| [0dee2681f7](https://github.com/angular/angular/commit/0dee2681f782106fdb0fdcf9bc6ad1bca562751d) | fix | consider pre-release versions when detecting feature support ([#59061](https://github.com/angular/angular/pull/59061)) | -| [1b9492edf8](https://github.com/angular/angular/commit/1b9492edf88f8a217c0fd1a8203df489d91b623b) | fix | error in unused standalone imports diagnostic ([#59064](https://github.com/angular/angular/pull/59064)) | +| [d7b5c597ffc](https://github.com/angular/angular/commit/d7b5c597ffcb6469ae3f08a97e7790599d569cc4) | fix | gracefully fall back if const enum cannot be passed through ([#59815](https://github.com/angular/angular/pull/59815)) | +| [53a4668b58b](https://github.com/angular/angular/commit/53a4668b58b645e41baddc5b67d52ede21c8e945) | fix | handle const enums used inside HMR data ([#59815](https://github.com/angular/angular/pull/59815)) | +| [976125e0b4c](https://github.com/angular/angular/commit/976125e0b4cf4e7fb4621a7203e3f43b009885f0) | fix | handle enum members without initializers in partial evaluator ([#59815](https://github.com/angular/angular/pull/59815)) | + + + + +# 19.1.4 (2025-01-29) ### core | Commit | Type | Description | | -- | -- | -- | -| [d010e11b73](https://github.com/angular/angular/commit/d010e11b735562ded439989ddb84cc83c6c00e81) | feat | add event listener options to renderer ([#59092](https://github.com/angular/angular/pull/59092)) | -| [30e676098d](https://github.com/angular/angular/commit/30e676098d72e9e11a6628b9716668df08f18c62) | fix | Fix a bug where snapshotted functions are being run twice if they return a nullish/falsey value. ([#59073](https://github.com/angular/angular/pull/59073)) | +| [544b9ee7ca0](https://github.com/angular/angular/commit/544b9ee7ca00925e62b7c74cf7930777a10aaf76) | fix | check whether application is destroyed before printing hydration stats ([#59716](https://github.com/angular/angular/pull/59716)) | +| [d6e78c072dc](https://github.com/angular/angular/commit/d6e78c072dcb5b0b6efc2b098fdb911ccddf6e81) | fix | ensure type is preserved during HMR ([#59700](https://github.com/angular/angular/pull/59700)) | +| [c2436702df9](https://github.com/angular/angular/commit/c2436702df980bbf2db0fe3bee4c72860edb4e63) | fix | fixes test timer-based test flakiness in CI ([#59674](https://github.com/angular/angular/pull/59674)) | +### elements +| Commit | Type | Description | +| -- | -- | -- | +| [44180645992](https://github.com/angular/angular/commit/44180645992f7d9018ccb2d7663530b3cffde36b) | fix | not setting initial value on signal-based input ([#59773](https://github.com/angular/angular/pull/59773)) | ### platform-browser | Commit | Type | Description | | -- | -- | -- | -| [52be35118f](https://github.com/angular/angular/commit/52be35118feee587d2efe5a6c55502c171caaa97) | fix | collect external component styles from server rendering ([#59031](https://github.com/angular/angular/pull/59031)) | +| [1828a840620](https://github.com/angular/angular/commit/1828a8406201827e52549c8afa487bf6364a70c3) | fix | prepend `baseHref` to `sourceMappingURL` in CSS content ([#59730](https://github.com/angular/angular/pull/59730)) | +| [1c84cbca30e](https://github.com/angular/angular/commit/1c84cbca30e6606e6df3f40346989d9434d89bc6) | fix | Update pseudoevent created by createMouseSpecialEvent to populate `_originalEvent` property ([#59690](https://github.com/angular/angular/pull/59690)) | +| [12256574626](https://github.com/angular/angular/commit/12256574626f04f5fe2b41e805f7bdc93d62df0a) | fix | Update pseudoevent created by createMouseSpecialEvent to populate `_originalEvent` property ([#59690](https://github.com/angular/angular/pull/59690)) | +| [3f4d5f636aa](https://github.com/angular/angular/commit/3f4d5f636aac90cabe32ff6c4d75180ced99eb97) | fix | Update pseudoevent created by createMouseSpecialEvent to populate `_originalEvent` property ([#59690](https://github.com/angular/angular/pull/59690)) | +### router +| Commit | Type | Description | +| -- | -- | -- | +| [e3da35ec749](https://github.com/angular/angular/commit/e3da35ec749395239731158f89e29d47e7a9ef36) | fix | prevent error handling when injector is destroyed ([#59457](https://github.com/angular/angular/pull/59457)) | +### service-worker +| Commit | Type | Description | +| -- | -- | -- | +| [522acbf3d7e](https://github.com/angular/angular/commit/522acbf3d7ed502e7802117776acda3529a9a2b4) | fix | add missing `rxjs` peer dependency ([#59747](https://github.com/angular/angular/pull/59747)) | - -# 19.0.4 (2024-12-12) + +# 19.1.3 (2025-01-22) +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [ecfb74d287](https://github.com/angular/angular/commit/ecfb74d287bec7bec37d0b476b321b047bef2c43) | fix | handle :host-context with comma-separated child selector ([#59276](https://github.com/angular/angular/pull/59276)) | ### compiler-cli | Commit | Type | Description | | -- | -- | -- | -| [7e612171709](https://github.com/angular/angular/commit/7e6121717098462b4f53dc7212064243f2bcf024) | fix | consider pre-release versions when detecting feature support ([#59061](https://github.com/angular/angular/pull/59061)) | -| [cd764a31152](https://github.com/angular/angular/commit/cd764a31152004d37aa621efc4990c090d86f1e0) | fix | error in unused standalone imports diagnostic ([#59064](https://github.com/angular/angular/pull/59064)) | +| [53160e504d](https://github.com/angular/angular/commit/53160e504df44b05f59cacd9afeb40a0e627b744) | fix | extract parenthesized dependencies during HMR ([#59644](https://github.com/angular/angular/pull/59644)) | +| [39690969af](https://github.com/angular/angular/commit/39690969af14914df0c9b5a009b2df920f5c03e7) | fix | handle conditional expressions when extracting dependencies ([#59637](https://github.com/angular/angular/pull/59637)) | +| [78af7a5059](https://github.com/angular/angular/commit/78af7a5059cc3e03704ba63f8512351a40470557) | fix | handle new expressions when extracting dependencies ([#59637](https://github.com/angular/angular/pull/59637)) | ### core | Commit | Type | Description | | -- | -- | -- | -| [34ded10fa60](https://github.com/angular/angular/commit/34ded10fa6061a12531de8837a436cf0a1ac20b8) | fix | Fix a bug where snapshotted functions are being run twice if they return a nullish/falsey value. ([#59073](https://github.com/angular/angular/pull/59073)) | +| [408af24ff3](https://github.com/angular/angular/commit/408af24ff3490926e9992cb4f1f71914d71ad6ad) | fix | capture self-referencing component during HMR ([#59644](https://github.com/angular/angular/pull/59644)) | +| [d7575c201c](https://github.com/angular/angular/commit/d7575c201cfd61010952b3a633eec03e32f58220) | fix | replace metadata in place during HMR ([#59644](https://github.com/angular/angular/pull/59644)) | +| [26f6d4c485](https://github.com/angular/angular/commit/26f6d4c485b566d7bc127c78cc163c376d0fe6b5) | fix | skip component ID collision warning during SSR ([#59625](https://github.com/angular/angular/pull/59625)) | +### migrations +| Commit | Type | Description | +| -- | -- | -- | +| [a62c84bc18](https://github.com/angular/angular/commit/a62c84bc188d41ea24cf0eca14ac18c4b917ccd0) | fix | avoid applying the same replacements twice when cleaning up unused imports ([#59656](https://github.com/angular/angular/pull/59656)) | ### platform-browser | Commit | Type | Description | | -- | -- | -- | -| [ae0802d63c5](https://github.com/angular/angular/commit/ae0802d63c50307791e8a5d765573836dfe89075) | fix | collect external component styles from server rendering ([#59031](https://github.com/angular/angular/pull/59031)) | +| [b2b3816cb1](https://github.com/angular/angular/commit/b2b3816cb1c5c573dc9368f05fd2971671d7159f) | fix | clear renderer cache during HMR when using async animations ([#59644](https://github.com/angular/angular/pull/59644)) | - -# 19.1.0-next.2 (2024-12-04) + +# 19.1.2 (2025-01-20) +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [8dcd889987](https://github.com/angular/angular/commit/8dcd88998700a94115a542462e6ae6beedbfbd9d) | fix | update `@ng/component` URL to be relative ([#59620](https://github.com/angular/angular/pull/59620)) | +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [95a05bb202](https://github.com/angular/angular/commit/95a05bb2021acab02df3468212adf023d331a688) | fix | disable tree shaking during HMR ([#59595](https://github.com/angular/angular/pull/59595)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [a4eb74c79c](https://github.com/angular/angular/commit/a4eb74c79cca802d8179118cf4d53c73285baadb) | fix | animation sometimes renderer not being destroyed during HMR ([#59574](https://github.com/angular/angular/pull/59574)) | +| [906413aba3](https://github.com/angular/angular/commit/906413aba31459e6499420ed14519d1280e182ad) | fix | change `Resource` to use explicit `undefined` in its typings ([#59024](https://github.com/angular/angular/pull/59024)) | +| [4eb541837c](https://github.com/angular/angular/commit/4eb541837cf28ce1950d782213291165a2436410) | fix | cleanup `_ejsa` when app is destroyed ([#59492](https://github.com/angular/angular/pull/59492)) | +| [5497102769](https://github.com/angular/angular/commit/549710276969ec4cf8c1e3d2f19d1fe9f755976e) | fix | cleanup stash listener when app is destroyed ([#59598](https://github.com/angular/angular/pull/59598)) | +| [266a8f2f2e](https://github.com/angular/angular/commit/266a8f2f2ebf9f5e310ba5de695be5072790e1e5) | fix | handle shadow DOM encapsulated component with HMR ([#59597](https://github.com/angular/angular/pull/59597)) | +| [6f7716268a](https://github.com/angular/angular/commit/6f7716268afa5146f2b2d0dbbea146defa9acfef) | fix | HMR not matching component that injects ViewContainerRef ([#59596](https://github.com/angular/angular/pull/59596)) | +| [d12a186d53](https://github.com/angular/angular/commit/d12a186d531b41e6a16f84446a1d54eaed010fc4) | fix | treat exceptions in `equal` as part of computation ([#55818](https://github.com/angular/angular/pull/55818)) | - -# 19.0.3 (2024-12-04) + +# 19.1.1 (2025-01-16) +### core +| Commit | Type | Description | +| -- | -- | -- | +| [357795cb96](https://github.com/angular/angular/commit/357795cb96a1cd138ec263c468c9de8ca8b2af9c) | fix | run HMR replacement in the zone ([#59562](https://github.com/angular/angular/pull/59562)) | +### platform-browser +| Commit | Type | Description | +| -- | -- | -- | +| [eb0b1851f4](https://github.com/angular/angular/commit/eb0b1851f494adfe72f583763a44bd2528a5956c) | fix | roll back HMR fix ([#59557](https://github.com/angular/angular/pull/59557)) | - -# 19.1.0-next.1 (2024-12-04) + +# 19.1.0 (2025-01-15) +### common +| Commit | Type | Description | +| -- | -- | -- | +| [e4c50b3bea](https://github.com/angular/angular/commit/e4c50b3bea22ca2afba74465893c36730952f4b9) | feat | expose component instance in NgComponentOutlet ([#58698](https://github.com/angular/angular/pull/58698)) | +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [ceadd28ea1](https://github.com/angular/angular/commit/ceadd28ea12140e8e78cdb706aff0487f5a87a3c) | fix | allow $any in two-way bindings ([#59362](https://github.com/angular/angular/pull/59362)) | +| [aed49ddaaa](https://github.com/angular/angular/commit/aed49ddaaa40d6e6816198b47ceada4e98cd636c) | fix | use chunk origin in template HMR request URL ([#59459](https://github.com/angular/angular/pull/59459)) | ### compiler-cli | Commit | Type | Description | | -- | -- | -- | -| [f280467398](https://github.com/angular/angular/commit/f280467398c6980878b5e755a78606251814447b) | fix | account for multiple generated namespace imports in HMR ([#58924](https://github.com/angular/angular/pull/58924)) | +| [c5c20e9d86](https://github.com/angular/angular/commit/c5c20e9d86d72b33840dcf0adea02876437a589f) | fix | check event side of two-way bindings ([#59002](https://github.com/angular/angular/pull/59002)) | ### core | Commit | Type | Description | | -- | -- | -- | +| [d010e11b73](https://github.com/angular/angular/commit/d010e11b735562ded439989ddb84cc83c6c00e81) | feat | add event listener options to renderer ([#59092](https://github.com/angular/angular/pull/59092)) | +| [57f3550219](https://github.com/angular/angular/commit/57f3550219f2a57c7c26c9183e48ee66845e0439) | feat | add utility for resolving defer block information to ng global ([#59184](https://github.com/angular/angular/pull/59184)) | +| [22f191f763](https://github.com/angular/angular/commit/22f191f76339a08bb8f0f2dfbc60dde0f2e38e73) | feat | extend the set of profiler events ([#59183](https://github.com/angular/angular/pull/59183)) | | [e894a5daea](https://github.com/angular/angular/commit/e894a5daea401b4e1173b0e66557ae40140eb9a0) | feat | set kind field on template and effect nodes ([#58865](https://github.com/angular/angular/pull/58865)) | -| [3b765367f3](https://github.com/angular/angular/commit/3b765367f31b6d1bb32406505f18151acdf1f2b2) | fix | Explicitly manage TracingSnapshot lifecycle and dispose of it once it's been used. ([#58929](https://github.com/angular/angular/pull/58929)) | +| [bd1f1294ae](https://github.com/angular/angular/commit/bd1f1294aeb0d47b24421b7b7a608988689a459f) | feat | support TypeScript 5.7 ([#58609](https://github.com/angular/angular/pull/58609)) | +| [9870b643bf](https://github.com/angular/angular/commit/9870b643bff46f089a3f0a30514fb7e062a66d56) | fix | Defer afterRender until after first CD ([#58250](https://github.com/angular/angular/pull/58250)) | +| [a5fc962094](https://github.com/angular/angular/commit/a5fc9620948c59da2146d46d27de388839b93254) | fix | Don't run effects in check no changes pass ([#58250](https://github.com/angular/angular/pull/58250)) | +### migrations +| Commit | Type | Description | +| -- | -- | -- | +| [d298d25426](https://github.com/angular/angular/commit/d298d254269ff759111fbdef7736bc8b713638bc) | feat | add schematic to clean up unused imports ([#59353](https://github.com/angular/angular/pull/59353)) | +| [14fb8ce4c0](https://github.com/angular/angular/commit/14fb8ce4c00fc458cfbe1d7f2c85638c6165b636) | fix | resolve text replacement issue ([#59452](https://github.com/angular/angular/pull/59452)) | +### platform-browser +| Commit | Type | Description | +| -- | -- | -- | +| [8c5db3cfb7](https://github.com/angular/angular/commit/8c5db3cfb75700dd64f4c8c073554c7086835950) | fix | avoid circular DI error in async renderer ([#59256](https://github.com/angular/angular/pull/59256)) | +### router +| Commit | Type | Description | +| -- | -- | -- | +| [52a6710f54](https://github.com/angular/angular/commit/52a6710f54bcec81f4cde23a78b9f78d038156c5) | fix | complete router `events` on dispose ([#59327](https://github.com/angular/angular/pull/59327)) | + + + + +# 19.0.7 (2025-01-15) +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [2b4b7c3ebf](https://github.com/angular/angular/commit/2b4b7c3ebfb2d4f4fd96fd2f1890b67c832505fd) | fix | handle more node types when extracting dependencies ([#59445](https://github.com/angular/angular/pull/59445)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [f893d07232](https://github.com/angular/angular/commit/f893d0723262d699979d55e43e4ddbcf64a3fc13) | fix | destroy renderer when replacing styles during HMR ([#59514](https://github.com/angular/angular/pull/59514)) | ### migrations | Commit | Type | Description | | -- | -- | -- | -| [e31e52e177](https://github.com/angular/angular/commit/e31e52e1771ea565a6869b4ed252d6ff7097d4ad) | fix | class content being deleted in some edge cases ([#58959](https://github.com/angular/angular/pull/58959)) | -| [508d3a1b3b](https://github.com/angular/angular/commit/508d3a1b3bc5770f18e3e46e2105bf0ba6178a87) | fix | correctly strip away parameters surrounded by comments in inject migration ([#58959](https://github.com/angular/angular/pull/58959)) | -| [7191aa6e09](https://github.com/angular/angular/commit/7191aa6e09ca3b85efd3fd14a18944eac4384763) | fix | don't migrate classes with parameters that can't be injected ([#58959](https://github.com/angular/angular/pull/58959)) | -| [a4924af6d5](https://github.com/angular/angular/commit/a4924af6d580c5bdaa185c4c97277c4effb55af9) | fix | inject migration aggressively removing imports ([#58959](https://github.com/angular/angular/pull/58959)) | -| [35165d152d](https://github.com/angular/angular/commit/35165d152d7f9c3c8789ebdf792037aafdc1cc66) | fix | inject migration dropping code if everything except super is removed ([#58959](https://github.com/angular/angular/pull/58959)) | -| [68e5ba7a3a](https://github.com/angular/angular/commit/68e5ba7a3a44c2f1647c4c6cc7ed66b010f85d15) | fix | preserve type literals and tuples in inject migrations ([#58959](https://github.com/angular/angular/pull/58959)) | +| [eb2fcd1896](https://github.com/angular/angular/commit/eb2fcd1896e0b834b86fe79e8d806bdab24aabcc) | fix | incorrect stats when migrating queries with best effort mode ([#59463](https://github.com/angular/angular/pull/59463)) | + + + + +# 19.0.6 (2025-01-08) +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [06a55e9817](https://github.com/angular/angular/commit/06a55e98173ff7bdd4e2ac1263309f9b935240f0) | fix | account for more expression types when determining HMR dependencies ([#59323](https://github.com/angular/angular/pull/59323)) | +| [17fb20f85d](https://github.com/angular/angular/commit/17fb20f85db9f3c172c194c0436644f34b7176b1) | fix | preserve defer block dependencies during HMR when class metadata is disabled ([#59313](https://github.com/angular/angular/pull/59313)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [07afce81b8](https://github.com/angular/angular/commit/07afce81b8ce28d1b308ff25017a4d4993881f36) | fix | Ensure that a destroyed `effect` never run. ([#59415](https://github.com/angular/angular/pull/59415)) | +### platform-browser +| Commit | Type | Description | +| -- | -- | -- | +| [dbb8980d03](https://github.com/angular/angular/commit/dbb8980d03485ad1cf0e19503c4e770b1ba0767e) | fix | avoid circular DI error in async renderer ([#59271](https://github.com/angular/angular/pull/59271)) | +| [6d00efde95](https://github.com/angular/angular/commit/6d00efde952971573359b32cab06d0a513600fe0) | fix | styles not replaced during HMR when using animations renderer ([#59393](https://github.com/angular/angular/pull/59393)) | +### router +| Commit | Type | Description | +| -- | -- | -- | +| [144bccb687](https://github.com/angular/angular/commit/144bccb6872ece8fa1cf4954b5839054ccf20aa1) | fix | avoid component ID collisions with user code ([#59300](https://github.com/angular/angular/pull/59300)) | + + + + +# 19.0.5 (2024-12-18) +### core +| Commit | Type | Description | +| -- | -- | -- | +| [3793218e77](https://github.com/angular/angular/commit/3793218e77d699ddfae95a53ad048d4bfb9f042c) | fix | avoid triggering `on timer` and `on idle` on the server ([#59177](https://github.com/angular/angular/pull/59177)) | +| [cfc96ed82c](https://github.com/angular/angular/commit/cfc96ed82cbe958ea7548718f76a2e7a3d6826a9) | fix | Fix nested timer serialization ([#59173](https://github.com/angular/angular/pull/59173)) | ### platform-server | Commit | Type | Description | | -- | -- | -- | -| [1cfbfc66d3](https://github.com/angular/angular/commit/1cfbfc66d3a24b6c41abf13550e7c2911e20b550) | fix | remove peer dependency on animations ([#58997](https://github.com/angular/angular/pull/58997)) | +| [9085a8fbd8](https://github.com/angular/angular/commit/9085a8fbd8cb61e3ce45adfa9ca2e96ba0be6f62) | fix | Warn user when transfer state happens more than once ([#58935](https://github.com/angular/angular/pull/58935)) | + + + + +# 19.0.4 (2024-12-12) +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [7e612171709](https://github.com/angular/angular/commit/7e6121717098462b4f53dc7212064243f2bcf024) | fix | consider pre-release versions when detecting feature support ([#59061](https://github.com/angular/angular/pull/59061)) | +| [cd764a31152](https://github.com/angular/angular/commit/cd764a31152004d37aa621efc4990c090d86f1e0) | fix | error in unused standalone imports diagnostic ([#59064](https://github.com/angular/angular/pull/59064)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [34ded10fa60](https://github.com/angular/angular/commit/34ded10fa6061a12531de8837a436cf0a1ac20b8) | fix | Fix a bug where snapshotted functions are being run twice if they return a nullish/falsey value. ([#59073](https://github.com/angular/angular/pull/59073)) | +### platform-browser +| Commit | Type | Description | +| -- | -- | -- | +| [ae0802d63c5](https://github.com/angular/angular/commit/ae0802d63c50307791e8a5d765573836dfe89075) | fix | collect external component styles from server rendering ([#59031](https://github.com/angular/angular/pull/59031)) | + + + + +# 19.0.3 (2024-12-04) @@ -161,19 +344,6 @@ - -# 19.1.0-next.0 (2024-11-26) -### common -| Commit | Type | Description | -| -- | -- | -- | -| [e4c50b3bea](https://github.com/angular/angular/commit/e4c50b3bea22ca2afba74465893c36730952f4b9) | feat | expose component instance in NgComponentOutlet ([#58698](https://github.com/angular/angular/pull/58698)) | -### core -| Commit | Type | Description | -| -- | -- | -- | -| [bd1f1294ae](https://github.com/angular/angular/commit/bd1f1294aeb0d47b24421b7b7a608988689a459f) | feat | support TypeScript 5.7 ([#58609](https://github.com/angular/angular/pull/58609)) | - - - # 19.0.1 (2024-11-26) ### compiler-cli diff --git a/README.md b/README.md index 5bbc1ee6eab6..611304a9d5cf 100644 --- a/README.md +++ b/README.md @@ -125,6 +125,7 @@ Help us keep Angular open and inclusive. Please read and follow our [Code of Con Join the conversation and help the community. - [X (formerly Twitter)][X (formerly Twitter)] +- [Bluesky][bluesky] - [Discord][discord] - [Gitter][gitter] - [YouTube][youtube] @@ -154,6 +155,7 @@ Join the conversation and help the community. [npm]: https://www.npmjs.com/get-npm [codeofconduct]: CODE_OF_CONDUCT.md [X (formerly Twitter)]: https://www.twitter.com/angular +[bluesky]: https://bsky.app/profile/angular.dev [discord]: https://discord.gg/angular [gitter]: https://gitter.im/angular/angular [stackoverflow]: https://stackoverflow.com/questions/tagged/angular diff --git a/WORKSPACE b/WORKSPACE index a5e48b4f1e27..ac73ff6796aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -50,16 +50,16 @@ load("@rules_nodejs//nodejs:repositories.bzl", "nodejs_register_toolchains") nodejs_register_toolchains( name = "nodejs", node_repositories = { - "18.20.0-darwin_arm64": ("node-v18.20.0-darwin-arm64.tar.gz", "node-v18.20.0-darwin-arm64", "10066ad4dd9e03ea5c4c45ef8775420ff37b860de09bbdf87b97e0c07b1ea036"), - "18.20.0-darwin_amd64": ("node-v18.20.0-darwin-x64.tar.gz", "node-v18.20.0-darwin-x64", "062ba71618e88e06321de5caa038843c350aababa2d315f3ca7b8551f8e66c1c"), - "18.20.0-linux_arm64": ("node-v18.20.0-linux-arm64.tar.xz", "node-v18.20.0-linux-arm64", "afe51da9ffb38ac1e3a20d9a06efd403ced4bf8831ab554a02a088dd8392fd79"), - "18.20.0-linux_ppc64le": ("node-v18.20.0-linux-ppc64le.tar.xz", "node-v18.20.0-linux-ppc64le", "9e652bbf53a3e37285b11dfb9d6a9bb8b02010c3b50e5c8229d4cc10e72681da"), - "18.20.0-linux_s390x": ("node-v18.20.0-linux-s390x.tar.xz", "node-v18.20.0-linux-s390x", "a6c2a5796b9d9e9bf21da62ec89ff30b41a8108880b9eaa3c912f1ce795a7743"), - "18.20.0-linux_amd64": ("node-v18.20.0-linux-x64.tar.xz", "node-v18.20.0-linux-x64", "03eea148e56785babb27930b05ed6bf311aaa3bc573c0399dd63cad2fe5713c7"), - "18.20.0-windows_amd64": ("node-v18.20.0-win-x64.zip", "node-v18.20.0-win-x64", "1c0aab05cc6836a8f5148cca345b92ebc948a4a2013f18d117b7ade6ff05aca6"), + "18.20.5-darwin_arm64": ("node-v18.20.5-darwin-arm64.tar.gz", "node-v18.20.5-darwin-arm64", "bdfeaf59dbf29aec08c0c66130edf0a8a17014b4f2997727641dfd0b58b51f48"), + "18.20.5-darwin_amd64": ("node-v18.20.5-darwin-x64.tar.gz", "node-v18.20.5-darwin-x64", "dff01068da7d3fe7b515f72a3903dca96a34dc377f6f426b6a813901274b6441"), + "18.20.5-linux_arm64": ("node-v18.20.5-linux-arm64.tar.xz", "node-v18.20.5-linux-arm64", "a77db6ab34267f3bc80e02ed68abf51b7065eb5c82fcd69adc4b40e390d9b116"), + "18.20.5-linux_ppc64le": ("node-v18.20.5-linux-ppc64le.tar.xz", "node-v18.20.5-linux-ppc64le", "63b4c6801c96fb452e3bd8125e8b5b195ecacc4fa2505e47a128e94587999aeb"), + "18.20.5-linux_s390x": ("node-v18.20.5-linux-s390x.tar.xz", "node-v18.20.5-linux-s390x", "617d7456e16534a4b4e03f5285cc8d13581f39cdad9196efff2516d6588de319"), + "18.20.5-linux_amd64": ("node-v18.20.5-linux-x64.tar.xz", "node-v18.20.5-linux-x64", "e4a3a21e5ac7e074ed50d2533dd0087d8460647ab567464867141a2b643f3fb3"), + "18.20.5-windows_amd64": ("node-v18.20.5-win-x64.zip", "node-v18.20.5-win-x64", "910237449895b4de61026568dc076fa6c3ffcd667563ed03112a4a77e1f1556b"), }, - # We need at least Node 18.17 due to some transitive dependencies. - node_version = "18.20.0", + # We need at least Node 18.20.5 due to some transitive dependencies. + node_version = "18.20.5", ) # Download npm dependencies. @@ -143,10 +143,10 @@ cldr_xml_data_repository( # sass rules http_archive( name = "io_bazel_rules_sass", - sha256 = "0eae9a0c840e1e0d0b9ace056f8bde06384315315c4e2ebdb5cec722d1d4134b", - strip_prefix = "rules_sass-aff53ca13ff2af82d323adb02a83c45a301e9ae8", + sha256 = "e8b863f6be5609c6ed15664d12512ee36d93e8bcb2c1a331f85d9e8758a82ee7", + strip_prefix = "rules_sass-3b3667fd5861b06a03bea1f1946b55ac7100d4ea", urls = [ - "https://github.com/bazelbuild/rules_sass/archive/aff53ca13ff2af82d323adb02a83c45a301e9ae8.zip", + "https://github.com/bazelbuild/rules_sass/archive/3b3667fd5861b06a03bea1f1946b55ac7100d4ea.zip", ], ) diff --git a/adev/BUILD.bazel b/adev/BUILD.bazel index a46bec275fd9..fb51d936498a 100644 --- a/adev/BUILD.bazel +++ b/adev/BUILD.bazel @@ -1,9 +1,9 @@ -load("@npm//@angular/build-tooling/bazel/remote-execution:index.bzl", "ENABLE_NETWORK") -load("@npm//@angular/build-tooling/bazel/http-server:index.bzl", "http_server") +load("@bazel_skylib//lib:collections.bzl", "collections") load("@bazel_skylib//rules:common_settings.bzl", "bool_flag") load("@build_bazel_rules_nodejs//:index.bzl", "copy_to_bin") +load("@npm//@angular/build-tooling/bazel/http-server:index.bzl", "http_server") +load("@npm//@angular/build-tooling/bazel/remote-execution:index.bzl", "ENABLE_NETWORK") load("@npm//@angular-devkit/architect-cli:index.bzl", "architect", "architect_test") -load("@bazel_skylib//lib:collections.bzl", "collections") load("//adev/tools/local_deps:index.bzl", "ensure_local_package_deps", "link_local_packages") package(default_visibility = ["//visibility:public"]) @@ -35,7 +35,6 @@ TEST_FILES = APPLICATION_FILES + [ APPLICATION_ASSETS = [ "//adev/src/assets/images", - "//adev/src/assets/textures", "//adev/src/assets/previews", "//adev/src/assets:tutorials", "//adev/src/assets/icons", @@ -59,10 +58,8 @@ APPLICATION_DEPS = [ "@npm//@angular/platform-server", "@npm//@angular/router", "@npm//@angular/ssr", - "@npm//gsap", "@npm//marked", "@npm//ngx-progressbar", - "@npm//ogl", "@npm//rxjs", "@npm//typescript", "@npm//@typescript/vfs", diff --git a/adev/README.md b/adev/README.md index 08ab121e9fee..6335c24805c3 100644 --- a/adev/README.md +++ b/adev/README.md @@ -6,7 +6,7 @@ The content is written primarily in Markdown format located in `src/content`. Fo ## Local Development -For local development, [yarn](https://yarnpkg.com/) is the preferred package manager. You can setup a local environment with the following commands +For local development, [yarn](https://yarnpkg.com/) is the preferred package manager. You can set up a local environment with the following commands : ```bash diff --git a/adev/shared-docs/components/navigation-list/navigation-list.component.scss b/adev/shared-docs/components/navigation-list/navigation-list.component.scss index 3a4c3097a304..9fb22c1290bb 100644 --- a/adev/shared-docs/components/navigation-list/navigation-list.component.scss +++ b/adev/shared-docs/components/navigation-list/navigation-list.component.scss @@ -24,13 +24,13 @@ } &::-webkit-scrollbar-thumb { + border-radius: 10px; + transition: background-color 0.3s ease; background-color: var(--septenary-contrast); + @include mq.for-tablet-landscape-down { background-color: var(--quinary-contrast); } - - border-radius: 10px; - transition: background-color 0.3s ease; } &::-webkit-scrollbar-thumb:hover { diff --git a/adev/shared-docs/components/search-dialog/search-dialog.component.scss b/adev/shared-docs/components/search-dialog/search-dialog.component.scss index a2ef86d3d032..995d880ad1dd 100644 --- a/adev/shared-docs/components/search-dialog/search-dialog.component.scss +++ b/adev/shared-docs/components/search-dialog/search-dialog.component.scss @@ -2,6 +2,8 @@ dialog { background-color: transparent; border: none; padding-block-end: 3rem; + margin: 0 auto; + top: 15vh; &::backdrop { backdrop-filter: blur(5px); diff --git a/adev/shared-docs/components/table-of-contents/table-of-contents.component.html b/adev/shared-docs/components/table-of-contents/table-of-contents.component.html index f5b514649f14..e791dd207dd0 100644 --- a/adev/shared-docs/components/table-of-contents/table-of-contents.component.html +++ b/adev/shared-docs/components/table-of-contents/table-of-contents.component.html @@ -6,26 +6,26 @@

On this page

@if (shouldDisplayScrollToTop()) { - + } diff --git a/adev/shared-docs/components/table-of-contents/table-of-contents.component.ts b/adev/shared-docs/components/table-of-contents/table-of-contents.component.ts index f18ff9fdf39d..1cb0f0bcb25c 100644 --- a/adev/shared-docs/components/table-of-contents/table-of-contents.component.ts +++ b/adev/shared-docs/components/table-of-contents/table-of-contents.component.ts @@ -14,7 +14,7 @@ import { computed, inject, } from '@angular/core'; -import {RouterLink} from '@angular/router'; +import {Location} from '@angular/common'; import {TableOfContentsLevel} from '../../interfaces/index'; import {TableOfContentsLoader} from '../../services/table-of-contents-loader.service'; import {TableOfContentsScrollSpy} from '../../services/table-of-contents-scroll-spy.service'; @@ -25,11 +25,12 @@ import {IconComponent} from '../icon/icon.component'; changeDetection: ChangeDetectionStrategy.OnPush, templateUrl: './table-of-contents.component.html', styleUrls: ['./table-of-contents.component.scss'], - imports: [RouterLink, IconComponent], + imports: [IconComponent], }) export class TableOfContents { // Element that contains the content from which the Table of Contents is built readonly contentSourceElement = input.required(); + readonly location = inject(Location); private readonly scrollSpy = inject(TableOfContentsScrollSpy); private readonly tableOfContentsLoader = inject(TableOfContentsLoader); diff --git a/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.spec.ts b/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.spec.ts index 737f3538bf74..bc9dfa4bb52b 100644 --- a/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.spec.ts +++ b/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.spec.ts @@ -112,6 +112,13 @@ describe('DocViewer', () => { expect(exampleViewer).not.toBeNull(); expect(exampleViewer.componentInstance.view()).toBe(CodeExampleViewMode.SNIPPET); + + const checkIcon = fixture.debugElement.query(By.directive(IconComponent)); + expect((checkIcon.nativeElement as HTMLElement).classList).toContain( + `material-symbols-outlined`, + ); + expect((checkIcon.nativeElement as HTMLElement).classList).toContain(`docs-check`); + expect(checkIcon.nativeElement.innerHTML).toBe('check'); }); it('should display example viewer in multi file mode when user clicks expand', async () => { diff --git a/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.ts b/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.ts index 3a33715c2a23..098bad864596 100644 --- a/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.ts +++ b/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.ts @@ -265,9 +265,12 @@ export class DocViewer implements OnChanges { } private loadIcons(element: HTMLElement): void { - element.querySelectorAll('docs-icon').forEach((iconsPlaceholder) => { - this.renderComponent(IconComponent, iconsPlaceholder as HTMLElement); - }); + // We need to make sure that we don't reload the icons in loadCopySourceCodeButtons + element + .querySelectorAll('docs-icon:not([docs-copy-source-code] docs-icon)') + .forEach((iconsPlaceholder) => { + this.renderComponent(IconComponent, iconsPlaceholder as HTMLElement); + }); } /** @@ -290,9 +293,6 @@ export class DocViewer implements OnChanges { } } - // Trigger change detection after setting inputs. - componentRef.changeDetectorRef.detectChanges(); - // Attach a view to the ApplicationRef for change detection // purposes and for hydration serialization to pick it up // during SSG. @@ -340,7 +340,12 @@ export class DocViewer implements OnChanges { relativeUrl = hrefAttr; } - handleHrefClickEventWithRouter(e, this.router, relativeUrl); + // Unless this is a link to an element within the same page, use the Angular router. + // https://github.com/angular/angular/issues/30139 + const scrollToElementExists = relativeUrl.startsWith(this.location.path() + '#'); + if (!scrollToElementExists) { + handleHrefClickEventWithRouter(e, this.router, relativeUrl); + } }); }); } diff --git a/adev/shared-docs/components/viewers/example-viewer/example-viewer.component.ts b/adev/shared-docs/components/viewers/example-viewer/example-viewer.component.ts index d4a369efd014..234384c84f6c 100644 --- a/adev/shared-docs/components/viewers/example-viewer/example-viewer.component.ts +++ b/adev/shared-docs/components/viewers/example-viewer/example-viewer.component.ts @@ -103,8 +103,6 @@ export class ExampleViewer { this.snippetCode.set(this.exampleMetadata()?.files[0]); - this.changeDetector.detectChanges(); - this.setCodeLinesVisibility(); this.elementRef.nativeElement.setAttribute( diff --git a/adev/shared-docs/index.bzl b/adev/shared-docs/index.bzl index d5f9adecde90..f910c2911a11 100644 --- a/adev/shared-docs/index.bzl +++ b/adev/shared-docs/index.bzl @@ -1,9 +1,11 @@ load("//adev/shared-docs/pipeline:_guides.bzl", _generate_guides = "generate_guides") -load("//adev/shared-docs/pipeline:_stackblitz.bzl", _generate_stackblitz = "generate_stackblitz") +load("//adev/shared-docs/pipeline:_navigation.bzl", _generate_nav_items = "generate_nav_items") load("//adev/shared-docs/pipeline:_playground.bzl", _generate_playground = "generate_playground") +load("//adev/shared-docs/pipeline:_stackblitz.bzl", _generate_stackblitz = "generate_stackblitz") load("//adev/shared-docs/pipeline:_tutorial.bzl", _generate_tutorial = "generate_tutorial") generate_guides = _generate_guides generate_stackblitz = _generate_stackblitz generate_playground = _generate_playground generate_tutorial = _generate_tutorial +generate_nav_items = _generate_nav_items diff --git a/adev/shared-docs/package.json b/adev/shared-docs/package.json index 01306e483a2e..1b944af3faaa 100644 --- a/adev/shared-docs/package.json +++ b/adev/shared-docs/package.json @@ -2,14 +2,14 @@ "name": "@angular/docs", "version": "0.0.0-PLACEHOLDER", "peerDependencies": { - "@angular/cdk": "^19.1.0-next", - "@angular/common": "^19.1.0-next", - "@angular/core": "^19.1.0-next", - "@angular/forms": "^19.1.0-next", - "@angular/material": "^19.1.0-next", - "@angular/platform-browser": "^19.1.0-next", - "@angular/router": "^19.1.0-next", - "@angular/ssr": "^19.1.0-next", + "@angular/cdk": "^19.2.0-next", + "@angular/common": "^19.2.0-next", + "@angular/core": "^19.2.0-next", + "@angular/forms": "^19.2.0-next", + "@angular/material": "^19.2.0-next", + "@angular/platform-browser": "^19.2.0-next", + "@angular/router": "^19.2.0-next", + "@angular/ssr": "^19.2.0-next", "algoliasearch": "^5.0.0", "rxjs": "^7.8.1" }, @@ -20,10 +20,10 @@ "fast-glob": "~3.3.2", "fflate": "^0.8.2", "html-entities": "~2.5.2", - "jsdom": "~25.0.0", + "jsdom": "~26.0.0", "marked": "~15.0.0", "mermaid": "^11.0.0", - "shiki": "^1.10.3" + "shiki": "^3.0.0" }, "exports": { "./styles/*": { diff --git a/adev/shared-docs/pipeline/BUILD.bazel b/adev/shared-docs/pipeline/BUILD.bazel index 92accc4468f6..2473df567718 100644 --- a/adev/shared-docs/pipeline/BUILD.bazel +++ b/adev/shared-docs/pipeline/BUILD.bazel @@ -97,11 +97,24 @@ esbuild_esm_bundle( ], ) +esbuild_esm_bundle( + name = "navigation-bundle", + entry_point = "//adev/shared-docs/pipeline/navigation:index.ts", + output = "navigation.mjs", + platform = "node", + target = "es2022", + visibility = ["//visibility:public"], + deps = [ + "//adev/shared-docs/pipeline/navigation", + ], +) + exports_files([ "_guides.bzl", "_stackblitz.bzl", "_playground.bzl", "_tutorial.bzl", + "_navigation.bzl", "BUILD.bazel", ]) @@ -160,3 +173,9 @@ nodejs_binary( entry_point = "//adev/shared-docs/pipeline:tutorial.mjs", visibility = ["//visibility:public"], ) + +nodejs_binary( + name = "navigation", + entry_point = "//adev/shared-docs/pipeline:navigation.mjs", + visibility = ["//visibility:public"], +) diff --git a/adev/shared-docs/pipeline/_navigation.bzl b/adev/shared-docs/pipeline/_navigation.bzl new file mode 100644 index 000000000000..d61f0ce2c12a --- /dev/null +++ b/adev/shared-docs/pipeline/_navigation.bzl @@ -0,0 +1,61 @@ +load("@build_bazel_rules_nodejs//:providers.bzl", "run_node") + +def _generate_nav_items(ctx): + """Implementation of the navigation items data generator rule""" + + # Set the arguments for the actions inputs and output location. + args = ctx.actions.args() + + # Use a param file because we may have a large number of inputs. + args.set_param_file_format("multiline") + args.use_param_file("%s", use_always = True) + + # Pass the set of source files. + args.add_joined(ctx.files.srcs, join_with = ",") + + # Add BUILD file path to the arguments. + args.add(ctx.label.package) + + # Add the nav item generation strategy to thte arguments. + args.add(ctx.attr.strategy) + + # File declaration of the generated JSON file. + json_output = ctx.actions.declare_file("routes.json") + + # Add the path to the output file to the arguments. + args.add(json_output.path) + + run_node( + ctx = ctx, + inputs = depset(ctx.files.srcs), + executable = "_generate_nav_items", + outputs = [json_output], + arguments = [args], + ) + + # The return value describes what the rule is producing. In this case we need to specify + # the "DefaultInfo" with the output json file. + return [DefaultInfo(files = depset([json_output]))] + +generate_nav_items = rule( + # Point to the starlark function that will execute for this rule. + implementation = _generate_nav_items, + doc = """Rule that generates navigation items data.""", + + # The attributes that can be set to this rule. + attrs = { + "srcs": attr.label_list( + doc = """Markdown files that represent the page contents.""", + allow_empty = False, + allow_files = True, + ), + "strategy": attr.string( + doc = """Represents the navigation items generation strategy.""", + ), + "_generate_nav_items": attr.label( + default = Label("//adev/shared-docs/pipeline:navigation"), + executable = True, + cfg = "exec", + ), + }, +) diff --git a/adev/shared-docs/pipeline/api-gen/extraction/interpolate_code_examples.ts b/adev/shared-docs/pipeline/api-gen/extraction/interpolate_code_examples.ts index 91e9ac1df596..094902c1b005 100644 --- a/adev/shared-docs/pipeline/api-gen/extraction/interpolate_code_examples.ts +++ b/adev/shared-docs/pipeline/api-gen/extraction/interpolate_code_examples.ts @@ -43,6 +43,7 @@ const MD_CTYPE_MAP: {[key in FileType]: string} = { export function interpolateCodeExamples(entries: DocEntry[]): void { for (const entry of entries) { entry.rawComment = replaceExample(entry.rawComment); + entry.description = replaceExample(entry.description); for (const jsdocTag of entry.jsdocTags) { jsdocTag.comment = replaceExample(jsdocTag.comment); diff --git a/adev/shared-docs/pipeline/api-gen/extraction/test/interpolate_code_examples.spec.ts b/adev/shared-docs/pipeline/api-gen/extraction/test/interpolate_code_examples.spec.ts index 3cd40b38abc9..c0aa3780f16b 100644 --- a/adev/shared-docs/pipeline/api-gen/extraction/test/interpolate_code_examples.spec.ts +++ b/adev/shared-docs/pipeline/api-gen/extraction/test/interpolate_code_examples.spec.ts @@ -15,7 +15,7 @@ const tsMdBlock = (code: string) => '```angular-ts\n' + code + '\n```'; const htmlMdBlock = (code: string) => '```angular-html\n' + code + '\n```'; const entriesBuilder = (comment: string): DocEntry[] => [ - {jsdocTags: [], rawComment: comment} as unknown as DocEntry, + {jsdocTags: [], rawComment: comment, description: ''} as unknown as DocEntry, ]; const getComment = (entries: DocEntry[]) => entries[0].rawComment; @@ -35,6 +35,7 @@ describe('interpolate_code_examples', () => { }, ], rawComment: `{@example dummy/jsdocs_raw.ts region='function'}`, + description: `{@example dummy/jsdocs_raw.ts region='function'}`, }, ]; diff --git a/adev/shared-docs/pipeline/api-gen/rendering/styling/css-classes.ts b/adev/shared-docs/pipeline/api-gen/rendering/styling/css-classes.ts index 09a63768f6cb..5bb2a5942ddf 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/styling/css-classes.ts +++ b/adev/shared-docs/pipeline/api-gen/rendering/styling/css-classes.ts @@ -8,13 +8,13 @@ // TODO(jelbourn): all of these CSS classes should use the `docs-` prefix. +export const API_REFERENCE_CONTAINER = 'docs-api'; + export const PARAM_KEYWORD_CLASS_NAME = 'docs-param-keyword'; export const PARAM_GROUP_CLASS_NAME = 'docs-param-group'; -export const REFERENCE_HEADER = 'docs-reference-header'; export const REFERENCE_MEMBERS = 'docs-reference-members'; export const REFERENCE_DEPRECATED = 'docs-reference-deprecated'; -export const REFERENCE_MEMBERS_CONTAINER = 'docs-reference-members-container'; export const REFERENCE_MEMBER_CARD = 'docs-reference-member-card'; export const REFERENCE_MEMBER_CARD_HEADER = 'docs-reference-card-header'; export const REFERENCE_MEMBER_CARD_BODY = 'docs-reference-card-body'; @@ -24,3 +24,6 @@ export const HEADER_CLASS_NAME = 'docs-reference-header'; export const HEADER_ENTRY_CATEGORY = 'docs-reference-category'; export const HEADER_ENTRY_TITLE = 'docs-reference-title'; export const HEADER_ENTRY_LABEL = 'docs-api-item-label'; + +export const SECTION_CONTAINER = 'docs-reference-section'; +export const SECTION_HEADING = 'docs-reference-section-heading'; diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/class-member.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/class-member.tsx index 48d971379265..8d34f3b330af 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/class-member.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/class-member.tsx @@ -13,7 +13,7 @@ import { isPropertyEntry, isSetterEntry, } from '../entities/categorization'; -import {MemberEntryRenderable} from '../entities/renderables'; +import {MemberEntryRenderable, MethodEntryRenderable} from '../entities/renderables'; import { REFERENCE_MEMBER_CARD, REFERENCE_MEMBER_CARD_BODY, @@ -27,20 +27,24 @@ import {getFunctionMetadataRenderable} from '../transforms/function-transforms'; import {CodeSymbol} from './code-symbols'; export function ClassMember(props: {member: MemberEntryRenderable}) { + const member = props.member; + + const renderMethod = (method: MethodEntryRenderable) => { + const signature = method.signatures.length ? method.signatures : [method.implementation]; + return signature.map((sig) => { + const renderableMember = getFunctionMetadataRenderable(sig); + return ; + }); + }; + const body = (
- {isClassMethodEntry(props.member) ? ( - (props.member.signatures.length - ? props.member.signatures - : [props.member.implementation] - ).map((sig) => { - const renderableMember = getFunctionMetadataRenderable(sig); - return ; - }) - ) : props.member.htmlDescription || props.member.deprecationMessage ? ( + {isClassMethodEntry(member) ? ( + renderMethod(member) + ) : member.htmlDescription || member.deprecationMessage ? (
- - + +
) : ( <> @@ -48,23 +52,19 @@ export function ClassMember(props: {member: MemberEntryRenderable}) {
); - const memberName = props.member.name; - const returnType = getMemberType(props.member); + const memberName = member.name; + const returnType = getMemberType(member); return ( -
-
-
-

{memberName}

-
- {isClassMethodEntry(props.member) && props.member.signatures.length > 1 ? ( - {props.member.signatures.length} overloads - ) : returnType ? ( - - ) : ( - <> - )} -
-
+
+
+

{memberName}

+ {isClassMethodEntry(member) && member.signatures.length > 1 ? ( + {member.signatures.length} overloads + ) : returnType ? ( + + ) : ( + <> + )}
{body}
diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/class-reference.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/class-reference.tsx index 3723c0fdae08..185348a753e7 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/class-reference.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/class-reference.tsx @@ -10,26 +10,26 @@ import {Fragment, h} from 'preact'; import {ClassEntryRenderable, DecoratorEntryRenderable} from '../entities/renderables'; import {ClassMemberList} from './class-member-list'; import {HeaderApi} from './header-api'; -import {REFERENCE_MEMBERS_CONTAINER} from '../styling/css-classes'; -import {TabDescription} from './tab-description'; -import {TabUsageNotes} from './tab-usage-notes'; -import {TabApi} from './tab-api'; +import {API_REFERENCE_CONTAINER, REFERENCE_MEMBERS} from '../styling/css-classes'; +import {SectionDescription} from './section-description'; +import {SectionUsageNotes} from './section-usage-notes'; +import {SectionApi} from './section-api'; /** Component to render a class API reference document. */ export function ClassReference(entry: ClassEntryRenderable | DecoratorEntryRenderable) { return ( -
+
- - - + {entry.members.length > 0 ? ( -
+
) : ( <> )} + +
); } diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-card.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-card.tsx index 3212bed0a305..d4cfb69392aa 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-card.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-card.tsx @@ -9,17 +9,12 @@ import {Fragment, h} from 'preact'; import {CliCardRenderable} from '../entities/renderables'; import {DeprecatedLabel} from './deprecated-label'; -import { REFERENCE_MEMBER_CARD, REFERENCE_MEMBER_CARD_HEADER } from '../styling/css-classes'; +import {REFERENCE_MEMBER_CARD, REFERENCE_MEMBER_CARD_BODY} from '../styling/css-classes'; export function CliCard(props: {card: CliCardRenderable}) { return ( -
-
-
-

{props.card.type}

-
-
-
+
+
{props.card.items.map((item) => (
{item.deprecated ? : <>} diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-reference.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-reference.tsx index 8d6425ef235a..30e7d1c2654e 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-reference.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-reference.tsx @@ -6,55 +6,74 @@ * found in the LICENSE file at https://angular.dev/license */ -import { Fragment, h } from 'preact'; -import { CliCommandRenderable } from '../entities/renderables'; -import { REFERENCE_MEMBERS, REFERENCE_MEMBERS_CONTAINER } from '../styling/css-classes'; -import { CliCard } from './cli-card'; -import { HeaderCli } from './header-cli'; -import { RawHtml } from './raw-html'; +import {Fragment, h} from 'preact'; +import {CliCommandRenderable} from '../entities/renderables'; +import {REFERENCE_MEMBERS} from '../styling/css-classes'; +import {CliCard} from './cli-card'; +import {HeaderCli} from './header-cli'; +import {RawHtml} from './raw-html'; +import {SectionHeading} from './section-heading'; /** Component to render a CLI command reference document. */ export function CliCommandReference(entry: CliCommandRenderable) { return ( -
+
- {[entry.name, ...entry.aliases].map((command) => + {[entry.name, ...entry.aliases].map((command) => (
               
                 
ng {commandName(entry, command)} - {entry.argumentsLabel ? : <>} - {entry.hasOptions ? : <>} + {entry.argumentsLabel ? ( + + ) : ( + <> + )} + {entry.hasOptions ? ( + + ) : ( + <> + )}
+ ))} + + {entry.subcommands && entry.subcommands?.length > 0 ? ( + <> +

Sub-commands

+

This command has the following sub-commands

+ + + ) : ( + <> )} - - {entry.subcommands && entry.subcommands?.length > 0 ? <> -

Sub-commands

-

This command has the following sub-commands

- - : <>}
-
-
- {entry.cards.map((card) => )} -
+
+ {entry.cards.map((card) => ( + <> + + + + ))}
); } - function commandName(entry: CliCommandRenderable, command: string) { if (entry.parentCommand?.name) { return `${entry.parentCommand?.name} ${command}`; diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/constant-reference.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/constant-reference.tsx index b18e9ec29635..3819c4562b9d 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/constant-reference.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/constant-reference.tsx @@ -9,18 +9,19 @@ import {h} from 'preact'; import {ConstantEntryRenderable} from '../entities/renderables'; import {HeaderApi} from './header-api'; -import {TabDescription} from './tab-description'; -import {TabUsageNotes} from './tab-usage-notes'; -import {TabApi} from './tab-api'; +import {SectionDescription} from './section-description'; +import {SectionUsageNotes} from './section-usage-notes'; +import {SectionApi} from './section-api'; +import {API_REFERENCE_CONTAINER} from '../styling/css-classes'; /** Component to render a constant API reference document. */ export function ConstantReference(entry: ConstantEntryRenderable) { return ( -
+
- - - + + +
); } diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/docs-reference.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/docs-reference.tsx index 96173978c94d..f226ad1a7aef 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/docs-reference.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/docs-reference.tsx @@ -9,14 +9,15 @@ import {h} from 'preact'; import {DocEntryRenderable} from '../entities/renderables'; import {HeaderApi} from './header-api'; -import {TabDescription} from './tab-description'; +import {SectionDescription} from './section-description'; +import {API_REFERENCE_CONTAINER} from '../styling/css-classes'; /** Component to render a block or element API reference document. */ export function DocsReference(entry: DocEntryRenderable) { return ( -
+
- +
); } diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/enum-reference.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/enum-reference.tsx index 7772ada9fbeb..6aa74e642d13 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/enum-reference.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/enum-reference.tsx @@ -9,29 +9,27 @@ import {h, Fragment} from 'preact'; import {EnumEntryRenderable, MemberEntryRenderable} from '../entities/renderables'; import {HeaderApi} from './header-api'; -import {TabDescription} from './tab-description'; -import {TabApi} from './tab-api'; -import {REFERENCE_MEMBERS, REFERENCE_MEMBERS_CONTAINER} from '../styling/css-classes'; +import {SectionDescription} from './section-description'; +import {SectionApi} from './section-api'; +import {API_REFERENCE_CONTAINER, REFERENCE_MEMBERS} from '../styling/css-classes'; import {ClassMember} from './class-member'; /** Component to render a enum API reference document. */ export function EnumReference(entry: EnumEntryRenderable) { return ( -
+
- - - { - entry.members.length > 0 - ? ( -
-
- {entry.members.map((member: MemberEntryRenderable) => ())} -
-
- ) - : (<>) - } + + {entry.members.length > 0 ? ( +
+ {entry.members.map((member: MemberEntryRenderable) => ( + + ))} +
+ ) : ( + <> + )} +
); } diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/function-reference.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/function-reference.tsx index 9c22f7a6b976..219d526ca41e 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/function-reference.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/function-reference.tsx @@ -6,20 +6,23 @@ * found in the LICENSE file at https://angular.dev/license */ -import {h} from 'preact'; -import {FunctionEntryRenderable, FunctionSignatureMetadataRenderable} from '../entities/renderables'; +import {h, Fragment} from 'preact'; import { + FunctionEntryRenderable, + FunctionSignatureMetadataRenderable, +} from '../entities/renderables'; +import { + API_REFERENCE_CONTAINER, REFERENCE_MEMBERS, - REFERENCE_MEMBERS_CONTAINER, REFERENCE_MEMBER_CARD, REFERENCE_MEMBER_CARD_BODY, REFERENCE_MEMBER_CARD_HEADER, } from '../styling/css-classes'; import {ClassMethodInfo} from './class-method-info'; import {HeaderApi} from './header-api'; -import {TabApi} from './tab-api'; -import {TabDescription} from './tab-description'; -import {TabUsageNotes} from './tab-usage-notes'; +import {SectionApi} from './section-api'; +import {SectionDescription} from './section-description'; +import {SectionUsageNotes} from './section-usage-notes'; import {HighlightTypeScript} from './highlight-ts'; import {printInitializerFunctionSignatureLine} from '../transforms/code-transforms'; import {getFunctionMetadataRenderable} from '../transforms/function-transforms'; @@ -32,8 +35,8 @@ export const signatureCard = ( printSignaturesAsHeader: boolean, ) => { return ( -
-
+
+
{printSignaturesAsHeader ? ( ) : ( -
+ <>

{name}

-
+ )}
@@ -67,25 +70,24 @@ export function FunctionReference(entry: FunctionEntryRenderable) { const printSignaturesAsHeader = entry.signatures.length > 1; return ( -
+
- - - -
-
- {entry.signatures.map((s, i) => - signatureCard( - s.name, - getFunctionMetadataRenderable(s, entry.moduleName), - { - id: `${s.name}_${i}`, - }, - printSignaturesAsHeader, - ), - )} -
+ +
+ {entry.signatures.map((s, i) => + signatureCard( + s.name, + getFunctionMetadataRenderable(s, entry.moduleName), + { + id: `${s.name}_${i}`, + }, + printSignaturesAsHeader, + ), + )}
+ + +
); } diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/initializer-api-function.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/initializer-api-function.tsx index 5657933283c4..bf4ac4e53208 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/initializer-api-function.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/initializer-api-function.tsx @@ -9,9 +9,9 @@ import {h, JSX} from 'preact'; import {InitializerApiFunctionRenderable} from '../entities/renderables'; import {HeaderApi} from './header-api'; -import {TabApi} from './tab-api'; -import {TabUsageNotes} from './tab-usage-notes'; -import {REFERENCE_MEMBERS, REFERENCE_MEMBERS_CONTAINER} from '../styling/css-classes'; +import {SectionApi} from './section-api'; +import {SectionUsageNotes} from './section-usage-notes'; +import {API_REFERENCE_CONTAINER, REFERENCE_MEMBERS} from '../styling/css-classes'; import {getFunctionMetadataRenderable} from '../transforms/function-transforms'; import {signatureCard} from './function-reference'; @@ -34,42 +34,41 @@ export function InitializerApiFunction(entry: InitializerApiFunctionRenderable) } return ( -
+
- - + -
-
- {entry.callFunction.signatures.map((s, i) => - signatureCard( - s.name, - getFunctionMetadataRenderable(s, entry.moduleName), - { - id: `${s.name}_${i}`, - }, - printSignaturesAsHeader, - ), - )} +
+ {entry.callFunction.signatures.map((s, i) => + signatureCard( + s.name, + getFunctionMetadataRenderable(s, entry.moduleName), + { + id: `${s.name}_${i}`, + }, + printSignaturesAsHeader, + ), + )} - {entry.subFunctions.reduce( - (elements, subFunction) => [ - ...elements, - ...subFunction.signatures.map((s, i) => - signatureCard( - `${entry.name}.${s.name}`, - getFunctionMetadataRenderable(s, entry.moduleName), - { - id: `${entry.name}_${s.name}_${i}`, - }, - printSignaturesAsHeader, - ), + {entry.subFunctions.reduce( + (elements, subFunction) => [ + ...elements, + ...subFunction.signatures.map((s, i) => + signatureCard( + `${entry.name}.${s.name}`, + getFunctionMetadataRenderable(s, entry.moduleName), + { + id: `${entry.name}_${s.name}_${i}`, + }, + printSignaturesAsHeader, ), - ], - [] as JSX.Element[], - )} -
+ ), + ], + [] as JSX.Element[], + )}
+ +
); } diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/section-api.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-api.tsx new file mode 100644 index 000000000000..3aebe12eb8c4 --- /dev/null +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-api.tsx @@ -0,0 +1,26 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {h} from 'preact'; +import {DocEntryRenderable} from '../entities/renderables'; +import {HasRenderableToc} from '../entities/traits'; +import {CodeTableOfContents} from './code-table-of-contents'; +import {SECTION_CONTAINER} from '../styling/css-classes'; +import {SectionHeading} from './section-heading'; + +const API_SECTION_NAME = 'API'; + +/** Component to render the API section. */ +export function SectionApi(props: {entry: DocEntryRenderable & HasRenderableToc}) { + return ( +
+ + +
+ ); +} diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/tab-description.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-description.tsx similarity index 73% rename from adev/shared-docs/pipeline/api-gen/rendering/templates/tab-description.tsx rename to adev/shared-docs/pipeline/api-gen/rendering/templates/section-description.tsx index 4637a6b62fa0..d2d741896ed5 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/tab-description.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-description.tsx @@ -8,14 +8,15 @@ import {Fragment, h} from 'preact'; import {DocEntryRenderable} from '../entities/renderables'; -import {normalizeTabUrl} from '../transforms/url-transforms'; import {RawHtml} from './raw-html'; import {CodeSymbol} from './code-symbols'; +import {SECTION_CONTAINER} from '../styling/css-classes'; +import {SectionHeading} from './section-heading'; -const DESCRIPTION_TAB_NAME = 'Description'; +const DESCRIPTION_SECTION_NAME = 'Description'; -/** Component to render the description tab. */ -export function TabDescription(props: {entry: DocEntryRenderable}) { +/** Component to render the description section. */ +export function SectionDescription(props: {entry: DocEntryRenderable}) { const exportedBy = props.entry.jsdocTags.filter((t) => t.name === 'ngModule'); if ( (!props.entry.htmlDescription || @@ -26,7 +27,8 @@ export function TabDescription(props: {entry: DocEntryRenderable}) { } return ( -
+
+ {exportedBy.length ? ( diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/section-heading.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-heading.tsx new file mode 100644 index 000000000000..2984b2a5eb4a --- /dev/null +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-heading.tsx @@ -0,0 +1,25 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {h} from 'preact'; +import {convertSectionNameToId} from '../transforms/reference-section-id'; +import {SECTION_HEADING} from '../styling/css-classes'; + +/** Component to render the API section. */ +export function SectionHeading(props: {name: string}) { + const id = convertSectionNameToId(props.name); + const label = 'Link to ' + props.name + ' section'; + + return ( +

+ + {props.name} + +

+ ); +} diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/tab-usage-notes.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-usage-notes.tsx similarity index 53% rename from adev/shared-docs/pipeline/api-gen/rendering/templates/tab-usage-notes.tsx rename to adev/shared-docs/pipeline/api-gen/rendering/templates/section-usage-notes.tsx index 56e20007a5f2..b38470ea77a9 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/tab-usage-notes.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-usage-notes.tsx @@ -8,19 +8,21 @@ import {Fragment, h} from 'preact'; import {DocEntryRenderable} from '../entities/renderables'; -import {normalizeTabUrl} from '../transforms/url-transforms'; import {RawHtml} from './raw-html'; +import {SECTION_CONTAINER} from '../styling/css-classes'; +import {SectionHeading} from './section-heading'; -const USAGE_NOTES_TAB_NAME = 'Usage Notes'; +const USAGE_NOTES_SECTION_NAME = 'Usage Notes'; -/** Component to render the usage notes tab. */ -export function TabUsageNotes(props: {entry: DocEntryRenderable}) { +/** Component to render the usage notes section. */ +export function SectionUsageNotes(props: {entry: DocEntryRenderable}) { if (!props.entry.htmlUsageNotes) { - return (<>); + return <>; } return ( -
+
+
); diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/tab-api.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/tab-api.tsx deleted file mode 100644 index 0f99d16b9c8c..000000000000 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/tab-api.tsx +++ /dev/null @@ -1,26 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {h} from 'preact'; -import {DocEntryRenderable} from '../entities/renderables'; -import {HasRenderableToc} from '../entities/traits'; -import {normalizeTabUrl} from '../transforms/url-transforms'; -import {CodeTableOfContents} from './code-table-of-contents'; - -const API_TAB_NAME = 'API'; - -/** Component to render the API tab. */ -export function TabApi(props: {entry: DocEntryRenderable & HasRenderableToc}) { - return ( -
-
- -
-
- ); -} diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/type-alias-reference.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/type-alias-reference.tsx index 47723de1a656..d4a70a3c68bc 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/type-alias-reference.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/type-alias-reference.tsx @@ -9,18 +9,19 @@ import {h} from 'preact'; import {TypeAliasEntryRenderable} from '../entities/renderables'; import {HeaderApi} from './header-api'; -import {TabDescription} from './tab-description'; -import {TabUsageNotes} from './tab-usage-notes'; -import {TabApi} from './tab-api'; +import {SectionDescription} from './section-description'; +import {SectionUsageNotes} from './section-usage-notes'; +import {SectionApi} from './section-api'; +import {API_REFERENCE_CONTAINER} from '../styling/css-classes'; /** Component to render a type alias API reference document. */ export function TypeAliasReference(entry: TypeAliasEntryRenderable) { return ( -
+
- - - + + +
); } diff --git a/adev/shared-docs/pipeline/api-gen/rendering/transforms/reference-section-id.ts b/adev/shared-docs/pipeline/api-gen/rendering/transforms/reference-section-id.ts new file mode 100644 index 000000000000..fdf0bb3f85ae --- /dev/null +++ b/adev/shared-docs/pipeline/api-gen/rendering/transforms/reference-section-id.ts @@ -0,0 +1,14 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +export const convertSectionNameToId = (sectionName: string): string => { + return sectionName + .toLowerCase() + .replace(/\s|\//g, '-') // remove spaces and slashes + .replace(/[^0-9a-z\-]/g, ''); // only keep letters, digits & dashes +}; diff --git a/adev/shared-docs/pipeline/api-gen/rendering/transforms/url-transforms.ts b/adev/shared-docs/pipeline/api-gen/rendering/transforms/url-transforms.ts index 4a504bf71fe0..8489636733f7 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/transforms/url-transforms.ts +++ b/adev/shared-docs/pipeline/api-gen/rendering/transforms/url-transforms.ts @@ -19,15 +19,3 @@ export const normalizePath = (path: string): string => { } return path; }; - -export const normalizeTabUrl = (tabName: string): string => { - return tabName - .toLowerCase() - .replace(/(.*?)<\/code>/g, '$1') // remove - .replace(/(.*?)<\/strong>/g, '$1') // remove - .replace(/(.*?)<\/em>/g, '$1') // remove - .replace(/\s|\//g, '-') // remove spaces and slashes - .replace(/gt;|lt;/g, '') // remove escaped < and > - .replace(/&#\d+;/g, '') // remove HTML entities - .replace(/[^0-9a-zA-Z\-]/g, ''); // only keep letters, digits & dashes -}; diff --git a/adev/shared-docs/pipeline/examples/template/angular.json b/adev/shared-docs/pipeline/examples/template/angular.json index 95567dd69a28..a12c1fd33fc1 100644 --- a/adev/shared-docs/pipeline/examples/template/angular.json +++ b/adev/shared-docs/pipeline/examples/template/angular.json @@ -21,14 +21,13 @@ "prefix": "app", "architect": { "build": { - "builder": "@angular-devkit/build-angular:browser", + "builder": "@angular/build:application", "options": { "outputPath": "dist/example-app", "index": "src/index.html", - "main": "src/main.ts", + "browser": "src/main.ts", "polyfills": ["zone.js"], "tsConfig": "tsconfig.app.json", - "inlineStyleLanguage": "css", "assets": ["src/assets"], "styles": ["src/styles.css"], "stylePreprocessorOptions": { @@ -59,18 +58,15 @@ "outputHashing": "all" }, "development": { - "buildOptimizer": false, "optimization": false, - "vendorChunk": true, "extractLicenses": false, - "sourceMap": true, - "namedChunks": true + "sourceMap": true } }, "defaultConfiguration": "production" }, "serve": { - "builder": "@angular-devkit/build-angular:dev-server", + "builder": "@angular/build:dev-server", "configurations": { "production": { "browserTarget": "example-app:build:production" @@ -82,13 +78,13 @@ "defaultConfiguration": "development" }, "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", + "builder": "@angular/build:extract-i18n", "options": { "browserTarget": "example-app:build" } }, "test": { - "builder": "@angular-devkit/build-angular:karma", + "builder": "@angular/build:karma", "options": { "main": "src/test.ts", "polyfills": ["zone.js", "zone.js/testing"], diff --git a/adev/shared-docs/pipeline/examples/template/package.json.template b/adev/shared-docs/pipeline/examples/template/package.json.template index 9f121c88e926..040601bf5322 100644 --- a/adev/shared-docs/pipeline/examples/template/package.json.template +++ b/adev/shared-docs/pipeline/examples/template/package.json.template @@ -23,7 +23,7 @@ "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^19.0.0", + "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", "@types/jasmine": "~3.10.0", diff --git a/adev/shared-docs/pipeline/guides/extensions/docs-workflow/docs-step.ts b/adev/shared-docs/pipeline/guides/extensions/docs-workflow/docs-step.ts index 781fe7550df5..36b1fcab6410 100644 --- a/adev/shared-docs/pipeline/guides/extensions/docs-workflow/docs-step.ts +++ b/adev/shared-docs/pipeline/guides/extensions/docs-workflow/docs-step.ts @@ -7,7 +7,7 @@ */ import {Token, Tokens, RendererThis, TokenizerThis} from 'marked'; -import {formatHeading, headingRender} from '../../tranformations/heading'; +import {formatHeading} from '../../tranformations/heading'; interface DocsStepToken extends Tokens.Generic { type: 'docs-step'; diff --git a/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.md b/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.md deleted file mode 100644 index 56daf4428210..000000000000 --- a/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.md +++ /dev/null @@ -1,14 +0,0 @@ -```mermaid - graph TD; - A-->B; - A-->C; - B-->D; - C-->D; -``` - -```mermaid - pie title Pets adopted by volunteers - "Dogs" : 386 - "Cats" : 85 - "Rats" : 15 -``` \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.spec.ts b/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.spec.ts index fe9d2247662b..3e09ad504e2b 100644 --- a/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.spec.ts +++ b/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.spec.ts @@ -20,9 +20,24 @@ describe('markdown to html', () => { // Extend the timeout interval tyo 15 seconds because we were seeing issues with not being able to run marked // within the default timeframe. jasmine.DEFAULT_TIMEOUT_INTERVAL = 15000; - const markdownContent = await readFile(runfiles.resolvePackageRelative('./mermaid.md'), { - encoding: 'utf-8', - }); + + // This test was flaky, 1st attemp to fix it is by inlining the markdown content + const markdownContent = ` +\`\`\`mermaid + graph TD; + A-->B; + A-->C; + B-->D; + C-->D; +\`\`\` + +\`\`\`mermaid + pie title Pets adopted by volunteers + "Dogs" : 386 + "Cats" : 85 + "Rats" : 15 +\`\`\` + `; marked.use({ async: true, diff --git a/adev/shared-docs/pipeline/navigation/BUILD.bazel b/adev/shared-docs/pipeline/navigation/BUILD.bazel new file mode 100644 index 000000000000..aa01af2889b2 --- /dev/null +++ b/adev/shared-docs/pipeline/navigation/BUILD.bazel @@ -0,0 +1,36 @@ +load("//tools:defaults.bzl", "ts_library") + +package(default_visibility = ["//visibility:public"]) + +ts_library( + name = "lib", + srcs = glob( + [ + "*.ts", + ], + exclude = [ + "index.ts", + ], + ), + deps = [ + "//adev/shared-docs/interfaces", + "@npm//@types/node", + "@npm//@webcontainer/api", + "@npm//fast-glob", + ], +) + +ts_library( + name = "navigation", + srcs = [ + "index.ts", + ], + visibility = [ + "//adev/shared-docs:__subpackages__", + ], + deps = [ + ":lib", + "//adev/shared-docs/interfaces", + "@npm//@types/node", + ], +) diff --git a/adev/shared-docs/pipeline/navigation/index.ts b/adev/shared-docs/pipeline/navigation/index.ts new file mode 100644 index 000000000000..38583b76d95b --- /dev/null +++ b/adev/shared-docs/pipeline/navigation/index.ts @@ -0,0 +1,26 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {readFileSync, writeFileSync} from 'fs'; +import {generateNavItems} from './nav-items-gen'; +import {getNavItemGenStrategy} from './strategies'; + +async function main() { + const [paramFilePath] = process.argv.slice(2); + const rawParamLines = readFileSync(paramFilePath, {encoding: 'utf8'}).split('\n'); + const [joinedSrcs, packageDir, strategy, outputFilePath] = rawParamLines; + + const srcs = joinedSrcs.split(','); + + // Generate navigation data + const navData = await generateNavItems(srcs, getNavItemGenStrategy(strategy, packageDir)); + + writeFileSync(outputFilePath, JSON.stringify(navData)); +} + +await main(); diff --git a/adev/shared-docs/pipeline/navigation/nav-items-gen.ts b/adev/shared-docs/pipeline/navigation/nav-items-gen.ts new file mode 100644 index 000000000000..0e6e58f23eaf --- /dev/null +++ b/adev/shared-docs/pipeline/navigation/nav-items-gen.ts @@ -0,0 +1,59 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import fs from 'fs'; +import readline from 'readline'; +import {basename, dirname, resolve} from 'path'; + +import {NavigationItem} from '../../interfaces'; +import {NavigationItemGenerationStrategy} from './types'; + +/** + * Generate navigations items by a provided strategy. + * + * @param mdFilesPaths Paths to the Markdown files that represent the page contents + * @param strategy Strategy + * @returns An array with navigation items + */ +export async function generateNavItems( + mdFilesPaths: string[], + strategy: NavigationItemGenerationStrategy, +): Promise { + const navItems: NavigationItem[] = []; + const {labelGeneratorFn, pathPrefix, contentPath} = strategy; + + for (const path of mdFilesPaths) { + const fullPath = resolve(dirname(path), basename(path)); + const name = path.split('/').pop()?.replace('.md', '')!; + const firstLine = await getMdFileHeading(fullPath); + + navItems.push({ + label: labelGeneratorFn(name, firstLine), + path: `${pathPrefix}/${name}`, + contentPath: `${contentPath}/${name}`, + }); + } + + return navItems; +} + +/** Extract the first heading from a Markdown file. */ +async function getMdFileHeading(filePath: string): Promise { + const readStream = fs.createReadStream(filePath); + const rl = readline.createInterface({input: readStream}); + + for await (const line of rl) { + if (line.trim().startsWith('#')) { + rl.close(); + readStream.destroy(); + return line.replace(/^#+[ \t]+/, ''); + } + } + + return ''; +} diff --git a/adev/shared-docs/pipeline/navigation/strategies.ts b/adev/shared-docs/pipeline/navigation/strategies.ts new file mode 100644 index 000000000000..f817fcdf6778 --- /dev/null +++ b/adev/shared-docs/pipeline/navigation/strategies.ts @@ -0,0 +1,54 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {NavigationItemGenerationStrategy, Strategy} from './types'; + +// Should point to the website content. +// Update, if the location is updated or shared-docs is extracted from `adev/`. +const CONTENT_FOLDER_PATH = 'adev/src/content/'; + +// Ensure that all Strategy-ies are part of SUPPORTED_STRATEGIES by using a key-typed object. +const strategiesObj: {[key in Strategy]: null} = {errors: null, 'extended-diagnostics': null}; +const SUPPORTED_STRATEGIES = Object.keys(strategiesObj); + +/** Get navigation item generation strategy by a provided strategy string. */ +export function getNavItemGenStrategy( + strategy: string, + packageDir: string, +): NavigationItemGenerationStrategy { + if (SUPPORTED_STRATEGIES.indexOf(strategy) === -1) { + throw new Error( + `Unsupported NavigationItem generation strategy "${strategy}". Supported: ${SUPPORTED_STRATEGIES.join(', ')}`, + ); + } + + switch (strategy as Strategy) { + case 'errors': + return errorsStrategy(packageDir); + case 'extended-diagnostics': + return extendedDiagnosticsStrategy(packageDir); + } +} + +// "Errors" navigation items generation strategy +function errorsStrategy(packageDir: string): NavigationItemGenerationStrategy { + return { + pathPrefix: 'errors', + contentPath: packageDir.replace(CONTENT_FOLDER_PATH, ''), + labelGeneratorFn: (fileName, firstLine) => fileName + ': ' + firstLine, + }; +} + +// "Extended diagnostics" items generation strategy +function extendedDiagnosticsStrategy(packageDir: string): NavigationItemGenerationStrategy { + return { + pathPrefix: 'extended-diagnostics', + contentPath: packageDir.replace(CONTENT_FOLDER_PATH, ''), + labelGeneratorFn: (fileName, firstLine) => fileName + ': ' + firstLine, + }; +} diff --git a/adev/shared-docs/pipeline/navigation/test/BUILD.bazel b/adev/shared-docs/pipeline/navigation/test/BUILD.bazel new file mode 100644 index 000000000000..b7472dbe0265 --- /dev/null +++ b/adev/shared-docs/pipeline/navigation/test/BUILD.bazel @@ -0,0 +1,17 @@ +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") + +package(default_visibility = ["//adev/shared-docs/pipeline/navigation:__subpackages__"]) + +ts_library( + name = "unit_test_lib", + testonly = True, + srcs = glob(["*.spec.ts"]), + deps = [ + "//adev/shared-docs/pipeline/navigation:lib", + ], +) + +jasmine_node_test( + name = "unit_tests", + deps = [":unit_test_lib"], +) diff --git a/adev/shared-docs/pipeline/navigation/test/nav-items-gen.spec.ts b/adev/shared-docs/pipeline/navigation/test/nav-items-gen.spec.ts new file mode 100644 index 000000000000..0612521bf05a --- /dev/null +++ b/adev/shared-docs/pipeline/navigation/test/nav-items-gen.spec.ts @@ -0,0 +1,50 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {generateNavItems} from '../nav-items-gen'; +import {NavigationItemGenerationStrategy} from '../types'; +import fs from 'fs'; +import readline from 'readline'; + +const readlineInterfaceMock = { + close: () => {}, + async *[Symbol.asyncIterator]() { + yield ''; + yield 'Some random text'; + yield '## Heading'; + yield 'Some text'; + }, +}; + +describe('generateNavItems', () => { + it('should test the default case', async () => { + spyOn(fs, 'createReadStream').and.returnValue({destroy: () => null} as any); + spyOn(readline, 'createInterface').and.returnValue(readlineInterfaceMock as any); + + const strategy: NavigationItemGenerationStrategy = { + pathPrefix: 'page', + contentPath: 'content/directory', + labelGeneratorFn: (fileName, firstLine) => fileName + ' // ' + firstLine, + }; + + const navItems = await generateNavItems(['directory/home.md', 'directory/about.md'], strategy); + + expect(navItems).toEqual([ + { + label: 'home // Heading', + path: 'page/home', + contentPath: 'content/directory/home', + }, + { + label: 'about // Heading', + path: 'page/about', + contentPath: 'content/directory/about', + }, + ]); + }); +}); diff --git a/adev/shared-docs/pipeline/navigation/types.ts b/adev/shared-docs/pipeline/navigation/types.ts new file mode 100644 index 000000000000..f92e5db9e005 --- /dev/null +++ b/adev/shared-docs/pipeline/navigation/types.ts @@ -0,0 +1,22 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +/** + * `NavigationItem` generation strategy + */ +export type NavigationItemGenerationStrategy = { + /** App route path prefix. */ + pathPrefix: string; + /** Content path where the source files are kept. */ + contentPath: string; + /** Page/route label generator function. */ + labelGeneratorFn: (fileName: string, firstLine: string) => string; +}; + +/** Strategy for navigation item generation. */ +export type Strategy = 'errors' | 'extended-diagnostics'; diff --git a/adev/shared-docs/pipeline/tutorials/BUILD.bazel b/adev/shared-docs/pipeline/tutorials/BUILD.bazel index 40e1384f93c0..a7faa454b246 100644 --- a/adev/shared-docs/pipeline/tutorials/BUILD.bazel +++ b/adev/shared-docs/pipeline/tutorials/BUILD.bazel @@ -33,7 +33,6 @@ ts_library( ":editor", "//adev/shared-docs/interfaces", "@npm//@types/node", - "@npm//fast-glob", ], ) diff --git a/adev/shared-docs/pipeline/tutorials/common/angular.json b/adev/shared-docs/pipeline/tutorials/common/angular.json index b9d216be0bd3..e541511cb960 100644 --- a/adev/shared-docs/pipeline/tutorials/common/angular.json +++ b/adev/shared-docs/pipeline/tutorials/common/angular.json @@ -39,7 +39,7 @@ "prefix": "app", "architect": { "build": { - "builder": "@angular-devkit/build-angular:application", + "builder": "@angular/build:application", "options": { "outputPath": "dist/first-app", "index": "src/index.html", @@ -76,7 +76,7 @@ "defaultConfiguration": "production" }, "serve": { - "builder": "@angular-devkit/build-angular:dev-server", + "builder": "@angular/build:dev-server", "configurations": { "production": { "buildTarget": "first-app:build:production" @@ -88,7 +88,7 @@ "defaultConfiguration": "development" }, "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", + "builder": "@angular/build:extract-i18n", "options": { "buildTarget": "first-app:build" } diff --git a/adev/shared-docs/pipeline/tutorials/common/package-lock.json b/adev/shared-docs/pipeline/tutorials/common/package-lock.json index a7ddd37c4f8b..8769b175cb74 100644 --- a/adev/shared-docs/pipeline/tutorials/common/package-lock.json +++ b/adev/shared-docs/pipeline/tutorials/common/package-lock.json @@ -8,140 +8,152 @@ "name": "angular.dev", "version": "0.0.0", "dependencies": { - "@angular/common": "^17.0.0-rc.1", - "@angular/compiler": "^17.0.0-rc.1", - "@angular/core": "^17.0.0-rc.1", - "@angular/platform-browser": "^17.0.0-rc.1", + "@angular/common": "^19.0.0", + "@angular/compiler": "^19.0.0", + "@angular/core": "^19.0.0", + "@angular/platform-browser": "^19.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", - "zone.js": "~0.14.0" + "zone.js": "~0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.0.0-rc.2", - "@angular/cli": "^17.0.0-rc.2", - "@angular/compiler-cli": "^17.0.0-rc.1", - "typescript": "~5.2.0" + "@angular/build": "^19.0.0", + "@angular/cli": "^19.0.0", + "@angular/compiler-cli": "^19.0.0", + "typescript": "~5.7.3" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@angular-devkit/architect": { - "version": "0.1700.0-rc.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.0-rc.2.tgz", - "integrity": "sha512-+1GpG59fHgHNdqnDxXDa801vunrxSHDQohtS2s9ltuWDrl29vptdHLXCAWpP7OD+MD7+gab5jQqIDNCXats8gw==", + "version": "0.1901.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.8.tgz", + "integrity": "sha512-DzvlL1Zg+zOnVmMN3CjE5KzjZAltRZwOwwcso72iWenBPvl/trKzPDlA6ySmpRonm+AR9i9JrdLEUlwczW6/bQ==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-devkit/core": "17.0.0-rc.2", + "@angular-devkit/core": "19.1.8", "rxjs": "7.8.1" }, "engines": { - "node": ">=18.13.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.8.tgz", + "integrity": "sha512-j1zHKvOsGwu5YwAZGuzi835R9vcW7PkfxmSRIJeVl+vawgk31K3zFb4UPH8AY/NPWYqXIAnwpka3HC1+JrWLWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@angular-devkit/build-angular": { - "version": "17.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.0-rc.2.tgz", - "integrity": "sha512-lRWtwbZtk1VQ0XhJ97M0ijzLld5aAlx/CyxK1CBveP05i3FjdhQ4sH0MFf/bqkDr7kDc9WhDikryKEIdpcKE5w==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1700.0-rc.2", - "@angular-devkit/build-webpack": "0.1700.0-rc.2", - "@angular-devkit/core": "17.0.0-rc.2", - "@babel/core": "7.23.2", - "@babel/generator": "7.23.0", - "@babel/helper-annotate-as-pure": "7.22.5", - "@babel/helper-split-export-declaration": "7.22.6", - "@babel/plugin-transform-async-generator-functions": "7.23.2", - "@babel/plugin-transform-async-to-generator": "7.22.5", - "@babel/plugin-transform-runtime": "7.23.2", - "@babel/preset-env": "7.23.2", - "@babel/runtime": "7.23.2", - "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.0.0-rc.2", - "@vitejs/plugin-basic-ssl": "1.0.1", - "ansi-colors": "4.1.3", - "autoprefixer": "10.4.16", - "babel-loader": "9.1.3", - "babel-plugin-istanbul": "6.1.1", - "browser-sync": "2.29.3", - "browserslist": "^4.21.5", - "chokidar": "3.5.3", - "copy-webpack-plugin": "11.0.0", - "critters": "0.0.20", - "css-loader": "6.8.1", - "esbuild-wasm": "0.19.5", - "fast-glob": "3.3.1", - "http-proxy-middleware": "2.0.6", - "https-proxy-agent": "7.0.2", - "inquirer": "9.2.11", - "jsonc-parser": "3.2.0", - "karma-source-map-support": "1.4.0", - "less": "4.2.0", - "less-loader": "11.1.0", - "license-webpack-plugin": "4.0.2", - "loader-utils": "3.2.1", - "magic-string": "0.30.5", - "mini-css-extract-plugin": "2.7.6", - "mrmime": "1.0.1", - "open": "8.4.2", + "node_modules/@angular-devkit/schematics": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.8.tgz", + "integrity": "sha512-2JGUMD3zjfY8G4RYpypm2/1YEO+O4DtFycUvptIpsBYyULgnEbJ3tlp2oRiXI2vp9tC8IyWqa/swlA8DTI6ZYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.1.8", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/build": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.8.tgz", + "integrity": "sha512-DAnnmbqPmtlY5JOitqWUgXi/yKj8eAcrP0T7hYZwLmcRsb+HsHYWsAQoFaTDw0p9WC5BKPqDBCMIivcuIV/izQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1901.8", + "@angular-devkit/core": "19.1.8", + "@babel/core": "7.26.0", + "@babel/helper-annotate-as-pure": "7.25.9", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-syntax-import-attributes": "7.26.0", + "@inquirer/confirm": "5.1.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", + "browserslist": "^4.23.0", + "esbuild": "0.24.2", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "listr2": "8.2.5", + "magic-string": "0.30.17", + "mrmime": "2.0.0", "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "2.3.1", - "piscina": "4.1.0", - "postcss": "8.4.31", - "postcss-loader": "7.3.3", - "resolve-url-loader": "5.0.0", - "rxjs": "7.8.1", - "sass": "1.69.5", - "sass-loader": "13.3.2", - "semver": "7.5.4", - "source-map-loader": "4.0.1", - "source-map-support": "0.5.21", - "terser": "5.22.0", - "text-table": "0.2.0", - "tree-kill": "1.2.2", - "tslib": "2.6.2", - "vite": "4.5.0", - "webpack": "5.89.0", - "webpack-dev-middleware": "6.1.1", - "webpack-dev-server": "4.15.1", - "webpack-merge": "5.10.0", - "webpack-subresource-integrity": "5.1.0" - }, - "engines": { - "node": ">=18.13.0", + "picomatch": "4.0.2", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", + "semver": "7.6.3", + "vite": "6.0.11", + "watchpack": "2.4.2" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.19.5" + "lmdb": "3.2.2" }, "peerDependencies": { - "@angular/compiler-cli": "^17.0.0 || ^17.0.0-next.0", - "@angular/localize": "^17.0.0 || ^17.0.0-next.0", - "@angular/platform-server": "^17.0.0 || ^17.0.0-next.0", - "@angular/service-worker": "^17.0.0 || ^17.0.0-next.0", - "jest": "^29.5.0", - "jest-environment-jsdom": "^29.5.0", - "karma": "^6.3.0", - "ng-packagr": "^17.0.0 || ^17.0.0-next.1", - "protractor": "^7.0.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.2 <5.3" + "@angular/compiler": "^19.0.0", + "@angular/compiler-cli": "^19.0.0", + "@angular/localize": "^19.0.0", + "@angular/platform-server": "^19.0.0", + "@angular/service-worker": "^19.0.0", + "@angular/ssr": "^19.1.8", + "less": "^4.2.0", + "ng-packagr": "^19.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -153,19 +165,16 @@ "@angular/service-worker": { "optional": true }, - "jest": { - "optional": true - }, - "jest-environment-jsdom": { + "@angular/ssr": { "optional": true }, - "karma": { + "less": { "optional": true }, "ng-packagr": { "optional": true }, - "protractor": { + "postcss": { "optional": true }, "tailwindcss": { @@ -173,92 +182,28 @@ } } }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1700.0-rc.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.0-rc.2.tgz", - "integrity": "sha512-yOI3cXXpkLnTlqMqXik1ATFWCgPZdR7Rv3eG67mD8QaMIShubFb82HQLKcb34SQJxf6HntYw7X6d5xnKbHwnvQ==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1700.0-rc.2", - "rxjs": "7.8.1" - }, - "engines": { - "node": ">=18.13.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "webpack": "^5.30.0", - "webpack-dev-server": "^4.0.0" - } - }, - "node_modules/@angular-devkit/core": { - "version": "17.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.0-rc.2.tgz", - "integrity": "sha512-z68Y+JhcDsTv9TVOX5tmuR7bRrTMLCP/3AxUeJ9kZW4UdCeZA77ya0k7F1XpkyCb2JTM/5+yYXTigxMh6Jhr8g==", - "dev": true, - "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "2.3.1", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": ">=18.13.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/schematics": { - "version": "17.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.0-rc.2.tgz", - "integrity": "sha512-WW4mQdCGZ2YA6g2r10571hKxCMwkiVEoOF69GjBzLfIr4YBF6bcXcczqgGyeOtbTT3xy7FbTcdNZ7/l9K4XLDQ==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "17.0.0-rc.2", - "jsonc-parser": "3.2.0", - "magic-string": "0.30.5", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": ">=18.13.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, "node_modules/@angular/cli": { - "version": "17.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.0-rc.2.tgz", - "integrity": "sha512-2Xl2e5PzD3MyNpf3Urbs1esHBqY5faPcqsRwFvHC2yo+X0M1n64D6uuKQ5+gbPnEbUc5KKi04QiFEsCbPIW/mw==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1700.0-rc.2", - "@angular-devkit/core": "17.0.0-rc.2", - "@angular-devkit/schematics": "17.0.0-rc.2", - "@schematics/angular": "17.0.0-rc.2", + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.8.tgz", + "integrity": "sha512-JmdLj8110DNWaxL03K7I06+nLyBfXgiIqYyrQx5QO9AodGkKHK5rE+7VD8MjZhUymua57HToD0oHaQgThJwTJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.1901.8", + "@angular-devkit/core": "19.1.8", + "@angular-devkit/schematics": "19.1.8", + "@inquirer/prompts": "7.2.1", + "@listr2/prompt-adapter-inquirer": "2.0.18", + "@schematics/angular": "19.1.8", "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "ini": "4.1.1", - "inquirer": "9.2.11", - "jsonc-parser": "3.2.0", - "npm-package-arg": "11.0.1", - "npm-pick-manifest": "9.0.0", - "open": "8.4.2", - "ora": "5.4.1", - "pacote": "17.0.4", - "resolve": "1.22.8", - "semver": "7.5.4", + "ini": "5.0.0", + "jsonc-parser": "3.3.1", + "listr2": "8.2.5", + "npm-package-arg": "12.0.1", + "npm-pick-manifest": "10.0.0", + "pacote": "20.0.0", + "resolve": "1.22.10", + "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" }, @@ -266,38 +211,40 @@ "ng": "bin/ng.js" }, "engines": { - "node": ">=18.13.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular/common": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.0-rc.1.tgz", - "integrity": "sha512-E51n8DdHY6WvP2OCBK9saIeGOjqCsekTxJ9Dx52kD/ZSI5JyQHUmxnCiGbp6rbxPBSli/0CS/6OabX7tVYq2Mg==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.7.tgz", + "integrity": "sha512-MXfUGfWeesTQ12HXgeoVIXsS+r1jZxT2FkLQtqS+NRsRD4T1vlyvD7kTI+Ku1NAjdt3mB8TJ0cZHubvmml8I+Q==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": ">=18.13.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "17.0.0-rc.1", + "@angular/core": "19.1.7", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.0-rc.1.tgz", - "integrity": "sha512-h1HNvTNbroMo2YUtn6K/i0LKQUlAPQJb/Bq+nz1TyxnDI5nYGbRJ8WycQyGwRVrfvLkghkkCGzQqIHEUmZ3rSw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.7.tgz", + "integrity": "sha512-Q3eqqIhMEzrnmFJtUO0K+WPpCfP/JTl9lJXZKe0zgNPdRFUufjSUcPHGzd7OjN2gPpiAvS1yBvENvqs+g/MejQ==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": ">=18.13.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "17.0.0-rc.1" + "@angular/core": "19.1.7" }, "peerDependenciesMeta": { "@angular/core": { @@ -306,16 +253,17 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.0-rc.1.tgz", - "integrity": "sha512-qGom6m5NXj8mB2laXm/xv5th2Vo5iwR0eSOW5VbvU7mCAhwx6WwlWd/jNaf58w1GygrU9p0ay8CHOv4yIK26Kw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.7.tgz", + "integrity": "sha512-Uu/TxfIcE1lStlCLmOPbghG1Y5o83odES89sr7bYNJz2mcG7TEonatf6GTOMzbJNil9FBJt6qnJkDkSjn4nUKw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "7.23.2", + "@babel/core": "7.26.0", "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^3.0.0", + "chokidar": "^4.0.0", "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.1.2", + "reflect-metadata": "^0.2.0", "semver": "^7.0.0", "tslib": "^2.3.0", "yargs": "^17.2.1" @@ -326,42 +274,44 @@ "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": ">=18.13.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "17.0.0-rc.1", - "typescript": ">=5.2 <5.3" + "@angular/compiler": "19.1.7", + "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.0-rc.1.tgz", - "integrity": "sha512-qz5Xjye2XkmBp+4vSxpPVM6yXs/36oXx/FUQa6PDP/DrW9wrCxSELf2g9PHT84xDgq6BhBqca0a4fq+QFURTqg==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.7.tgz", + "integrity": "sha512-P+e4ekJYWMFhWSzJav0R51bFAfUhIOmnqmG9mlI/ZONu2qcTTmyIG9AW5x1qhrMHEH42RaeK60RkKyqgcHaGDg==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": ">=18.13.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.14.0" + "zone.js": "~0.15.0" } }, "node_modules/@angular/platform-browser": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.0-rc.1.tgz", - "integrity": "sha512-y1YzN36AmvWMKNjJ0P8OVcnymCuc16xt/hHmEgDDu7ky5TfBO5OTm26DVySdGVuJdkz0M1sTbyyRuGDrhxRu7A==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.7.tgz", + "integrity": "sha512-QKakWl+CeVVwn22yjRHBXm6BvDsHoo+9u1pJGGk2smKSYjHW6qAly28+P7FUfVXUQI7rg++M66JwzNOFfYMDQA==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": ">=18.13.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "17.0.0-rc.1", - "@angular/common": "17.0.0-rc.1", - "@angular/core": "17.0.0-rc.1" + "@angular/animations": "19.1.7", + "@angular/common": "19.1.7", + "@angular/core": "19.1.7" }, "peerDependenciesMeta": { "@angular/animations": { @@ -369,50 +319,48 @@ } } }, - "node_modules/@assemblyscript/loader": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", - "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", - "dev": true - }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -431,65 +379,59 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -502,51 +444,35 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -555,8195 +481,2595 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "@babel/types": "^7.24.7" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "node_modules/@babel/helpers": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "node_modules/@babel/parser": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.26.9" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "node_modules/@babel/template": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, + "node_modules/@babel/traverse": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "node_modules/@babel/types": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@inquirer/checkbox": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.2.tgz", + "integrity": "sha512-PL9ixC5YsPXzXhAZFUPmkXGxfgjkdfZdPEPPmt4kFwQ4LBMDG9n/nHXYRGGZSKZJs+d1sGKWgS2GiPzVRKUdtQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@inquirer/core": "^10.1.7", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@inquirer/confirm": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz", + "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@inquirer/core": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.7.tgz", + "integrity": "sha512-AA9CQhlrt6ZgiSy6qoAigiA1izOa751ugX6ioSjqgJ+/Gd+tEN/TORk5sUYNjXuHWfW0r1n/a6ak4u/NqHHrtA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@inquirer/editor": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.7.tgz", + "integrity": "sha512-gktCSQtnSZHaBytkJKMKEuswSk2cDBuXX5rxGFv306mwHfBPjg5UAldw9zWGoEyvA9KpRDkeM4jfrx0rXn0GyA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@inquirer/expand": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.9.tgz", + "integrity": "sha512-Xxt6nhomWTAmuSX61kVgglLjMEFGa+7+F6UUtdEUeg7fg4r9vaFttUUKrtkViYYrQBA5Ia1tkOJj2koP9BuLig==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@inquirer/figures": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", + "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "node_modules/@inquirer/input": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.6.tgz", + "integrity": "sha512-1f5AIsZuVjPT4ecA8AwaxDFNHny/tSershP/cTvTDxLdiIGTeILNcKozB0LaYt6mojJLUbOYhpIxicaYf7UKIQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "node_modules/@inquirer/number": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.9.tgz", + "integrity": "sha512-iN2xZvH3tyIYXLXBvlVh0npk1q/aVuKXZo5hj+K3W3D4ngAEq/DkLpofRzx6oebTUhBvOgryZ+rMV0yImKnG3w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", - "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", + "node_modules/@inquirer/password": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.9.tgz", + "integrity": "sha512-xBEoOw1XKb0rIN208YU7wM7oJEHhIYkfG7LpTJAEW913GZeaoQerzf5U/LSHI45EVvjAdgNXmXgH51cUXKZcJQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", + "ansi-escapes": "^4.3.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@types/node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "node_modules/@inquirer/prompts": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.1.tgz", + "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@inquirer/checkbox": "^4.0.4", + "@inquirer/confirm": "^5.1.1", + "@inquirer/editor": "^4.2.1", + "@inquirer/expand": "^4.0.4", + "@inquirer/input": "^4.1.1", + "@inquirer/number": "^3.0.4", + "@inquirer/password": "^4.0.4", + "@inquirer/rawlist": "^4.0.4", + "@inquirer/search": "^3.0.4", + "@inquirer/select": "^4.0.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", - "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", + "node_modules/@inquirer/rawlist": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.9.tgz", + "integrity": "sha512-+5t6ebehKqgoxV8fXwE49HkSF2Rc9ijNiVGEQZwvbMI61/Q5RcD+jWD6Gs1tKdz5lkI8GRBL31iO0HjGK1bv+A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@types/node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "node_modules/@inquirer/search": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.9.tgz", + "integrity": "sha512-DWmKztkYo9CvldGBaRMr0ETUHgR86zE6sPDVOHsqz4ISe9o1LuiWfgJk+2r75acFclA93J/lqzhT0dTjCzHuoA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@inquirer/core": "^10.1.7", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" + "@types/node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "node_modules/@inquirer/select": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.9.tgz", + "integrity": "sha512-BpJyJe7Dkhv2kz7yG7bPSbJLQuu/rqyNlF1CfiiFeFwouegfH+zh13KDyt6+d9DwucKo7hqM3wKLLyJxZMO+Xg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@inquirer/core": "^10.1.7", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", - "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@types/node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "node_modules/@inquirer/type": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@types/node": ">=18" }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "minipass": "^7.0.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", - "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", - "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", - "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz", + "integrity": "sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@inquirer/type": "^1.5.5" }, "engines": { - "node": ">=6.9.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@inquirer/prompts": ">= 3 < 8" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "mute-stream": "^1.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "ISC", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz", + "integrity": "sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz", + "integrity": "sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz", + "integrity": "sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", - "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", - "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", - "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.2", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.23.2", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.23.0", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.23.0", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-modules-systemjs": "^7.23.0", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.23.0", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", - "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", - "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", - "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", - "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", - "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", - "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", - "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", - "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", - "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", - "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", - "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", - "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", - "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", - "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", - "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", - "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", - "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", - "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", - "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", - "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", - "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", - "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "node_modules/@ljharb/through": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz", - "integrity": "sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/@ngtools/webpack": { - "version": "17.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.0-rc.2.tgz", - "integrity": "sha512-V/FEtXh0tnoUQsdY9Q7QrkjSF9tvKFhm5mTC/qj2WMq+e53cT/HbeAcUvZMyKsNmr/1SWm6xv4BhIwPHPIq7yg==", - "dev": true, - "engines": { - "node": ">=18.13.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^17.0.0 || ^17.0.0-next.0", - "typescript": ">=5.2 <5.3", - "webpack": "^5.54.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/agent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz", - "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/@npmcli/agent/node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.3.tgz", - "integrity": "sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw==", - "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", - "dev": true, - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.0.tgz", - "integrity": "sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ==", - "dev": true, - "dependencies": { - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.1.tgz", - "integrity": "sha512-Od/JMrgkjZ8alyBE0IzeqZDiF1jgMez9Gkc/OYrCkHHiXNwM0wc6s7+h+xM7kYDZkS0tAoOLr9VvygyE5+2F7g==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@schematics/angular": { - "version": "17.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.0-rc.2.tgz", - "integrity": "sha512-ZkQiiz2r8onJJEZlxJl9j2X12Tm7ZJaZlnxmbSryT8vkHX8g6xtB9RgLfSAoojrHj0n/io314fFnu9C0tBWsRQ==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "17.0.0-rc.2", - "@angular-devkit/schematics": "17.0.0-rc.2", - "jsonc-parser": "3.2.0" - }, - "engines": { - "node": ">=18.13.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@sigstore/bundle": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.0.tgz", - "integrity": "sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.1.0.tgz", - "integrity": "sha512-4VRpfJxs+8eLqzLVrZngVNExVA/zAhVbi4UT4zmtLi4xRd7vz5qie834OgkrGsLlLB1B2nz/3wUxT1XAUBe8gw==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^2.1.0", - "@sigstore/protobuf-specs": "^0.2.1", - "make-fetch-happen": "^13.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", - "dev": true, - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.2.0.tgz", - "integrity": "sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1", - "tuf-js": "^2.1.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", - "dev": true, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.0.tgz", - "integrity": "sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==", - "dev": true, - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", - "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.12.tgz", - "integrity": "sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", - "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz", - "integrity": "sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "node_modules/@types/cors": { - "version": "2.8.15", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.15.tgz", - "integrity": "sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.44.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", - "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.6.tgz", - "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", - "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", - "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.39", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", - "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", - "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.13", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.13.tgz", - "integrity": "sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", - "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.8.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", - "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", - "dev": true, - "dependencies": { - "undici-types": "~5.25.1" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.8.tgz", - "integrity": "sha512-vGXshY9vim9CJjrpcS5raqSjEfKlJcWy2HNdgUasR66fAnVEYarrf1ULV4nfvpC1nZq/moA9qyqBcu83x+Jlrg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.9.9", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", - "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", - "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", - "dev": true - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", - "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.3.tgz", - "integrity": "sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", - "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.35", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.35.tgz", - "integrity": "sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.8.tgz", - "integrity": "sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", - "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", - "dev": true, - "engines": { - "node": ">=14.6.0" - }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/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/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-each-series": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", - "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "dev": true, - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", - "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.32.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/body-parser/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "dev": true, - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "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/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-sync": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.3.tgz", - "integrity": "sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==", - "dev": true, - "dependencies": { - "browser-sync-client": "^2.29.3", - "browser-sync-ui": "^2.29.3", - "bs-recipes": "1.3.4", - "chalk": "4.1.2", - "chokidar": "^3.5.1", - "connect": "3.6.6", - "connect-history-api-fallback": "^1", - "dev-ip": "^1.0.1", - "easy-extender": "^2.3.4", - "eazy-logger": "^4.0.1", - "etag": "^1.8.1", - "fresh": "^0.5.2", - "fs-extra": "3.0.1", - "http-proxy": "^1.18.1", - "immutable": "^3", - "localtunnel": "^2.0.1", - "micromatch": "^4.0.2", - "opn": "5.3.0", - "portscanner": "2.2.0", - "raw-body": "^2.3.2", - "resp-modifier": "6.0.2", - "rx": "4.1.0", - "send": "0.16.2", - "serve-index": "1.9.1", - "serve-static": "1.13.2", - "server-destroy": "1.0.1", - "socket.io": "^4.4.1", - "ua-parser-js": "^1.0.33", - "yargs": "^17.3.1" - }, - "bin": { - "browser-sync": "dist/bin.js" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/browser-sync-client": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.3.tgz", - "integrity": "sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==", - "dev": true, - "dependencies": { - "etag": "1.8.1", - "fresh": "0.5.2", - "mitt": "^1.1.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/browser-sync-ui": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz", - "integrity": "sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==", - "dev": true, - "dependencies": { - "async-each-series": "0.1.1", - "chalk": "4.1.2", - "connect-history-api-fallback": "^1", - "immutable": "^3", - "server-destroy": "1.0.1", - "socket.io-client": "^4.4.1", - "stream-throttle": "^0.1.3" - } - }, - "node_modules/browser-sync-ui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/browser-sync-ui/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/browser-sync-ui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/browser-sync-ui/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/browser-sync-ui/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-sync-ui/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-sync/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/browser-sync/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/browser-sync/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/browser-sync/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/browser-sync/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-sync/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-recipes": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", - "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", - "dev": true - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.0.tgz", - "integrity": "sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001551", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz", - "integrity": "sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "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/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "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" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", - "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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/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/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "dependencies": { - "is-what": "^3.14.1" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/core-js-compat": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", - "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", - "dev": true, - "dependencies": { - "browserslist": "^4.22.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/critters": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", - "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "css-select": "^5.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.2", - "htmlparser2": "^8.0.2", - "postcss": "^8.4.23", - "pretty-bytes": "^5.3.0" - } - }, - "node_modules/critters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/critters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/critters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/critters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/critters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/critters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", - "dev": true - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/dev-ip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", - "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", - "dev": true, - "bin": { - "dev-ip": "lib/dev-ip.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/easy-extender": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", - "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", - "dev": true, - "dependencies": { - "lodash": "^4.17.10" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/eazy-logger": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz", - "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==", - "dev": true, - "dependencies": { - "chalk": "4.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eazy-logger/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eazy-logger/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eazy-logger/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eazy-logger/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eazy-logger/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eazy-logger/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.559", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.559.tgz", - "integrity": "sha512-iS7KhLYCSJbdo3rUSkhDTVuFNCV34RKs2UaB9Ecr7VlqzjjWW//0nfsFF5dtDmyXlZQaDYYtID5fjtC/6lpRug==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/engine.io": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.3.tgz", - "integrity": "sha512-IML/R4eG/pUS5w7OfcDE0jKrljWS9nwnEfsxWCIJF5eO6AHo6+Hlv+lQbdlAYsiJPHzUthLm1RUjnBzWOs45cw==", - "dev": true, - "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.11.0" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-client": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz", - "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.11.0", - "xmlhttprequest-ssl": "~2.0.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "optional": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", - "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.19.5", - "@esbuild/android-arm64": "0.19.5", - "@esbuild/android-x64": "0.19.5", - "@esbuild/darwin-arm64": "0.19.5", - "@esbuild/darwin-x64": "0.19.5", - "@esbuild/freebsd-arm64": "0.19.5", - "@esbuild/freebsd-x64": "0.19.5", - "@esbuild/linux-arm": "0.19.5", - "@esbuild/linux-arm64": "0.19.5", - "@esbuild/linux-ia32": "0.19.5", - "@esbuild/linux-loong64": "0.19.5", - "@esbuild/linux-mips64el": "0.19.5", - "@esbuild/linux-ppc64": "0.19.5", - "@esbuild/linux-riscv64": "0.19.5", - "@esbuild/linux-s390x": "0.19.5", - "@esbuild/linux-x64": "0.19.5", - "@esbuild/netbsd-x64": "0.19.5", - "@esbuild/openbsd-x64": "0.19.5", - "@esbuild/sunos-x64": "0.19.5", - "@esbuild/win32-arm64": "0.19.5", - "@esbuild/win32-ia32": "0.19.5", - "@esbuild/win32-x64": "0.19.5" - } - }, - "node_modules/esbuild-wasm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.19.5.tgz", - "integrity": "sha512-7zmLLn2QCj93XfMmHtzrDJ1UBuOHB2CZz1ghoCEZiRajxjUvHsF40PnbzFIY/pmesqPRaEtEWii0uzsTbnAgrA==", - "dev": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "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/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter-asyncresource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", - "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", - "dev": true - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/express/node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/express/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/express/node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/express/node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/express/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "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/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/gauge/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "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/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hdr-histogram-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", - "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", - "dev": true, - "dependencies": { - "@assemblyscript/loader": "^0.10.1", - "base64-js": "^1.2.0", - "pako": "^1.0.3" - } - }, - "node_modules/hdr-histogram-percentiles-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", - "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", - "dev": true - }, - "node_modules/hosted-git-info": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", - "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", - "dev": true, - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/inquirer": { - "version": "9.2.11", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.11.tgz", - "integrity": "sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==", - "dev": true, - "dependencies": { - "@ljharb/through": "^2.3.9", - "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "figures": "^5.0.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "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/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "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/is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "dev": true, - "dependencies": { - "lodash.isfinite": "^3.3.2" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", - "dev": true, - "dependencies": { - "source-map-support": "^0.5.5" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", - "dev": true, - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/less": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", - "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", - "dev": true, - "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "source-map": "~0.6.0" - } - }, - "node_modules/less-loader": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", - "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", - "dev": true, - "dependencies": { - "klona": "^2.0.4" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "less": "^3.5.0 || ^4.0.0", - "webpack": "^5.0.0" - } - }, - "node_modules/less/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/license-webpack-plugin": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", - "dev": true, - "dependencies": { - "webpack-sources": "^3.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-sources": { - "optional": true - } - } - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", - "dev": true - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/localtunnel": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", - "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", - "dev": true, - "dependencies": { - "axios": "0.21.4", - "debug": "4.3.2", - "openurl": "1.1.1", - "yargs": "17.1.1" - }, - "bin": { - "lt": "bin/lt.js" - }, - "engines": { - "node": ">=8.3.0" - } - }, - "node_modules/localtunnel/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/localtunnel/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/localtunnel/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/localtunnel/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/localtunnel/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/localtunnel/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/localtunnel/node_modules/yargs": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", - "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/localtunnel/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz", + "integrity": "sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz", + "integrity": "sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz", + "integrity": "sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } + "os": [ + "linux" + ] }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", "optional": true, - "bin": { - "semver": "bin/semver" - } + "os": [ + "win32" + ] }, - "node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "node_modules/@napi-rs/nice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", + "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, + "license": "MIT", + "optional": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" + "node": ">= 10" }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.0.1", + "@napi-rs/nice-android-arm64": "1.0.1", + "@napi-rs/nice-darwin-arm64": "1.0.1", + "@napi-rs/nice-darwin-x64": "1.0.1", + "@napi-rs/nice-freebsd-x64": "1.0.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", + "@napi-rs/nice-linux-arm64-gnu": "1.0.1", + "@napi-rs/nice-linux-arm64-musl": "1.0.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", + "@napi-rs/nice-linux-s390x-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-musl": "1.0.1", + "@napi-rs/nice-win32-arm64-msvc": "1.0.1", + "@napi-rs/nice-win32-ia32-msvc": "1.0.1", + "@napi-rs/nice-win32-x64-msvc": "1.0.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", + "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 10" } }, - "node_modules/make-fetch-happen/node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", + "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 10" } }, - "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 6" + "node": ">= 10" } }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", + "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz", + "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" + "node": ">= 10" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz", + "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==", + "cpu": [ + "arm" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">= 10" } }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz", + "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "fs-monkey": "^1.0.4" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 4.0.0" + "node": ">= 10" } }, - "node_modules/merge-descriptors": { + "node_modules/@napi-rs/nice-linux-arm64-musl": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz", + "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">= 10" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz", + "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==", + "cpu": [ + "ppc64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">= 10" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz", + "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.6" + "node": ">= 10" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz", + "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==", + "cpu": [ + "s390x" + ], "dev": true, - "bin": { - "mime": "cli.js" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">= 10" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz", + "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">= 10" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz", + "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">= 10" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz", + "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6" + "node": ">= 10" } }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz", + "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "schema-utils": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "node": ">= 10" } }, - "node_modules/minimalistic-assert": { + "node_modules/@napi-rs/nice-win32-x64-msvc": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", + "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 8" } }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 8" } }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { "node": ">= 8" } }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", "dev": true, + "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/minipass-collect/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } + "license": "ISC" }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", "dev": true, + "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "semver": "^7.3.5" }, "engines": { - "node": ">= 8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/@npmcli/git": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", + "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", "dev": true, + "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } + "license": "ISC" }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/@npmcli/installed-package-contents": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", + "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", "dev": true, + "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/minipass-json-stream/node_modules/yallist": { + "node_modules/@npmcli/node-gyp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", + "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "node_modules/@npmcli/package-json": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.1.tgz", + "integrity": "sha512-d5qimadRAUCO4A/Txw71VM7UrRZzV+NPclxz/dc+M6B2oYwjWTjqh8HA/sGQgs9VZuJ6I/P7XIAlJvgrl27ZOw==", "dev": true, + "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "@npmcli/git": "^6.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/@npmcli/promise-spawn": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz", + "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==", "dev": true, + "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "which": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/@npmcli/redact": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz", + "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "node_modules/@npmcli/run-script": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.0.2.tgz", + "integrity": "sha512-cJXiUlycdizQwvqE1iaAb4VRUM3RX09/8q46zjvy+ct9GhfZRWd7jXYVc1tn/CfRlGPVkX/u4sstRlepsm7hfw==", "dev": true, + "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^11.0.0", + "proc-log": "^5.0.0", + "which": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "yallist": "^4.0.0" + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/minipass-sized/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 8" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "yallist": "^4.0.0" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/mitt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", - "dev": true + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" }, - "bin": { - "multicast-dns": "cli.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/needle": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", - "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true, + "license": "Apache-2.0", "optional": true, - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, "bin": { - "needle": "bin/needle" + "detect-libc": "bin/detect-libc.js" }, "engines": { - "node": ">= 4.4.x" + "node": ">=0.10" } }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "dev": true, - "optional": true, - "dependencies": { - "ms": "^2.1.1" - } + "license": "MIT", + "optional": true }, - "node_modules/needle/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=14" } }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", + "cpu": [ + "arm" + ], "dev": true, - "engines": { - "node": ">= 0.6" - } + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", + "cpu": [ + "arm64" + ], "dev": true, - "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ - "!win32" + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", + "cpu": [ + "x64" ], - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", + "cpu": [ + "x64" + ], "dev": true, - "engines": { - "node": ">= 6.13.0" - } + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/node-gyp-build": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", + "cpu": [ + "arm" + ], "dev": true, + "license": "MIT", "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } + "os": [ + "linux" + ] }, - "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/node-gyp/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/normalize-package-data": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", + "cpu": [ + "arm64" + ], "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", + "cpu": [ + "x64" + ], "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "node_modules/@schematics/angular": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.8.tgz", + "integrity": "sha512-ytgClbMPn+i+w1S3QukR/Vdge+sfU9aX49ao+XRwoWdOssHUjmVjQcCEdzu0ucSrNPZnhm34bdDPzADLhln60w==", "dev": true, + "license": "MIT", "dependencies": { - "npm-normalize-package-bin": "^3.0.0" + "@angular-devkit/core": "19.1.8", + "@angular-devkit/schematics": "19.1.8", + "jsonc-parser": "3.3.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "node_modules/@sigstore/bundle": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", + "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "semver": "^7.1.1" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "node_modules/@sigstore/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", + "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-package-arg": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "node_modules/@sigstore/protobuf-specs": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz", + "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==", "dev": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-packlist": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.0.tgz", - "integrity": "sha512-ErAGFB5kJUciPy1mmx/C2YFbvxoJ0QJ9uwkCZOeR6CqLLISPZBOiFModAbSXnjjlwW5lOhuhXva+fURsSGJqyw==", + "node_modules/@sigstore/sign": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", + "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "ignore-walk": "^6.0.0" + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-pick-manifest": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", - "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", + "node_modules/@sigstore/tuf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.0.tgz", + "integrity": "sha512-suVMQEA+sKdOz5hwP9qNcEjX6B45R+hFFr4LAWzbRc5O+U2IInwvay/bpG5a4s+qR35P/JK/PiKiRGjfuLy1IA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" + "@sigstore/protobuf-specs": "^0.4.0", + "tuf-js": "^3.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-registry-fetch": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz", - "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==", + "node_modules/@sigstore/verify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.0.tgz", + "integrity": "sha512-kAAM06ca4CzhvjIZdONAL9+MLppW3K48wOFy1TbuaWFW/OMfl8JuTgW0Bm02JB1WJGT/ET2eqav0KTEKmxqkIA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^3.0.0" + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "dev": true, - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, + "license": "MIT", "engines": { "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/@tufjs/models": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", + "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "license": "MIT" }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "node_modules/@types/node": { + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "undici-types": "~6.20.0" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=14.21.3" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "license": "BSD-2-Clause" }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/abbrev": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", + "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, + "license": "ISC", "engines": { - "node": ">= 0.8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 14" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "wrappy": "1" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, + "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "ajv": "^8.0.0" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "ajv": "^8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "type-fest": "^0.21.3" }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/openurl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", - "dev": true - }, - "node_modules/opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/opn/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/ora/node_modules/ansi-styles": { + "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8754,3453 +3080,3634 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/beasties": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz", + "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^9.1.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=14.0.0" } }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, "engines": { "node": ">=8" } }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=8" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", "dev": true, + "license": "ISC", "dependencies": { - "p-try": "^2.0.0" + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/cacache/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" + "license": "ISC" + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "node_modules/cacache/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, + "license": "ISC", "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/p-retry/node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "node_modules/cacache/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">= 4" + "node": ">=18" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/caniuse-lite": { + "version": "1.0.30001700", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", + "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", "dev": true, - "engines": { - "node": ">=6" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" }, - "node_modules/pacote": { - "version": "17.0.4", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.4.tgz", - "integrity": "sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^7.0.0", - "cacache": "^18.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^7.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^2.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, + "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=6" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, + "license": "MIT", "dependencies": { - "entities": "^4.4.0" + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5-html-rewriting-stream": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", - "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, - "dependencies": { - "entities": "^4.3.0", - "parse5": "^7.0.0", - "parse5-sax-parser": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "license": "ISC", + "engines": { + "node": ">= 12" } }, - "node_modules/parse5-sax-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", - "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "license": "ISC", "dependencies": { - "parse5": "^7.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "engines": { + "node": ">=12" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, + "license": "MIT", "engines": { - "node": "14 || >=16.14" + "node": ">=0.8" } }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "license": "MIT" }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/piscina": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.1.0.tgz", - "integrity": "sha512-sjbLMi3sokkie+qmtZpkfMCUJTpbxJm/wvaPzU28vmYSsTSW8xk9JcFUsbqGJdtPpIQ9tuj+iDcTtgZjwnOSig==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { - "eventemitter-asyncresource": "^1.0.0", - "hdr-histogram-js": "^2.0.1", - "hdr-histogram-percentiles-obj": "^3.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "optionalDependencies": { - "nice-napi": "^1.0.2" + "engines": { + "node": ">= 8" } }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { - "find-up": "^6.3.0" + "isexe": "^2.0.0" }, - "engines": { - "node": ">=14.16" + "bin": { + "node-which": "bin/node-which" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 8" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, + "license": "BSD-2-Clause", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { - "yocto-queue": "^1.0.0" + "ms": "^2.1.3" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "clone": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, + "license": "Apache-2.0", + "optional": true, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" } }, - "node_modules/portscanner": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", - "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, + "license": "MIT", "dependencies": { - "async": "^2.6.0", - "is-number-like": "^1.0.3" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, - "engines": { - "node": ">=0.4", - "npm": ">=1.0.0" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, { "type": "github", - "url": "https://github.com/sponsors/ai" + "url": "https://github.com/sponsors/fb55" } ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } + "license": "BSD-2-Clause" }, - "node_modules/postcss-loader": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", - "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "cosmiconfig": "^8.2.0", - "jiti": "^1.18.2", - "semver": "^7.3.8" + "domelementtype": "^2.3.0" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.102", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz", + "integrity": "sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "iconv-lite": "^0.6.2" } }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "postcss-selector-parser": "^6.0.4" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=0.10.0" } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, + "license": "BSD-2-Clause", "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=0.12" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true + "license": "MIT" }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">=6" } }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true, - "engines": { - "node": ">= 0.10" - } + "license": "MIT" }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "node_modules/exponential-backoff": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true, - "optional": true + "license": "Apache-2.0" }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { - "side-channel": "^1.0.4" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.6.0" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "url": "https://github.com/sponsors/fastify" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "opencollective", + "url": "https://opencollective.com/fastify" } - ] + ], + "license": "BSD-3-Clause" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/fastq": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, + "license": "ISC", "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" + "reusify": "^1.0.4" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "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, + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/read-package-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", - "integrity": "sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==", + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, + "license": "ISC", "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, + "license": "ISC", "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "minipass": "^7.0.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "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, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=6.9.0" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, + "license": "ISC", "engines": { - "node": ">=8.10.0" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { - "@babel/runtime": "^7.8.4" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "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, + "license": "ISC", "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } + "license": "BSD-2-Clause" }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "ISC" }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "function-bind": "^1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "node_modules/hosted-git-info": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", + "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", "dev": true, + "license": "ISC", "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">=12" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/resolve-url-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, - "node_modules/resolve-url-loader/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "BSD-2-Clause" }, - "node_modules/resp-modifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", - "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^2.2.0", - "minimatch": "^3.0.2" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 14" } }, - "node_modules/resp-modifier/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/resp-modifier/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/resp-modifier/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore-walk": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", + "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "minimatch": "^9.0.0" }, "engines": { - "node": "*" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/resp-modifier/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/immutable": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, + "license": "MIT" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.8.19" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", "dev": true, + "license": "ISC", "engines": { - "node": ">= 4" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 12" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "hasown": "^2.0.2" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "is-extglob": "^2.1.1" }, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, + "license": "MIT", "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=8" } }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "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, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", - "dev": true - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" + "node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } }, - "node_modules/sass": { - "version": "1.69.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", - "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=14.0.0" + "node": ">=10" } }, - "node_modules/sass-loader": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", - "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 14.15.0" + "@isaacs/cliui": "^8.0.2" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" + "url": "https://github.com/sponsors/isaacs" }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/sass/node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", - "dev": true + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" }, - "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true, - "optional": true + "license": "MIT" }, - "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=6" } }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", "dev": true, - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", "bin": { - "semver": "bin/semver.js" + "json5": "lib/cli.js" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/listr2": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", + "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=10" + "node": ">=18.0.0" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/lmdb": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.2.tgz", + "integrity": "sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g==", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "ms": "2.0.0" + "msgpackr": "^1.11.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.5.3", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.2.2", + "@lmdb/lmdb-darwin-x64": "3.2.2", + "@lmdb/lmdb-linux-arm": "3.2.2", + "@lmdb/lmdb-linux-arm64": "3.2.2", + "@lmdb/lmdb-linux-x64": "3.2.2", + "@lmdb/lmdb-win32-x64": "3.2.2" } }, - "node_modules/send/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, + "license": "MIT", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/send/node_modules/mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, - "bin": { - "mime": "cli.js" + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/send/node_modules/statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", "dev": true, + "license": "MIT", "dependencies": { - "randombytes": "^2.1.0" + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, + "license": "MIT", "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" + "yallist": "^3.0.2" } }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, - "engines": { - "node": ">= 0.6" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "node_modules/make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", "dev": true, + "license": "ISC", "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", - "dev": true - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 8" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "kind-of": "^6.0.2" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/sigstore": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.1.0.tgz", - "integrity": "sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw==", + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, + "license": "ISC", "dependencies": { - "@sigstore/bundle": "^2.1.0", - "@sigstore/protobuf-specs": "^0.2.1", - "@sigstore/sign": "^2.1.0", - "@sigstore/tuf": "^2.1.0" + "minipass": "^7.0.3" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/slash": { + "node_modules/minipass-fetch": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.0.tgz", + "integrity": "sha512-2v6aXUXwLP1Epd/gc32HAMIWoczx+fZwEPRHm/VwtrJzRGwR1qGZXEYV3Zp8ZjjbwaZhMrM6uHV4KVkk+XCc2w==", "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, "engines": { - "node": ">=12" + "node": "^18.17.0 || >=20.5.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">= 8" } }, - "node_modules/socket.io": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", - "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.5.2", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" + "yallist": "^4.0.0" }, "engines": { - "node": ">=10.2.0" + "node": ">=8" } }, - "node_modules/socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, - "dependencies": { - "ws": "~8.11.0" - } + "license": "ISC" }, - "node_modules/socket.io-client": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", - "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, + "license": "ISC", "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.5.2", - "socket.io-parser": "~4.2.4" + "minipass": "^3.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=8" } }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=8" } }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, + "license": "ISC", "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "node": ">=8" } }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "minipass": "^7.0.4", + "rimraf": "^5.0.5" }, "engines": { - "node": ">= 10" + "node": ">= 18" } }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "dependencies": { - "debug": "4" + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">= 6.0.0" + "node": ">=10" } }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "license": "MIT" + }, + "node_modules/msgpackr": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz", + "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==", + "dev": true, + "license": "MIT", + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" } }, - "node_modules/source-map-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", - "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "abab": "^2.0.6", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": ">= 14.15.0" + "node-gyp-build-optional-packages": "5.2.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" }, - "peerDependencies": { - "webpack": "^5.72.1" + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" } }, - "node_modules/source-map-loader/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true + "license": "MIT", + "optional": true }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/node-gyp": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.1.0.tgz", + "integrity": "sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ==", "dev": true, + "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "tar": "^7.4.3", + "which": "^5.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "dev": true - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" + "detect-libc": "^2.0.1" }, - "engines": { - "node": ">=6.0.0" + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" } }, - "node_modules/spdy-transport": { + "node_modules/node-gyp/node_modules/chownr": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "node_modules/node-gyp/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "node_modules/node-gyp/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, + "license": "ISC", "dependencies": { - "minipass": "^7.0.3" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", + "node_modules/node-gyp/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">= 0.6" + "node": ">=18" } }, - "node_modules/stream-throttle": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", - "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "dev": true, + "license": "ISC", "dependencies": { - "commander": "^2.2.0", - "limiter": "^1.0.5" + "abbrev": "^3.0.0" }, "bin": { - "throttleproxy": "bin/throttleproxy.js" + "nopt": "bin/nopt.js" }, "engines": { - "node": ">= 0.10.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/npm-bundled": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", + "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", "dev": true, + "license": "ISC", "dependencies": { - "safe-buffer": "~5.2.0" + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/npm-install-checks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz", + "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "semver": "^7.1.1" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", + "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-package-arg": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz", + "integrity": "sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==", "dev": true, + "license": "ISC", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/npm-packlist": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-9.0.0.tgz", + "integrity": "sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==", "dev": true, + "license": "ISC", "dependencies": { - "ansi-regex": "^5.0.1" + "ignore-walk": "^7.0.0" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/npm-pick-manifest": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", + "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", "dev": true, + "license": "ISC", "dependencies": { - "ansi-regex": "^5.0.1" + "npm-install-checks": "^7.1.0", + "npm-normalize-package-bin": "^4.0.0", + "npm-package-arg": "^12.0.0", + "semver": "^7.3.5" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/npm-registry-fetch": { + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", + "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^3.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^14.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^12.0.0", + "proc-log": "^5.0.0" + }, "engines": { - "node": ">=6" + "node": "^18.17.0 || >=20.5.0" } }, - "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==", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "has-flag": "^3.0.0" + "boolbase": "^1.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, "engines": { - "node": ">=0.10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "node_modules/ora/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">= 8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { "node": ">=8" } }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/ordered-binary": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", + "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==", + "dev": true, + "license": "MIT", + "optional": true }, - "node_modules/terser": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", - "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "node_modules/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, + "license": "MIT", "engines": { - "node": ">= 10.13.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pacote": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-20.0.0.tgz", + "integrity": "sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^9.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^3.0.0", + "ssri": "^12.0.0", + "tar": "^6.1.11" }, - "peerDependencies": { - "webpack": "^5.1.0" + "bin": { + "pacote": "bin/index.js" }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "entities": "^4.5.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" + "license": "MIT", + "dependencies": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" + "parse5": "^7.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "license": "MIT" }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "license": "ISC" }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, + "license": "MIT", "engines": { - "node": ">=0.6.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/piscina": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, - "engines": { - "node": ">=4" + "license": "MIT", + "optionalDependencies": { + "@napi-rs/nice": "^1.0.1" } }, - "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==", + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=8.0" + "node": "^10 || ^12 || >=14" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", "dev": true, - "engines": { - "node": ">=0.6" - } + "license": "MIT" }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, - "bin": { - "tree-kill": "cli.js" + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/tuf-js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.1.0.tgz", - "integrity": "sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA==", + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, + "license": "MIT", "dependencies": { - "@tufjs/models": "2.0.0", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.0" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/tuf-js/node_modules/make-fetch-happen": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">= 6" } }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "node": ">= 14.18.0" }, - "engines": { - "node": ">= 0.6" + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/typed-assert": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "license": "MIT", "engines": { - "node": ">=14.17" + "node": ">=0.10.0" } }, - "node_modules/ua-parser-js": { - "version": "1.0.36", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.36.tgz", - "integrity": "sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], + "license": "MIT", "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", - "dev": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, + "license": "MIT", "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 4" } }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", "dev": true, + "license": "ISC", "dependencies": { - "unique-slug": "^4.0.0" + "glob": "^10.3.7" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "node_modules/rollup": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4" + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", + "fsevents": "~2.3.2" } }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "engines": { - "node": ">= 4.0.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "consulting", + "url": "https://feross.org/support" } ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } + "license": "MIT" }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "license": "MIT" }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "node_modules/sass": { + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz", + "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==", "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, "engines": { - "node": ">= 0.4.0" + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { - "uuid": "dist/bin/uuid" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { - "node": ">= 0.8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/vite": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", - "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "node_modules/sigstore": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", + "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "license": "MIT", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], + "node_modules/socks": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, "engines": { - "node": ">=12" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, "engines": { - "node": ">=12" + "node": ">= 14" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "BSD-3-Clause", "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "license": "BSD-3-Clause", "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, "engines": { - "node": ">=12" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=0.10" } }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "ISC", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "node_modules/tar/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "node": ">= 8" } }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "node_modules/tar/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } + "license": "ISC" }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, + "license": "MIT", "dependencies": { - "defaults": "^1.0.3" + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" } }, - "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" + "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, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" }, "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } + "node": ">=8.0" } }, - "node_modules/webpack-dev-middleware": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", - "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tuf-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz", + "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==", "dev": true, + "license": "MIT", "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.12", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "@tufjs/models": "3.0.1", + "debug": "^4.3.6", + "make-fetch-happen": "^14.0.1" }, "engines": { - "node": ">= 14.15.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "license": "Apache-2.0", "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } + "node": ">=14.17" } }, - "node_modules/webpack-dev-server/node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^5.0.0" + }, "engines": { - "node": ">=0.8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", "dev": true, + "license": "ISC", "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, - "utf-8-validate": { - "optional": true + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "node_modules/validate-npm-package-name": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", + "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", "dev": true, + "license": "ISC", "engines": { - "node": ">=10.13.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/webpack-subresource-integrity": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", - "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "node_modules/vite": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, + "license": "MIT", "dependencies": { - "typed-assert": "^1.0.8" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">= 12" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", - "webpack": "^5.12.0" + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { - "html-webpack-plugin": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { "optional": true } } }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=10.13.0" } }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "license": "MIT", "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" + "defaults": "^1.0.3" } }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", "dev": true, - "engines": { - "node": ">=0.8.0" - } + "license": "MIT", + "optional": true }, "node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -12208,29 +6715,15 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -12246,6 +6739,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -12258,106 +6752,114 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" }, - "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=0.4.0" + "node": ">=8" } }, "node_modules/y18n": { @@ -12365,6 +6867,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -12373,13 +6876,15 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -12398,29 +6903,84 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, - "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12.20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/zone.js": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.0.tgz", - "integrity": "sha512-Sz0G0TjMuyApIcuTJeK742+xLLKEPjYtkdBEazBlYePHkICVp9DPKqI/4dJt3LCtQBd52sCxz23uAFJ2OJa6Ow==", - "dependencies": { - "tslib": "^2.3.0" - } + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz", + "integrity": "sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==", + "license": "MIT" } } } diff --git a/adev/shared-docs/pipeline/tutorials/common/package.json.template b/adev/shared-docs/pipeline/tutorials/common/package.json.template index 5ace0cd70b44..c75fe428919b 100644 --- a/adev/shared-docs/pipeline/tutorials/common/package.json.template +++ b/adev/shared-docs/pipeline/tutorials/common/package.json.template @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "NG_BUILD_PARALLEL_TS=0 ng serve", + "start": "ng serve", "build": "ng build", "watch": "ng build --watch --configuration development" }, @@ -15,12 +15,12 @@ "@angular/platform-browser": "^19.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", - "zone.js": "~0.14.0" + "zone.js": "~0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^19.0.0", + "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.3" } } diff --git a/adev/shared-docs/services/table-of-contents-loader.service.ts b/adev/shared-docs/services/table-of-contents-loader.service.ts index 40b76424ff6a..281cc1c5c6fa 100644 --- a/adev/shared-docs/services/table-of-contents-loader.service.ts +++ b/adev/shared-docs/services/table-of-contents-loader.service.ts @@ -49,9 +49,7 @@ export class TableOfContentsLoader { const updatedTopValues = new Map(); for (const heading of headings) { - const parentTop = heading.parentElement?.offsetTop ?? 0; - const top = Math.floor(parentTop + heading.offsetTop - this.toleranceThreshold); - updatedTopValues.set(heading.id, top); + updatedTopValues.set(heading.id, this.calculateTop(heading)); } this.tableOfContentItems.update((oldItems) => { diff --git a/adev/shared-docs/styles/_api-item-label.scss b/adev/shared-docs/styles/_api-item-label.scss index 9373a8c4025f..23ce9df532e2 100644 --- a/adev/shared-docs/styles/_api-item-label.scss +++ b/adev/shared-docs/styles/_api-item-label.scss @@ -17,6 +17,7 @@ &:not(.full) { height: 22px; width: 22px; + flex: 0 0 22px; } &.full { diff --git a/adev/shared-docs/styles/_reference.scss b/adev/shared-docs/styles/_reference.scss new file mode 100644 index 000000000000..c1e9d4f34522 --- /dev/null +++ b/adev/shared-docs/styles/_reference.scss @@ -0,0 +1,404 @@ +@use './anchor' as anchor; + +/* Common styles for the API & CLI references */ +@mixin reference-common() { + .docs-code { + pre { + margin-block: 0; + } + } + + .docs-reference-header { + // deprecated markers beside header + & ~ .docs-deprecated { + margin-block-start: 0.5rem; + } + + & > p { + color: var(--secondary-contrast); + margin-block-start: 0; + margin-block-end: 1.5rem; + } + + .docs-reference-title { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding-block-end: 0; + gap: 0.5rem; + + > div { + margin-block: 0.67em; + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.5rem; + + h1 { + margin-block: 0; + } + } + + a { + fill: var(--quinary-contrast); + transition: fill 0.3s ease; + + &:hover { + fill: var(--primary-contrast); + } + } + } + + .docs-reference-category { + color: var(--gray-400); + font-size: 0.875rem; + font-weight: 500; + line-height: 1.4rem; + letter-spacing: -0.00875rem; + } + + .docs-code { + margin-block-end: 1.5rem; + } + } + + .docs-reference-section-heading { + padding-block-start: 3rem; + + a { + @include anchor.docs-anchor(); + color: inherit; + } + } + + .docs-reference-members { + box-sizing: border-box; + width: 100%; + display: flex; + flex-direction: column; + gap: 20px; + + &:not(:first-child) { + margin-top: 1rem; + } + + .docs-reference-member-card { + border: 1px solid var(--senary-contrast); + border-radius: 0.25rem; + position: relative; + transition: border 0.3s ease; + + &::before { + content: ''; + inset: -1px; + position: absolute; + background: transparent; + border-radius: 0.35rem; + z-index: 0; + } + + &.highlighted { + box-shadow: 10px 4px 40px 0 rgba(0, 0, 0, 0.01); + + &::before { + background: var(--red-to-pink-to-purple-horizontal-gradient); + } + } + + > p { + padding-inline: 1.25rem; + margin-block-end: 0; + } + + .docs-reference-card-header { + display: flex; + align-items: center; + justify-content: space-between; + border-radius: 0.25rem 0.25rem 0 0; + background-color: var(--octonary-contrast); + position: relative; + z-index: 10; + padding: 0.7rem 1rem; + gap: 0.5rem; + flex-wrap: wrap; + transition: + background-color 0.3s ease, + border 0.3s ease; + + &:focus { + outline: none; + } + + &:has(+ .docs-reference-card-body:empty) { + border-radius: 0.25rem; + } + + code { + font-size: 0.875rem; + + &:has(pre) { + padding: 0; + } + + &:not(pre *) { + padding: 0 0.3rem; + } + } + + pre { + margin: 0; + + /* Do we have a better alternative ? */ + overflow: auto; + } + + h3 { + display: inline-block; + font-family: var(--code-font); + font-size: 1rem; + letter-spacing: -0.025rem; + margin: 0; + } + + span { + font-size: 0.875rem; + } + } + + .docs-reference-card-body { + padding: 0.25rem 1.25rem; + background: var(--septenary-contrast); + transition: background-color 0.3s ease; + color: var(--quaternary-contrast); + border-radius: 0 0 0.25rem 0.25rem; + position: relative; + z-index: 10; + + &:empty { + display: none; + } + + &:first-child { + border-radius: 0.25rem; + } + + hr { + margin-block: 2rem; + } + + .docs-code { + margin-block-end: 1rem; + } + + .docs-deprecation-message { + border-block-end: 1px solid var(--senary-contrast); + + .docs-deprecated { + color: var(--page-background); + background-color: var(--quaternary-contrast); + width: max-content; + border-radius: 0.25rem; + padding: 0.1rem 0.25rem; + margin-block-start: 1rem; + } + } + } + } + } +} + +/* API reference styles */ +@mixin api-reference { + // API section styles + .docs-reference-api-section { + .docs-code { + box-sizing: border-box; + width: 100%; + overflow: hidden; + padding: 0; + + button { + transition: background-color 0.3s ease; + + &.shiki-ln-line-highlighted { + background-color: var(--senary-contrast); + } + + &:hover { + background-color: var(--septenary-contrast); + } + + &:focus { + background-color: var(--senary-contrast); + + span { + background-color: inherit; + } + } + } + + // Hide copy source code button + button[docs-copy-source-code] { + display: none; + } + } + + code { + margin-block: 0; + } + + pre { + white-space: pre; + overflow-x: auto; + margin: 0; + } + } + + // "API member card"-specific styles + .docs-reference-member-card { + .docs-reference-card-item { + // When it's not the only card ... + &:has(~ .docs-reference-card-item) { + border: 1px solid var(--senary-contrast); + margin-block: 1rem; + border-radius: 0.25rem; + padding-inline: 1rem; + } + + // & the last card + &:last-child:not(:first-of-type) { + border: 1px solid var(--senary-contrast); + margin-block: 1rem; + border-radius: 0.25rem; + padding-inline: 1rem; + } + + span { + display: inline-block; + font-size: 0.875rem; + } + + code { + font-size: 0.875rem; + } + + .docs-function-definition:has(*) { + border-block-end: 1px solid var(--senary-contrast); + } + + .docs-param-group { + margin-block-start: 1rem; + + // If it's the only param group... + &:not(:has(~ .docs-param-group)) { + margin-block: 1rem; + } + + .docs-param-name { + color: var(--vivid-pink); + font-family: var(--code-font); + margin-inline-end: 0.25rem; + + &::after { + content: ':'; + } + } + + .docs-parameter-description { + p:first-child { + margin-block-start: 0; + } + } + } + + .docs-param-keyword { + color: var(--primary-contrast); + font-family: var(--code-font); + margin-inline-end: 0.5rem; + } + + .docs-return-type { + padding-block: 1rem; + + // & does not follow a function definition + &:not(.docs-function-definition + .docs-return-type) { + border-block-start: 1px solid var(--senary-contrast); + } + } + } + } +} + +/* CLI reference styles */ +@mixin cli-reference { + // CLI TOC + .docs-reference-cli-toc { + margin-bottom: 1rem; + + .shiki-ln-line-argument, + .shiki-ln-line-option { + padding: 0.1rem 0.2rem 0.2rem; + margin-inline: 0.1rem; + color: var(--quaternary-contrast); + background: transparent; + border-radius: 0.25rem; + position: relative; + transition: + color 0.3s ease, + background 0.3s ease, + border 0.3s ease; + + &:hover { + color: var(--primary-contrast); + background: var(--septenary-contrast); + } + + &.shiki-ln-line-highlighted { + color: var(--primary-contrast); + background: var(--senary-contrast); + } + } + + .shiki-ln-line-argument { + margin-inline-start: 0.2rem; + } + } + + .docs-reference-members { + .docs-reference-section-heading { + margin: 0; + } + + // "CLI member card"-specific styles + .docs-reference-member-card { + .docs-ref-content { + padding: 1rem 0; + + &:not(:first-child) { + border-block-start: 1px solid var(--senary-contrast); + } + + .docs-reference-type-and-default { + width: 4.375rem; + flex-shrink: 0; + + span { + display: block; + font-size: 0.875rem; + margin-block-end: 0.2rem; + white-space: nowrap; + + &:not(:first-child) { + margin-block-start: 1rem; + } + } + + code { + font-size: 0.775rem; + } + } + } + } + } +} diff --git a/adev/shared-docs/styles/docs/_card.scss b/adev/shared-docs/styles/docs/_card.scss index deae64fe56d8..0286ec99afee 100644 --- a/adev/shared-docs/styles/docs/_card.scss +++ b/adev/shared-docs/styles/docs/_card.scss @@ -21,7 +21,9 @@ border: 1px solid var(--senary-contrast); border-radius: 0.25rem; overflow: hidden; - transition: border-color 0.3s ease, background-color 0.3s ease; + transition: + border-color 0.3s ease, + background-color 0.3s ease; p:first-of-type { margin-block-start: 1.5rem; @@ -54,6 +56,7 @@ flex-direction: column; justify-content: space-between; border-block-start: 1px solid var(--senary-contrast); + h3 { margin-bottom: 0; margin-block-start: 1rem; @@ -79,7 +82,6 @@ color: transparent; font-size: 0.875rem; margin-block: 0; - transition: background-position 1.8s ease-out; background-size: 200% 100%; background-position: 100% 0%; @@ -87,10 +89,11 @@ } &:hover { + background: var(--subtle-purple); + span { background-position: 0% 0%; } - background: var(--subtle-purple); } } diff --git a/adev/shared-docs/testing/testing-helper.ts b/adev/shared-docs/testing/testing-helper.ts index d1cc158599bb..9e57552b0695 100644 --- a/adev/shared-docs/testing/testing-helper.ts +++ b/adev/shared-docs/testing/testing-helper.ts @@ -144,12 +144,16 @@ class FakeFileSystemAPI implements FileSystemAPI { ): Promise[]>; readdir( path: unknown, - options?: unknown, + options?: {encoding?: string | null | undefined; withFileTypes?: boolean} | string | null, ): | Promise | Promise | Promise[]> | Promise[]> { + if (typeof options === 'object' && options?.withFileTypes === true) { + return Promise.resolve([{name: 'fake-file', isFile: () => true, isDirectory: () => false}]); + } + return Promise.resolve(['/fake-dirname']); } diff --git a/adev/shared-docs/utils/BUILD.bazel b/adev/shared-docs/utils/BUILD.bazel index 133d2d0b348f..3d277f55f488 100644 --- a/adev/shared-docs/utils/BUILD.bazel +++ b/adev/shared-docs/utils/BUILD.bazel @@ -29,8 +29,6 @@ ts_library( "//adev/shared-docs/providers", "//packages/core", "//packages/router", - "@npm//@types/node", - "@npm//@webcontainer/api", "@npm//fflate", ], ) diff --git a/adev/shared-docs/utils/filesystem.utils.ts b/adev/shared-docs/utils/filesystem.utils.ts index f4e13381fac8..788e56bc456f 100644 --- a/adev/shared-docs/utils/filesystem.utils.ts +++ b/adev/shared-docs/utils/filesystem.utils.ts @@ -41,7 +41,7 @@ interface FileSystemAPI { export const checkFilesInDirectory = async ( dir: string, fs: FileSystemAPI, - filterFoldersPredicate: (path?: string) => boolean = () => true, + filterFromRootPredicate: ((path: string) => boolean) | null, files: FileAndContent[] = [], ) => { const entries = (await fs.readdir(dir, {withFileTypes: true})) ?? []; @@ -49,11 +49,15 @@ export const checkFilesInDirectory = async ( for (const entry of entries) { const fullPath = normalizePath(`${dir}/${entry.name}`); + if (filterFromRootPredicate && !filterFromRootPredicate?.(entry.name)) { + continue; + } + if (entry.isFile()) { const content = await fs.readFile(fullPath, 'utf-8'); files.push({content, path: fullPath}); - } else if (entry.isDirectory() && filterFoldersPredicate(entry.name)) { - await checkFilesInDirectory(fullPath, fs, filterFoldersPredicate, files); + } else if (entry.isDirectory()) { + await checkFilesInDirectory(fullPath, fs, null, files); } } diff --git a/adev/src/app/app-scroller.ts b/adev/src/app/app-scroller.ts index 69a9df0bf3c1..a7b8eb8cf813 100644 --- a/adev/src/app/app-scroller.ts +++ b/adev/src/app/app-scroller.ts @@ -23,10 +23,11 @@ export class AppScroller { private readonly viewportScroller = inject(ViewportScroller); private readonly appRef = inject(ApplicationRef); private readonly injector = inject(EnvironmentInjector); - disableScrolling = false; + private _lastScrollEvent?: Scroll; private canScroll = false; private cancelScroll?: () => void; + get lastScrollEvent(): Scroll | undefined { return this._lastScrollEvent; } @@ -41,7 +42,6 @@ export class AppScroller { this.canScroll = true; this._lastScrollEvent = e; }), - filter(() => !this.disableScrolling), filter(() => { const info = this.router.lastSuccessfulNavigation?.extras.info as Record< 'disableScrolling', diff --git a/adev/src/app/app.config.server.ts b/adev/src/app/app.config.server.ts index ae2b06d7ad25..7ea5cd3c8b75 100644 --- a/adev/src/app/app.config.server.ts +++ b/adev/src/app/app.config.server.ts @@ -8,13 +8,13 @@ import {mergeApplicationConfig, ApplicationConfig} from '@angular/core'; import {provideServerRendering} from '@angular/platform-server'; -import {provideServerRoutesConfig, RenderMode} from '@angular/ssr'; +import {provideServerRouting, RenderMode} from '@angular/ssr'; import {appConfig} from './app.config'; const serverConfig: ApplicationConfig = { providers: [ provideServerRendering(), - provideServerRoutesConfig([{path: '**', renderMode: RenderMode.Prerender}]), + provideServerRouting([{path: '**', renderMode: RenderMode.Prerender}]), ], }; diff --git a/adev/src/app/core/constants/links.ts b/adev/src/app/core/constants/links.ts index fb7d17d7fb9f..7ccb78008cc0 100644 --- a/adev/src/app/core/constants/links.ts +++ b/adev/src/app/core/constants/links.ts @@ -11,3 +11,4 @@ export const X = 'https://x.com/angular'; export const MEDIUM = 'https://blog.angular.dev'; export const YOUTUBE = 'https://www.youtube.com/angular'; export const DISCORD = 'https://discord.gg/angular'; +export const BLUESKY = 'https://bsky.app/profile/angular.dev'; diff --git a/adev/src/app/core/constants/versions.ts b/adev/src/app/core/constants/versions.ts index fcb60cbd7702..1c62311727d2 100644 --- a/adev/src/app/core/constants/versions.ts +++ b/adev/src/app/core/constants/versions.ts @@ -9,6 +9,10 @@ export const VERSIONS_CONFIG = { aDevVersionsLinkPattern: 'https://{{prefix}}{{version}}angular.dev', aioVersions: [ + { + version: 'v18', + url: 'https://v18.angular.dev/overview', + }, { version: 'v17', url: 'https://v17.angular.io/docs', diff --git a/adev/src/app/core/layout/footer/footer.component.html b/adev/src/app/core/layout/footer/footer.component.html index d6ad9ba8e20e..738e82b981f5 100644 --- a/adev/src/app/core/layout/footer/footer.component.html +++ b/adev/src/app/core/layout/footer/footer.component.html @@ -9,6 +9,9 @@

Social Media

  • X (formerly Twitter)
  • +
  • + Bluesky +
  • YouTube
  • diff --git a/adev/src/app/core/layout/footer/footer.component.ts b/adev/src/app/core/layout/footer/footer.component.ts index b10733544eb3..28da2922613b 100644 --- a/adev/src/app/core/layout/footer/footer.component.ts +++ b/adev/src/app/core/layout/footer/footer.component.ts @@ -9,7 +9,7 @@ import {ChangeDetectionStrategy, Component} from '@angular/core'; import {ExternalLink} from '@angular/docs'; import {RouterLink} from '@angular/router'; -import {GITHUB, X, MEDIUM, YOUTUBE} from './../../constants/links'; +import {GITHUB, X, MEDIUM, YOUTUBE, BLUESKY} from './../../constants/links'; @Component({ selector: 'footer[adev-footer]', @@ -23,4 +23,5 @@ export class Footer { readonly X = X; readonly YOUTUBE = YOUTUBE; readonly MEDIUM = MEDIUM; + readonly BLUESKY = BLUESKY; } diff --git a/adev/src/app/core/layout/navigation/navigation.component.html b/adev/src/app/core/layout/navigation/navigation.component.html index 2680ae8330c4..080b38299f40 100644 --- a/adev/src/app/core/layout/navigation/navigation.component.html +++ b/adev/src/app/core/layout/navigation/navigation.component.html @@ -346,6 +346,27 @@ +
  • + + + + + + +
  • { }); it('should contain correct number of Angular Docs versions', () => { - // Note: From v2 to v17 (inclusive), there were no v3 - const expectedAioDocsVersionsCount = 15; + // Note: From v2 to v18 (inclusive), there were no v3 + const expectedAioDocsVersionsCount = 16; // Last stable version and next const expectedRecentDocsVersionCount = 2; diff --git a/adev/src/app/editor/code-editor/code-editor.component.spec.ts b/adev/src/app/editor/code-editor/code-editor.component.spec.ts index a124a623bced..55922866192e 100644 --- a/adev/src/app/editor/code-editor/code-editor.component.spec.ts +++ b/adev/src/app/editor/code-editor/code-editor.component.spec.ts @@ -148,6 +148,9 @@ describe('CodeEditor', () => { }); it('should focused on a new tab when adding a new file', async () => { + // Wait until the asynchronous injection stuff is done. + await fixture.whenStable(); + const button = fixture.debugElement.query(By.css('button.adev-add-file')).nativeElement; button.click(); diff --git a/adev/src/app/editor/code-editor/code-editor.component.ts b/adev/src/app/editor/code-editor/code-editor.component.ts index f9c02a305e80..f360e9d65191 100644 --- a/adev/src/app/editor/code-editor/code-editor.component.ts +++ b/adev/src/app/editor/code-editor/code-editor.component.ts @@ -13,6 +13,7 @@ import { Component, DestroyRef, ElementRef, + EnvironmentInjector, OnDestroy, ViewChild, inject, @@ -21,10 +22,9 @@ import { import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; import {MatTabGroup, MatTabsModule} from '@angular/material/tabs'; import {Title} from '@angular/platform-browser'; -import {debounceTime, map} from 'rxjs'; +import {debounceTime, from, map, switchMap} from 'rxjs'; import {TerminalType} from '../terminal/terminal-handler.service'; -import {EmbeddedTutorialManager} from '../embedded-tutorial-manager.service'; import {CodeMirrorEditor} from './code-mirror-editor.service'; import {DiagnosticWithLocation, DiagnosticsState} from './services/diagnostics-state.service'; @@ -34,6 +34,7 @@ import {ClickOutside, IconComponent} from '@angular/docs'; import {CdkMenu, CdkMenuItem, CdkMenuTrigger} from '@angular/cdk/menu'; import {IDXLauncher} from '../idx-launcher.service'; import {MatTooltip} from '@angular/material/tooltip'; +import {injectEmbeddedTutorialManager} from '../inject-embedded-tutorial-manager'; export const REQUIRED_FILES = new Set([ 'src/main.ts', @@ -91,7 +92,7 @@ export class CodeEditor implements AfterViewInit, OnDestroy { private readonly idxLauncher = inject(IDXLauncher); private readonly title = inject(Title); private readonly location = inject(Location); - private readonly embeddedTutorialManager = inject(EmbeddedTutorialManager); + private readonly environmentInjector = inject(EnvironmentInjector); private readonly errors$ = this.diagnosticsState.diagnostics$.pipe( // Display errors one second after code update @@ -142,7 +143,8 @@ export class CodeEditor implements AfterViewInit, OnDestroy { } async downloadCurrentCodeEditorState(): Promise { - const name = this.embeddedTutorialManager.tutorialId(); + const embeddedTutorialManager = await injectEmbeddedTutorialManager(this.environmentInjector); + const name = embeddedTutorialManager.tutorialId(); await this.downloadManager.downloadCurrentStateOfTheSolution(name); } @@ -236,8 +238,14 @@ export class CodeEditor implements AfterViewInit, OnDestroy { } private setSelectedTabOnTutorialChange() { - this.embeddedTutorialManager.tutorialChanged$ - .pipe(takeUntilDestroyed(this.destroyRef)) + // Using `from` to prevent injecting the embedded tutorial manager once the + // injector is destroyed (this may happen in unit tests when the test ends + // before `injectAsync` runs, causing an error). + from(injectEmbeddedTutorialManager(this.environmentInjector)) + .pipe( + switchMap((embeddedTutorialManager) => embeddedTutorialManager.tutorialChanged$), + takeUntilDestroyed(this.destroyRef), + ) .subscribe(() => { // selected file on project change is always the first this.matTabGroup.selectedIndex = 0; diff --git a/adev/src/app/editor/download-manager.service.ts b/adev/src/app/editor/download-manager.service.ts index 7bebe2c2d992..32fdc0c3bcd7 100644 --- a/adev/src/app/editor/download-manager.service.ts +++ b/adev/src/app/editor/download-manager.service.ts @@ -9,7 +9,8 @@ import {DOCUMENT, isPlatformBrowser} from '@angular/common'; import {EnvironmentInjector, Injectable, PLATFORM_ID, inject} from '@angular/core'; import {generateZip} from '@angular/docs'; -import {injectAsync} from '../core/services/inject-async'; + +import {injectNodeRuntimeSandbox} from './inject-node-runtime-sandbox'; @Injectable({ providedIn: 'root', @@ -23,9 +24,7 @@ export class DownloadManager { * Generate ZIP with the current state of the solution in the EmbeddedEditor */ async downloadCurrentStateOfTheSolution(name: string) { - const nodeRuntimeSandbox = await injectAsync(this.environmentInjector, () => - import('./node-runtime-sandbox.service').then((c) => c.NodeRuntimeSandbox), - ); + const nodeRuntimeSandbox = await injectNodeRuntimeSandbox(this.environmentInjector); const files = await nodeRuntimeSandbox.getSolutionFiles(); const content = await generateZip(files); diff --git a/adev/src/app/editor/editor-ui-state.service.ts b/adev/src/app/editor/editor-ui-state.service.ts index b1b3ea7af831..de0dafd2c062 100644 --- a/adev/src/app/editor/editor-ui-state.service.ts +++ b/adev/src/app/editor/editor-ui-state.service.ts @@ -6,13 +6,13 @@ * found in the LICENSE file at https://angular.dev/license */ -import {DestroyRef, inject, Injectable, signal} from '@angular/core'; +import {EnvironmentInjector, inject, Injectable, signal} from '@angular/core'; import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; -import {filter, map, Subject} from 'rxjs'; +import {filter, from, map, Subject, switchMap} from 'rxjs'; import {TutorialMetadata, TutorialType} from '@angular/docs'; -import {EmbeddedTutorialManager} from './embedded-tutorial-manager.service'; +import {injectEmbeddedTutorialManager} from './inject-embedded-tutorial-manager'; export interface EditorUiStateConfig { displayOnlyInteractiveTerminal: boolean; @@ -23,8 +23,7 @@ export const DEFAULT_EDITOR_UI_STATE: EditorUiStateConfig = { @Injectable() export class EditorUiState { - private readonly embeddedTutorialManager = inject(EmbeddedTutorialManager); - private readonly destroyRef = inject(DestroyRef); + private readonly environmentInjector = inject(EnvironmentInjector); private readonly stateChanged = new Subject(); @@ -41,11 +40,13 @@ export class EditorUiState { } private handleTutorialChange() { - this.embeddedTutorialManager.tutorialChanged$ + from(injectEmbeddedTutorialManager(this.environmentInjector)) .pipe( - map(() => this.embeddedTutorialManager.type()), + switchMap((embeddedTutorialManager) => + embeddedTutorialManager.tutorialChanged$.pipe(map(() => embeddedTutorialManager.type())), + ), filter((tutorialType): tutorialType is TutorialMetadata['type'] => Boolean(tutorialType)), - takeUntilDestroyed(this.destroyRef), + takeUntilDestroyed(), ) .subscribe((tutorialType) => { if (tutorialType === TutorialType.CLI) { diff --git a/adev/src/app/editor/idx-launcher.service.ts b/adev/src/app/editor/idx-launcher.service.ts index 26a1c8088469..2c78a460b987 100644 --- a/adev/src/app/editor/idx-launcher.service.ts +++ b/adev/src/app/editor/idx-launcher.service.ts @@ -7,9 +7,10 @@ */ import {EnvironmentInjector, Injectable, inject} from '@angular/core'; -import {injectAsync} from '../core/services/inject-async'; import * as IDX from 'open-in-idx'; +import {injectNodeRuntimeSandbox} from './inject-node-runtime-sandbox'; + @Injectable({ providedIn: 'root', }) @@ -17,9 +18,7 @@ export class IDXLauncher { private readonly environmentInjector = inject(EnvironmentInjector); async openCurrentSolutionInIDX(): Promise { - const nodeRuntimeSandbox = await injectAsync(this.environmentInjector, () => - import('./node-runtime-sandbox.service').then((c) => c.NodeRuntimeSandbox), - ); + const nodeRuntimeSandbox = await injectNodeRuntimeSandbox(this.environmentInjector); const runtimeFiles = await nodeRuntimeSandbox.getSolutionFiles(); const workspaceFiles: Record = {}; diff --git a/adev/src/app/editor/index.ts b/adev/src/app/editor/index.ts index 84428e2231d2..9b82493ae77e 100644 --- a/adev/src/app/editor/index.ts +++ b/adev/src/app/editor/index.ts @@ -9,7 +9,8 @@ export {EmbeddedTutorialManager} from './embedded-tutorial-manager.service'; export {LoadingStep} from './enums/loading-steps'; export {NodeRuntimeState} from './node-runtime-state.service'; - -export {NodeRuntimeSandbox} from './node-runtime-sandbox.service'; +export {injectNodeRuntimeSandbox} from './inject-node-runtime-sandbox'; export {EmbeddedEditor, EMBEDDED_EDITOR_SELECTOR} from './embedded-editor.component'; + +export {injectEmbeddedTutorialManager} from './inject-embedded-tutorial-manager'; diff --git a/adev/src/app/editor/inject-embedded-tutorial-manager.ts b/adev/src/app/editor/inject-embedded-tutorial-manager.ts new file mode 100644 index 000000000000..d1f79d19b411 --- /dev/null +++ b/adev/src/app/editor/inject-embedded-tutorial-manager.ts @@ -0,0 +1,17 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {EnvironmentInjector} from '@angular/core'; + +import {injectAsync} from '../core/services/inject-async'; + +export function injectEmbeddedTutorialManager(injector: EnvironmentInjector) { + return injectAsync(injector, () => + import('./embedded-tutorial-manager.service').then((c) => c.EmbeddedTutorialManager), + ); +} diff --git a/adev/src/app/editor/inject-node-runtime-sandbox.ts b/adev/src/app/editor/inject-node-runtime-sandbox.ts new file mode 100644 index 000000000000..aafdcf4dd7d9 --- /dev/null +++ b/adev/src/app/editor/inject-node-runtime-sandbox.ts @@ -0,0 +1,17 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {EnvironmentInjector} from '@angular/core'; + +import {injectAsync} from '../core/services/inject-async'; + +export function injectNodeRuntimeSandbox(injector: EnvironmentInjector) { + return injectAsync(injector, () => + import('./node-runtime-sandbox.service').then((c) => c.NodeRuntimeSandbox), + ); +} diff --git a/adev/src/app/editor/node-runtime-sandbox.service.spec.ts b/adev/src/app/editor/node-runtime-sandbox.service.spec.ts index afc06d1737a7..9e22e908eaba 100644 --- a/adev/src/app/editor/node-runtime-sandbox.service.spec.ts +++ b/adev/src/app/editor/node-runtime-sandbox.service.spec.ts @@ -300,4 +300,18 @@ describe('NodeRuntimeSandbox', () => { expect(deleteFileSpy).toHaveBeenCalledWith(fileToDelete); } }); + + it('should not have any filePath starting with "/" in solutions files', async () => { + service['webContainerPromise'] = Promise.resolve( + new FakeWebContainer() as unknown as WebContainer, + ); + setValuesToInitializeProject(); + + await service.init(); + + const files = await service.getSolutionFiles(); + + expect(files.length).toBe(1); + expect(files[0].path).toBe('fake-file'); + }); }); diff --git a/adev/src/app/editor/node-runtime-sandbox.service.ts b/adev/src/app/editor/node-runtime-sandbox.service.ts index 4db6e4d726fe..f036194ff369 100644 --- a/adev/src/app/editor/node-runtime-sandbox.service.ts +++ b/adev/src/app/editor/node-runtime-sandbox.service.ts @@ -143,12 +143,20 @@ export class NodeRuntimeSandbox { async getSolutionFiles(): Promise { const webContainer = await this.webContainerPromise!; - const excludeFolders = ['node_modules', '.angular', 'dist']; + const excludeFromRoot = [ + 'node_modules', + '.angular', + 'dist', + 'BUILD.bazel', + 'idx', + 'package.json.template', + 'config.json', + ]; return await checkFilesInDirectory( - '/', + '', webContainer.fs, - (path?: string) => !!path && !excludeFolders.includes(path), + (path: string) => !excludeFromRoot.includes(path), ); } diff --git a/adev/src/app/editor/preview/preview.component.ts b/adev/src/app/editor/preview/preview.component.ts index f968a47d5e75..2e7712cd8b69 100644 --- a/adev/src/app/editor/preview/preview.component.ts +++ b/adev/src/app/editor/preview/preview.component.ts @@ -6,13 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import { - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - inject, - computed, -} from '@angular/core'; +import {ChangeDetectionStrategy, Component, inject, computed} from '@angular/core'; import {DomSanitizer} from '@angular/platform-browser'; import {toSignal} from '@angular/core/rxjs-interop'; @@ -30,7 +24,6 @@ import {PreviewError} from './preview-error.component'; imports: [PreviewError], }) export class Preview { - private readonly changeDetectorRef = inject(ChangeDetectorRef); private readonly domSanitizer = inject(DomSanitizer); private readonly nodeRuntimeSandbox = inject(NodeRuntimeSandbox); private readonly nodeRuntimeState = inject(NodeRuntimeState); diff --git a/adev/src/app/editor/stackblitz-opener.service.ts b/adev/src/app/editor/stackblitz-opener.service.ts index d26e1f23ef2e..4fb481160c26 100644 --- a/adev/src/app/editor/stackblitz-opener.service.ts +++ b/adev/src/app/editor/stackblitz-opener.service.ts @@ -8,7 +8,8 @@ import {EnvironmentInjector, Injectable, inject} from '@angular/core'; import sdk, {Project, ProjectFiles} from '@stackblitz/sdk'; -import {injectAsync} from '../core/services/inject-async'; + +import {injectNodeRuntimeSandbox} from './inject-node-runtime-sandbox'; @Injectable({ providedIn: 'root', @@ -22,9 +23,7 @@ export class StackBlitzOpener { async openCurrentSolutionInStackBlitz( projectMetadata: Pick, ): Promise { - const nodeRuntimeSandbox = await injectAsync(this.environmentInjector, () => - import('./node-runtime-sandbox.service').then((c) => c.NodeRuntimeSandbox), - ); + const nodeRuntimeSandbox = await injectNodeRuntimeSandbox(this.environmentInjector); const runtimeFiles = await nodeRuntimeSandbox.getSolutionFiles(); diff --git a/adev/src/app/features/home/animation/README.md b/adev/src/app/features/home/animation/README.md new file mode 100644 index 000000000000..af68e389fc5b --- /dev/null +++ b/adev/src/app/features/home/animation/README.md @@ -0,0 +1,160 @@ +# `Animation` API + +The `Animation` class provides a simplistic interface for creating and processing CSS-based animations. In essence, it represents a CSS animation player. + +## API + +Anyone capable of writing CSS, and a certain dose of creativity, should be able to create animations with the `Animation` API. + +### Layers + +To start, you need to divide your animation template into layers that make logical sense. These layers should use the `AnimationLayerDirective` which requires a mandatory `layerId` property to be set. The layer ID should be unique for the `Animation` instance. + +```html +
    +
    +
    +
    +
    +
    +``` + +The layers should be styled as normal elements/components in the animation host component stylesheet. These styles will act as the initial animation styles. + +> [!CAUTION] +> Do not style elements via the `style` attribute, if you plan to animate them. Stale styles are removed by the animation processor which means that any initial styles set via `style` will be cleared as well. + +### Creating an `Animation` instance + +To create a new animation instance, you should use the `AnimationCreatorService` service in your animation host component as follows: + +```typescript +class AnimationHost implements AfterViewInit { + private animationCreator = inject(AnimationCreatorService); + layers = viewChildren(AnimationLayerDirective); + + constructor() { + afterNextRender({ read: () => { + // The layers must be provided + const animation = this.animationCreator.createAnimation(this.layers()); + // ... + }}); + } +} +``` + +### Definition + +After you create an `Animation` instance, you have to provide your `AnimationDefinition` to the `define()` method: + +```typescript +animation.define(DEFINITION); +``` + +The definition is where the actual animation is described. The API is very similar to CSS `@keyframes` where you provide start (`from`) and end (`to`) styles with the added extra that you now have control over the timing – when the animation processor should start applying the styles. Additionally, you have to specify the target element or layer in the following format: + +``` + >> . +``` + +The class name should be of an element within the layer. Accessing the layer directly without a specified element is supported as well (i.e. just use ``). Pay attention to the dot in front of the class name. Although, internally, we are using `getElementsByClassName` the dot is still there in case we want to add support for other types of selectors in the future which will require switching to `getQuerySelectorAll`, for instance. It also provides some form of differentiation between the layer ID and the class name. + +> [!TIP] +> You can achieve `@keyframes` percentage-based sequencing by combining multiple `AnimationRule`-s with different timings and change rates. The same can be said about CSS timing functions – you can achieve similar resemblance by animation rule composition (currently, only linear transitions are supported but that might change if there is a need for that). + +```typescript +const DEFINITION: AnimationDefinition = [ + // Changes the color of the circle from black to white. + { + selector: `layer-1 >> .circle`, + timeframe: [3, 5], // Starts at the 3rd and ends at the 5th second. + from: { + 'background-color': '#000', + }, + to: { + 'background-color': '#fff', + } + } +]; +``` + +It is suggested that the start styles match the initial styles of the element. Generally, it shouldn't matter but it can cause issues with the visualizations if you add `transition`-s to the animated CSS properties. + +> [!IMPORTANT] +> The `from` and `to` CSS properties should match. + +#### Static rules + +If you want to apply certain styles at a concrete time, you should use a static animation rule instead: + +```typescript +// Hides the layer at the 7th second. +{ + selector: `layer-2`, + at: 7, + styles: { + 'display': 'none', + }, +} +``` + +> [!NOTE] +> Static values like `display: none` will be applied immediately in the case of dynamic rules (`timeframe`). They can't be animated. + +### Animation duration and animation control methods + +As mentioned in the description, the `Animation` is essentially a CSS player. Hence, you can use the control methods `play`, `pause`, `stop`, `seek` and `reset` to start and play with an animation after providing a definition. + +Note that animation duration is automatically inferred by the rule that ends its execution last. + +#### Plugins + +The plugin system allows for extending the animation functionality. Currently, there are two available plugins: + +- `AnimationPlayer` – Used for development. As the name suggests, it renders animation controls for ease of use. +- `AnimationScrollHandler` – Enables page scroll control over the animation. + +```typescript +animation.addPlugin(new AnimationScrollHandler(...)); +``` + +> [!TIP] +> You can create your own plugin by extending the `AnimationPlugin` interface. + +> [!CAUTION] +> Use `animation.dispose()` on host component destroy, if you add any plugins as they might result in memory leaks or stale UI leftovers. + +##### Scroll handler plugin + +It's worth mentioning that the speed of animation progression in the context of the scroll handler plugin is determined by both the animation duration and the provided timestep (check `AnimationConfig` for detailed info). The timings in the definition merely act as a way to describe relative timing among the different animation rules not absolute time of execution. + +By default, the plugin will add a spacer to the host element that will be tall enough to match the whole animation duration. This means it's implied that the animation layers use `position: fixed`. You can disable the spacer and use an alternative layout if you desire. + +> [!TIP] +> Apply transitions, as part of the initial styles, to the animated properties when using the scroll handler. This might be needed since scrolling via mouse scroll wheel results in non-continuous `scrollY` which results in jagged animation. + +## Limitations + +There are certain limitations that come with the usage of the `Animation` API. Most of them are related to CSS property values parsing. So, it's crucial to understand that there are several data types – `numeric`, `transition`, `color` and `static` values. All values can be animated with the exclusion of `static` values. For example `display: block` is considered static (i.e. non-animatable). However, there are certain cases where the parser is unable to process a value that might be deemed animatable/continuous which will then be treated as static one. These cases are as follows: + +- _Parsing shorthand CSS properties like `border`_ – The animation processor won't be able to animate `1px solid red` <=> `20px solid red`, for example. In such cases, it is suggested to use the standard CSS properties that describe only the numeric part of the property, i.e. `border-width: 1px <=> 20px`. +- _Only hex, `rgb` and `rgba` colors are supported_ – At this stage, color spaces like `hsl` or `lch`, for instance, are not supported. +- _Not all transform functions are supported_ – You can check the list [here](https://github.com/angular/angular/blob/main/adev/src/app/features/home/animation/parser/css-value-parser.ts#L13). It's merely a preventative measure in case a new function is added to the standard that requires additional changes to the parser. You can try adding your desired function to the list and verifying if it works or not. +- _`calc` and `var` (and probably more) are not supported_ – The parser is not fully CSS-spec-compliant. There are probably more CSS perks that won't be parsable but the current functionality should be sufficient enough for rich animations. + +**Other limitations** + +- _Definition can't be changed dynamically_ – This means that you can't add additional layers or animation rules to the animation during its runtime. +- _Number of animated elements_ – This is probably obvious but rendering a lot of elements and animating them can be computationally expensive and, respectively, degrade the user experience. For such animations, use HTML Canvas solutions. + +## How it works? + +The principle is simple: we calculate the value progression based on time progression (e.g. timeframe = [0, 4]; current time = 3s => progression = 75% => we apply 75% of the defined CSS property value span between `from` and `to` styles, unless the value is static). This happens for each frame via the `updateFrame` method that is called internally. + +Other than that the different phases of `Animation` are: + +- Instantiation +- Animation definition +- Object reference extraction and validation; Property validation +- Parsing of the animation definition to the internal data format (CSS value parsing happens here) +- Value processing/calculations on play/seek/forward/back (i.e. frame update) diff --git a/adev/src/app/features/home/animation/animation-creator.service.ts b/adev/src/app/features/home/animation/animation-creator.service.ts new file mode 100644 index 000000000000..f4d3810e34d0 --- /dev/null +++ b/adev/src/app/features/home/animation/animation-creator.service.ts @@ -0,0 +1,31 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {inject, Injectable, Injector} from '@angular/core'; +import {Animation} from './animation'; +import {AnimationLayerDirective} from './animation-layer.directive'; +import {AnimationConfig} from './types'; + +@Injectable() +export class AnimationCreatorService { + private readonly injector = inject(Injector); + + /** + * Create an `Animation` object + * + * @param layers Animation layers + * @param config Animation config + * @returns `Animation` + */ + createAnimation( + layers: readonly AnimationLayerDirective[], + config?: Partial, + ): Animation { + return new Animation(layers, this.injector, config); + } +} diff --git a/adev/src/app/features/home/animation/animation-layer.directive.ts b/adev/src/app/features/home/animation/animation-layer.directive.ts new file mode 100644 index 000000000000..d1563d4c301b --- /dev/null +++ b/adev/src/app/features/home/animation/animation-layer.directive.ts @@ -0,0 +1,21 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {Directive, ElementRef, inject, input} from '@angular/core'; + +/** + * Use on elements that are deemed to be animation layers. + */ +@Directive({ + selector: '[adevAnimationLayer]', +}) +export class AnimationLayerDirective { + readonly elementRef = inject(ElementRef); + + id = input.required({alias: 'layerId'}); +} diff --git a/adev/src/app/features/home/animation/animation.spec.ts b/adev/src/app/features/home/animation/animation.spec.ts new file mode 100644 index 000000000000..c4cf5b98a4c2 --- /dev/null +++ b/adev/src/app/features/home/animation/animation.spec.ts @@ -0,0 +1,417 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {AfterViewInit, Component, inject, viewChildren} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {AnimationLayerDirective} from './animation-layer.directive'; +import {AnimationCreatorService} from './animation-creator.service'; +import {Animation} from './animation'; +import {AnimationDefinition} from './types'; +import {AnimationPlugin} from './plugins/types'; + +// Test component +const TEST_TIMESTEP = 500; + +@Component({ + selector: 'adev-animation-host', + imports: [AnimationLayerDirective], + providers: [AnimationCreatorService], + template: ` +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + `, +}) +class AnimationHost implements AfterViewInit { + private animationCreator = inject(AnimationCreatorService); + layers = viewChildren(AnimationLayerDirective); + animation!: Animation; + + ngAfterViewInit() { + this.animation = this.animationCreator.createAnimation(this.layers(), { + timestep: TEST_TIMESTEP, + }); + } +} + +// Animation definition +const DEFINITION: AnimationDefinition = [ + { + selector: 'layer-1 >> .circle', + timeframe: [0, 4], + from: { + 'opacity': '0', + 'transform': 'translateX(0)', + }, + to: { + 'opacity': '1', + 'transform': 'translateX(100%)', + }, + }, + { + selector: 'layer-2 >> .square', + timeframe: [1, 5], + from: { + 'font-size': '20px', + 'color': '#000', + }, + to: { + 'font-size': '10px', + 'color': '#ffffff', + }, + }, +]; + +describe('Animation', () => { + let component: AnimationHost; + let fixture: ComponentFixture; + let animation: Animation; + const layerObjects = new Map(); + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AnimationHost], + }).compileComponents(); + + fixture = TestBed.createComponent(AnimationHost); + component = fixture.componentInstance; + fixture.detectChanges(); + animation = component.animation; + + // Store all layer objects in a map for easier access. + for (const l of component.layers()) { + const layerEl = l.elementRef.nativeElement as HTMLElement; + layerObjects.set(l.id(), layerEl); + + const layerObj = layerEl.firstChild as HTMLElement; + layerObjects.set('.' + layerObj.className, layerObj); + } + }); + + it('should load the layers and initialize the animation', () => { + expect(animation).toBeTruthy(); + expect(layerObjects.get('layer-1')).toBeInstanceOf(HTMLElement); + expect(layerObjects.get('.circle')).toBeInstanceOf(HTMLElement); + expect(layerObjects.get('layer-2')).toBeInstanceOf(HTMLElement); + expect(layerObjects.get('.square')).toBeInstanceOf(HTMLElement); + expect(layerObjects.get('layer-3')).toBeInstanceOf(HTMLElement); + }); + + it(`should throw an error if a layer doesn't exist`, () => { + const defineFn = () => + animation.define([ + { + selector: 'layer-4', + at: 1, + styles: {}, + }, + ]); + + expect(defineFn).toThrowError('Animation: Missing layer ID: layer-4'); + }); + + it('should return the config timestep', () => { + expect(animation.timestep).toEqual(TEST_TIMESTEP); + }); + + it(`should throw an error if a layer object doesn't exist`, () => { + const defineFn = () => + animation.define([ + { + selector: 'layer-1 >> .triangle', + at: 1, + styles: {}, + }, + ]); + + expect(defineFn).toThrowError('Animation: Missing layer object(s): layer-1 >> .triangle'); + }); + + it('should throw an error if the animation duration is negative', () => { + const defineFn = () => + animation.define([ + { + selector: 'layer-1 >> .circle', + timeframe: [5, 4], + from: { + 'background': '#000', + }, + to: { + 'background': '#fff', + }, + }, + ]); + + expect(defineFn).toThrowError( + `Animation: Incorrect time frame for selector 'layer-1 >> .circle'. Start time is greater than end time`, + ); + }); + + it('should throw an error if the animation duration is zero', () => { + const defineFn = () => + animation.define([ + { + selector: 'layer-1 >> .circle', + timeframe: [5, 5], + from: { + 'background': '#000', + }, + to: { + 'background': '#fff', + }, + }, + ]); + + expect(defineFn).toThrowError( + `Animation: Duration for selector 'layer-1 >> .circle' is zero. Use 'at' time selector instead`, + ); + }); + + it('should throw an error if there is a mismatch between the number of "from" and "to" styles', () => { + const defineFn = () => + animation.define([ + { + selector: 'layer-1 >> .circle', + timeframe: [0, 1], + from: { + 'background': '#000', + 'opacity': '0.5', + }, + to: { + 'background': '#fff', + }, + }, + ]); + + expect(defineFn).toThrowError( + `Animation: There is a mismatch between the number of "from" and "to" styles for selector 'layer-1 >> .circle'`, + ); + }); + + it('should throw an error if there is a mismatch between the "from" and "to" styles properties', () => { + const defineFn = () => + animation.define([ + { + selector: 'layer-1 >> .circle', + timeframe: [0, 1], + from: { + 'background': '#000', + 'opacity': '0.5', + }, + to: { + 'background': '#fff', + 'transform': 'scale(2)', + }, + }, + ]); + + expect(defineFn).toThrowError( + `Animation: "from" style 'transform' is missing for selector 'layer-1 >> .circle'`, + ); + }); + + it('should return animation duration', () => { + animation.define([ + { + selector: 'layer-2 >> .square', + timeframe: [3, 7], + from: {}, + to: {}, + }, + { + selector: 'layer-1 >> .circle', + timeframe: [0, 5], + from: {}, + to: {}, + }, + ]); + + expect(animation.duration).toEqual(7000); + }); + + it('should return animation duration (single rule)', () => { + animation.define([ + { + selector: 'layer-2 >> .square', + at: 3, + styles: {}, + }, + ]); + + expect(animation.duration).toEqual(3000); + }); + + it('should add an initialize a plugin', () => { + const mockPlugin: AnimationPlugin = { + init: () => {}, + destroy: () => {}, + }; + const initSpy = spyOn(mockPlugin, 'init'); + + animation.addPlugin(mockPlugin); + + expect(initSpy).toHaveBeenCalled(); + }); + + it('should dispose the animation', () => { + const mockPlugin: AnimationPlugin = { + init: () => {}, + destroy: () => {}, + }; + const destroySpy = spyOn(mockPlugin, 'destroy'); + + animation.addPlugin(mockPlugin); + animation.dispose(); + + expect(destroySpy).toHaveBeenCalled(); + expect(animation.duration).toEqual(0); + expect(animation.progress()).toEqual(0); + expect(animation.isPlaying()).toEqual(false); + }); + + it('should move the animation forward in time', () => { + animation.define(DEFINITION); + animation.forward(2000); + + const circle = layerObjects.get('.circle'); + + expect(circle?.style.opacity).toEqual('0.5'); + expect(circle?.style.transform).toEqual('translateX(50%)'); + + const square = layerObjects.get('.square'); + + expect(square?.style.fontSize).toEqual('17.5px'); + expect(square?.style.color).toEqual('rgb(64, 64, 64)'); + }); + + it('should move the animation back in time', () => { + animation.define(DEFINITION); + animation.forward(5000); + animation.back(2000); + + const circle = layerObjects.get('.circle'); + + expect(circle?.style.opacity).toEqual('0.75'); + expect(circle?.style.transform).toEqual('translateX(75%)'); + + const square = layerObjects.get('.square'); + + expect(square?.style.fontSize).toEqual('15px'); + expect(square?.style.color).toEqual('rgb(128, 128, 128)'); + }); + + it('should seek', () => { + animation.define(DEFINITION); + animation.seek(4 / 5); // 4th second; 0.8 + + const circle = layerObjects.get('.circle'); + + expect(circle?.style.opacity).toEqual('1'); + expect(circle?.style.transform).toEqual('translateX(100%)'); + + const square = layerObjects.get('.square'); + + expect(square?.style.fontSize).toEqual('12.5px'); + expect(square?.style.color).toEqual('rgb(191, 191, 191)'); + }); + + it('should reset the animation', () => { + animation.define(DEFINITION); + animation.seek(1); + animation.reset(); + + expect(animation.progress()).toEqual(0); + + const circle = layerObjects.get('.circle'); + + // i.e. CSS styles are in use + + expect(circle?.style.opacity).toEqual(''); + expect(circle?.style.transform).toEqual(''); + + const square = layerObjects.get('.square'); + + expect(square?.style.fontSize).toEqual(''); + expect(square?.style.color).toEqual(''); + }); + + it('should animate layers', () => { + animation.define([ + { + selector: 'layer-1', + timeframe: [0, 1], + from: { + 'padding': '0', + }, + to: { + 'padding': '32px', + }, + }, + ]); + animation.seek(0.5); + + const layer1 = layerObjects.get('layer-1'); + + expect(layer1?.style.padding).toEqual('16px'); + }); + + it('should animate all objects that are matching a selector', () => { + animation.define([ + { + selector: 'layer-3 >> .triangle', + timeframe: [0, 1], + from: { + 'transform': 'rotate(0)', + }, + to: { + 'transform': 'rotate(360deg)', + }, + }, + ]); + animation.seek(0.5); + + const layer3 = layerObjects.get('layer-3')!; + const triangles = layer3.querySelectorAll('.triangle'); + + for (let i = 0; i < triangles.length; i++) { + expect((triangles[i] as HTMLElement).style.transform).toEqual('rotate(180deg)'); + } + }); + + it('should animate a single static rule', () => { + animation.define([ + { + selector: 'layer-2 >> .square', + at: 1.5, + styles: { + 'top': '100px', + }, + }, + ]); + + animation.seek(1); + + const square = layerObjects.get('.square'); + + expect(square?.style.top).toEqual('100px'); + }); + + it('should track animation progress', () => { + animation.define(DEFINITION); + animation.seek(0.5); + + expect(animation.progress()).toEqual(0.5); + }); +}); diff --git a/adev/src/app/features/home/animation/animation.ts b/adev/src/app/features/home/animation/animation.ts new file mode 100644 index 000000000000..01015bf79542 --- /dev/null +++ b/adev/src/app/features/home/animation/animation.ts @@ -0,0 +1,507 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {Injector, Renderer2, RendererFactory2, signal} from '@angular/core'; +import {AnimationLayerDirective} from './animation-layer.directive'; +import { + AnimationConfig, + AnimationDefinition, + AnimationRule, + DynamicAnimationRule, + ParsedStyles, + Styles, +} from './types'; +import {CssPropertyValue, cssValueParser, stringifyParsedValue} from './parser'; +import {calculateNextCssValue} from './calculations'; +import {AnimationPlugin} from './plugins/types'; + +// The string seperator between a layed ID and an object selector. +const SEL_SEPARATOR = '>>'; + +// One millisecond. +const MS = 1000; + +// Default config. +const DEFAULT_CONFIG: AnimationConfig = { + timestep: 100, +}; + +const getStartTime = (r: AnimationRule): number => + r.timeframe ? r.timeframe[0] : r.at; + +const getEndTime = (r: AnimationRule): number => + r.timeframe ? r.timeframe[1] : r.at; + +const getEndStyles = (r: AnimationRule): ParsedStyles => + r.timeframe ? r.to : r.styles; + +/** + * CSS animation player/processor. + */ +export class Animation { + private renderer: Renderer2; + + /** Parsed rules. Time is in milliseconds. */ + private rules: AnimationRule[] = []; + private config: AnimationConfig; + private currentTime: number = 0; + private allObjects = new Map(); // selector; element(s) + private activeStyles = new Map(); // selector; ParsedStyles + private animationFrameId: number | null = null; + private completed: boolean = false; + private plugins: AnimationPlugin[] = []; + private _duration: number = 0; + private _isPlaying = signal(false); + private _progress = signal(0); + + /** Returns whether the animation is playing or not */ + isPlaying = this._isPlaying.asReadonly(); + + /** Returns the animation progress (`[0,1]`) */ + progress = this._progress.asReadonly(); + + constructor( + layers: readonly AnimationLayerDirective[], + injector: Injector, + config?: Partial, + ) { + this.renderer = injector.get(RendererFactory2).createRenderer(null, null); + this.config = {...DEFAULT_CONFIG, ...(config || {})}; + + // Set layer elements in the objects map. + this.allObjects = new Map(layers.map((f) => [f.id(), f.elementRef.nativeElement])); + } + + /** Animation duration. In milliseconds */ + get duration() { + return this._duration; + } + + /** Animation timestep (config). In milliseconds */ + get timestep() { + return this.config.timestep; + } + + /** + * Define the animation. + * + * @param definition Definition (i.e. `AnimationRule` array) + * @returns The animation + */ + define(definition: AnimationDefinition) { + this.reset(); + this.extractObjectsAndValidateRules(definition); + + // Parse the rules. + // IMPORTANT: Parsed rules use milliseconds instead of seconds. + this.rules = definition + .sort((a, b) => getStartTime(a) - getStartTime(b)) + .map((rule) => { + if (rule.timeframe) { + const from: ParsedStyles = {}; + const to: ParsedStyles = {}; + + for (const [prop, val] of Object.entries(rule.from)) { + from[prop] = cssValueParser(val); + } + for (const [prop, val] of Object.entries(rule.to)) { + to[prop] = cssValueParser(val); + } + // Convert to milliseconds. + const msTimeframe = rule.timeframe.map((t) => t * MS) as [number, number]; + + return {...rule, from, to, timeframe: msTimeframe}; + } else { + const styles: ParsedStyles = {}; + + for (const [prop, val] of Object.entries(rule.styles)) { + styles[prop] = cssValueParser(val); + } + // Convert to milliseconds. + const msAt = rule.at * MS; + + return {...rule, styles, at: msAt}; + } + }); + + // Calculate the duration of the animation. + // IMPORTANT: Use parsed rules with milliseconds. + this._duration = Math.max(...this.rules.map((r) => getEndTime(r))); + + return this; + } + + /** Play the animation. */ + play() { + if (this.animationFrameId !== null) { + return; + } + if (!this.rules.length) { + console.warn("Animation: Can't play without a definition"); + return; + } + if (this.completed) { + this.reset(); + this.completed = false; + } + + this._isPlaying.set(true); + + // Start the animation. + this.animate(Date.now(), 0); + } + + /** Pause the animation. */ + pause() { + if (this.animationFrameId !== null) { + cancelAnimationFrame(this.animationFrameId); + this.animationFrameId = null; + this._isPlaying.set(false); + } + } + + /** + * Fast-forward or go back at a specific time. + * + * @param progress Time (in percent) at which the player should render the animation + * @returns + */ + seek(progress: number) { + this.pause(); + + if (!this.rules.length) { + console.warn("Animation: Can't without a definition"); + return; + } + + progress = Math.max(0, Math.min(progress, 1)); + const time = Math.round(progress * this._duration); + + this.updateFrame(time); + this.completed = progress === 1; + } + + /** + * Go forward in time. + * + * @param timestep Custom timestep different from the config one + * @returns + */ + forward(timestep?: number) { + this.pause(); + + if (!this.rules.length) { + console.warn("Animation: Can't go forward without a definition"); + return; + } + timestep = timestep ?? this.config.timestep; + + const time = this.currentTime + timestep; + + if (time <= this._duration) { + this.updateFrame(time); + } else { + this.completed = true; + } + } + + /** + * Go back in time. + * + * @param timestep Custom timestep different from the config one + * @returns + */ + back(timestep?: number) { + this.pause(); + + if (!this.rules.length) { + console.warn("Animation: Can't go back without a definition"); + return; + } + timestep = timestep ?? this.config.timestep; + + const time = this.currentTime - timestep; + + if (time >= 0) { + this.updateFrame(time); + + // Un-complete the animation, if it was completed. + this.completed = false; + } + } + + /** Reset the animation. */ + reset() { + this.pause(); + this.currentTime = 0; + this._progress.set(0); + + for (const [selector, styles] of this.activeStyles) { + for (const style of Object.keys(styles)) { + this.removeStyle(selector, style); + } + this.activeStyles.delete(selector); + } + } + + /** Alias for `reset`. */ + stop() { + this.reset(); + } + + /** + * Add and initialize `AnimationPlugin` to the animation. + * + * @param plugin Plugin to be added + * @returns The animation + */ + addPlugin(plugin: AnimationPlugin) { + plugin.init(this); + this.plugins.push(plugin); + + return this; + } + + /** + * Cleans all of the resources that might cause memory leaks (e.g. plugins). + * Resets the animation and cleans the definition. + */ + dispose() { + for (const plugin of this.plugins) { + plugin.destroy(); + } + this.reset(); + this.rules = []; + this._duration = 0; + this.plugins = []; + } + + /** + * Update the frame/animation by a given time. + * + * @param time Time at which the animation should be rendered. + */ + private updateFrame(time: number) { + const completedRules = this.rules.filter((r) => time >= getEndTime(r)); + const inProgressDynamicRules = this.rules.filter((r) => { + const start = getStartTime(r); + const end = getEndTime(r); + // We exclude the static animation rules by `start < end` since `start == end`. + return start < end && start <= time && time <= end; + }) as DynamicAnimationRule[]; + + // All styles/styles state at `time`. + const stylesState = new Map(); + + // Extract the completed rules (their styles) directly ... + for (const rule of completedRules) { + let objectStyles = stylesState.get(rule.selector) || {}; + objectStyles = {...objectStyles, ...getEndStyles(rule)}; + stylesState.set(rule.selector, objectStyles); + } + + const deltaTime = time - this.currentTime; + + // ... and then calculate the change of the dynamic rules in progress. + for (const rule of inProgressDynamicRules) { + let timespan: number; + let targetStyles: ParsedStyles; // Direction styles + let sourceStyles: ParsedStyles; // Opposite direction styles + let relativeDeltaT: number; + + // Determine the change direction. Negative Dt means going back in time; postive – forward. + // + // It's important to calculate the relative time since the global current time might go out of + // rule boundaries which will scew the final change rate calculations. + // + // For example: + // If the currentTime = 0; time = 2; for a rule active between [1, 5]; + // the Dt = 2, but only one second has passed from the rule's timespan, + // i.e. we have to use a relative time which in this case is equal to timespan[0]. + // relativeDt = 1 (not 2); timespan = 4 (not 5); changeRate = 0.25 (not 0.4) + if (deltaTime > 0) { + const relativeTime = rule.timeframe[0]; + relativeDeltaT = time - relativeTime; + timespan = getEndTime(rule) - relativeTime; + targetStyles = rule.to; + sourceStyles = rule.from; + } else { + const relativeTime = rule.timeframe[1]; + relativeDeltaT = time - relativeTime; + timespan = relativeTime - getStartTime(rule); + targetStyles = rule.from; + sourceStyles = rule.to; + } + + const changeRate = Math.abs(relativeDeltaT / timespan); + const styles = stylesState.get(rule.selector) || {}; + + for (const [prop, target] of Object.entries(targetStyles)) { + const source = sourceStyles[prop]; + styles[prop] = calculateNextCssValue(source, target, changeRate); + } + + stylesState.set(rule.selector, styles); + } + + // Get rid of any active styles that are not part of the current styles state + for (const [selector, styles] of this.activeStyles) { + const newStyles = stylesState.get(selector); + for (const prop of Object.keys(styles)) { + if (!newStyles || !newStyles[prop]) { + this.removeStyle(selector, prop); + } + } + } + + // Apply the new rule styles. + for (const [selector, styles] of stylesState) { + for (const [prop, value] of Object.entries(styles)) { + this.setStyle(selector, prop, value); + } + } + + this.currentTime = time; + this._progress.set(time / this.duration); + } + + /** Set active style. */ + private setStyle(selector: string, property: string, value: CssPropertyValue) { + const elements = this.allObjects.get(selector)!; + + const valueString = stringifyParsedValue(value); + + if (elements instanceof Element) { + this.renderer.setStyle(elements, property, valueString); + } else { + for (const e of elements) { + this.renderer.setStyle(e, property, valueString); + } + } + + const activeStyles = this.activeStyles.get(selector) || {}; + activeStyles[property] = value; + this.activeStyles.set(selector, activeStyles); + } + + /** Remove active style. */ + private removeStyle(selector: string, property: string) { + const elements = this.allObjects.get(selector)!; + + if (elements instanceof Element) { + this.renderer.removeStyle(elements, property); + } else { + for (const e of elements) { + this.renderer.removeStyle(e, property); + } + } + + const activeStyles = this.activeStyles.get(selector) || {}; + delete activeStyles[property]; + } + + /** Animate function. */ + private animate(then: number, elapsed: number) { + this.animationFrameId = requestAnimationFrame(() => this.animate(then, elapsed)); + + const now = Date.now(); + elapsed = now - then; + + if (elapsed >= this.config.timestep) { + // Subtract the overflowed time from Now to maintain steady fps. + then = now - (elapsed % this.config.timestep); + + const time = this.currentTime + elapsed; + + if (time <= this._duration) { + this.updateFrame(time); + } else { + // Pause the animation and mark it as completed + // when we go over the duration. + this.pause(); + this.completed = true; + + // Since the last frame can be few milliseconds behind the duration + // (e.g. duration = 5000; current time = 4998) when the animation is + // completed, we perform one additional call to updateFrame in order + // to visualize any remaining static rules that match exactly the end + // of the animation. + if (this.duration > this.currentTime) { + requestAnimationFrame(() => this.updateFrame(this.duration)); + } + } + } + } + + /** Extract the objects from the selectors and validate their rules. */ + private extractObjectsAndValidateRules(definition: AnimationDefinition) { + for (const rule of definition) { + this.validateRules(rule); + this.extractObjects(rule); + } + } + + /** Check whether the start and end styles match and the time frame is correct. */ + private validateRules(rule: AnimationRule) { + if (!rule.timeframe) { + return; + } + + const duration = rule.timeframe[1] - rule.timeframe[0]; + if (duration < 0) { + throw new Error( + `Animation: Incorrect time frame for selector '${rule.selector}'. Start time is greater than end time`, + ); + } else if (duration === 0) { + throw new Error( + `Animation: Duration for selector '${rule.selector}' is zero. Use 'at' time selector instead`, + ); + } + + const fromStyles = Object.keys(rule.from); + const toStyles = Object.keys(rule.to); + + if (fromStyles.length !== toStyles.length) { + throw new Error( + `Animation: There is a mismatch between the number of "from" and "to" styles for selector '${rule.selector}'`, + ); + } + for (const prop of toStyles) { + if (!rule.from[prop]) { + throw new Error( + `Animation: "from" style '${prop}' is missing for selector '${rule.selector}'`, + ); + } + } + } + + /** + * Extracts all objects (layer elements and layer child elements) by their provided selectors. + */ + private extractObjects(rule: AnimationRule) { + let [layerId, objectSelector] = rule.selector.split(SEL_SEPARATOR); + layerId = layerId.trim(); + objectSelector = (objectSelector ?? '').trim(); + + const layer = this.allObjects.get(layerId) as Element; + if (!layer) { + throw new Error(`Animation: Missing layer ID: ${layerId}`); + } + + if (objectSelector && !this.allObjects.has(rule.selector)) { + const objects = layer.getElementsByClassName(objectSelector.replaceAll('.', ' ').trim()); + if (!objects.length) { + throw new Error(`Animation: Missing layer object(s): ${rule.selector}`); + } + + if (!this.allObjects.has(rule.selector)) { + this.allObjects.set(rule.selector, objects.length === 1 ? objects[0] : Array.from(objects)); + } + } + } +} diff --git a/adev/src/app/features/home/animation/calculations/calc-css-value.spec.ts b/adev/src/app/features/home/animation/calculations/calc-css-value.spec.ts new file mode 100644 index 000000000000..bde443fb67c6 --- /dev/null +++ b/adev/src/app/features/home/animation/calculations/calc-css-value.spec.ts @@ -0,0 +1,266 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {calculateNextCssValue} from './calc-css-value'; +import {ColorValue, NumericValue, StaticValue, TransformValue} from '../parser'; + +// +// Test values +// + +const sourceNumeric: NumericValue = { + type: 'numeric', + values: [ + [100, 'px'], + [250, 'px'], + ], +}; + +const targetNumeric: NumericValue = { + type: 'numeric', + values: [ + [125, 'px'], + [100, 'px'], + ], +}; + +const sourceTransform: TransformValue = { + type: 'transform', + values: new Map([ + [ + 'transform', + [ + [100, 'px'], + [10, 'px'], + ], + ], + ['scale', [[0.5, '']]], + ]), +}; + +const targetTransform: TransformValue = { + type: 'transform', + values: new Map([ + [ + 'transform', + [ + [150, 'px'], + [5, 'px'], + ], + ], + ['scale', [[1, '']]], + ]), +}; + +const sourceColor: ColorValue = { + type: 'color', + value: ['rgb', 0, 0, 0], +}; + +const targetColor: ColorValue = { + type: 'color', + value: ['rgb', 255, 255, 255], +}; + +// +// Tests +// + +describe('calculateNextCssValue', () => { + it('should return the target value, if static', () => { + const source: StaticValue = { + type: 'static', + value: '1px solid red', + }; + const target: StaticValue = { + type: 'static', + value: '2px solid blue', + }; + const next = calculateNextCssValue(source, target, 0.5); + + expect(next).toEqual(target); + }); + + it('should return the source numeric value, if the change rate is 0', () => { + const next = calculateNextCssValue(sourceNumeric, targetNumeric, 0); + + expect(next).toEqual(sourceNumeric); + }); + + it('should return the target numeric value, if the change rate is 1', () => { + const next = calculateNextCssValue(sourceNumeric, targetNumeric, 1); + + expect(next).toEqual(targetNumeric); + }); + + it('should calculate a numeric value', () => { + const next = calculateNextCssValue(sourceNumeric, targetNumeric, 0.75); + + expect(next).toEqual({ + type: 'numeric', + values: [ + [118.75, 'px'], + [137.5, 'px'], + ], + }); + }); + + it('should calculate a numeric value with negative number', () => { + const next = calculateNextCssValue( + { + type: 'numeric', + values: [ + [-50, 'px'], + [0, '%'], + ], + }, + { + type: 'numeric', + values: [ + [50, 'px'], + [-75, '%'], + ], + }, + 0.5, + ); + + expect(next).toEqual({ + type: 'numeric', + values: [ + [0, 'px'], + [-37.5, '%'], + ], + }); + }); + + it('should handle numeric zero values without units', () => { + const source: NumericValue = { + type: 'numeric', + values: [[100, '%']], + }; + const target: NumericValue = { + type: 'numeric', + values: [[0, '']], + }; + const next = calculateNextCssValue(source, target, 0.25); + + expect(next).toEqual({ + type: 'numeric', + values: [[75, '%']], + }); + }); + + it('should return the source transform value, if the change rate is 0', () => { + const next = calculateNextCssValue(sourceTransform, targetTransform, 0); + + expect(next).toEqual(sourceTransform); + }); + + it('should return the target transform value, if the change rate is 1', () => { + const next = calculateNextCssValue(sourceTransform, targetTransform, 1); + + expect(next).toEqual(targetTransform); + }); + + it('should calculate a transform value', () => { + const next = calculateNextCssValue(sourceTransform, targetTransform, 0.75); + + expect(next).toEqual({ + type: 'transform', + values: new Map([ + [ + 'transform', + [ + [137.5, 'px'], + [6.25, 'px'], + ], + ], + ['scale', [[0.875, '']]], + ]), + }); + }); + + it('should calculate a transform value with negative numbers', () => { + const source: TransformValue = { + type: 'transform', + values: new Map([ + [ + 'translateX', + [ + [-120, 'px'], + [0, '%'], + ], + ], + ]), + }; + const target: TransformValue = { + type: 'transform', + values: new Map([ + [ + 'translateX', + [ + [0, 'px'], + [-50, '%'], + ], + ], + ]), + }; + const next = calculateNextCssValue(source, target, 0.25); + + expect(next).toEqual({ + type: 'transform', + values: new Map([ + [ + 'translateX', + [ + [-90, 'px'], + [-12.5, '%'], + ], + ], + ]), + }); + }); + + it('should handle transform zero values without units', () => { + const source: TransformValue = { + type: 'transform', + values: new Map([['translateX', [[120, 'px']]]]), + }; + const target: TransformValue = { + type: 'transform', + values: new Map([['translateX', [[0, '']]]]), + }; + const next = calculateNextCssValue(source, target, 0.25); + + expect(next).toEqual({ + type: 'transform', + values: new Map([['translateX', [[90, 'px']]]]), + }); + }); + + it('should return the source color value, if the change rate is 0', () => { + const next = calculateNextCssValue(sourceColor, targetColor, 0); + + expect(next).toEqual(sourceColor); + }); + + it('should return the target color value, if the change rate is 1', () => { + const next = calculateNextCssValue(sourceColor, targetColor, 1); + + expect(next).toEqual(targetColor); + }); + + it('should calculate a color value', () => { + const next = calculateNextCssValue(sourceColor, targetColor, 0.75); + + expect(next).toEqual({ + type: 'color', + value: ['rgb', 191, 191, 191], + }); + }); +}); diff --git a/adev/src/app/features/home/animation/calculations/calc-css-value.ts b/adev/src/app/features/home/animation/calculations/calc-css-value.ts new file mode 100644 index 000000000000..43082bb9f30b --- /dev/null +++ b/adev/src/app/features/home/animation/calculations/calc-css-value.ts @@ -0,0 +1,122 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { + ColorValue, + copyParsedValue, + CssPropertyValue, + NumericValue, + TransformValue, +} from '../parser'; + +/** + * Calculate the next `CssPropertyValue` based on the source and a target one. + * + * @param srcValue The source value + * @param targetValue The target values (it's either the final or the initial value) + * @param changeRate The change rate relative to the target (i.e. 1 = target value; 0 = source value) + * @returns The newly generated value + */ +export function calculateNextCssValue( + srcValue: T, + targetValue: T, + changeRate: number, +): T { + switch (targetValue.type) { + case 'numeric': + return calculateNextNumericValue(srcValue as NumericValue, targetValue, changeRate) as T; + case 'transform': + return calculateNextTransformValue(srcValue as TransformValue, targetValue, changeRate) as T; + case 'color': + return calculateNextColorValue(srcValue as ColorValue, targetValue, changeRate) as T; + } + + // Should represent static values + return copyParsedValue(targetValue); +} + +function calculateNextNumericValue( + srcValue: NumericValue, + targetValue: NumericValue, + changeRate: number, +): NumericValue { + const nextValue: NumericValue = { + type: 'numeric', + values: [], + }; + + for (let i = 0; i < targetValue.values.length; i++) { + const src = srcValue.values[i]; + const target = targetValue.values[i]; + const numDelta = calculateValueDelta(src[0], target[0], changeRate); + // We should check both src and target for the unit + // since we might have zero-based value without a unit + // (e.g. 0 <-> 640px) + const unit = target[1] || src[1]; + nextValue.values.push([src[0] + numDelta, unit]); + } + + return nextValue; +} + +function calculateNextTransformValue( + srcValue: TransformValue, + targetValue: TransformValue, + changeRate: number, +): TransformValue { + const nextValue: TransformValue = { + type: 'transform', + values: new Map(), + }; + + for (const [func, numData] of targetValue.values) { + const srcNumData = srcValue.values.get(func)!; + const newNumData: [number, string][] = []; + + for (let i = 0; i < numData.length; i++) { + const target = numData[i]; + const src = srcNumData[i]; + const numDelta = calculateValueDelta(src[0], target[0], changeRate); + // We should check both source and target for the unit + // since we might have zero-based value without a unit + // (e.g. rotate(0) <-> rotate(180deg)) + const unit = target[1] || src[1]; + newNumData.push([src[0] + numDelta, unit]); + } + + nextValue.values.set(func, newNumData); + } + + return nextValue; +} + +function calculateNextColorValue( + srcValue: ColorValue, + targetValue: ColorValue, + changeRate: number, +): ColorValue { + const nextColor: (string | number)[] = [srcValue.value[0]]; + + // Skip the first element since it represents the type. + for (let i = 1; i < targetValue.value.length; i++) { + const srcChannel = srcValue.value[i] as number; + const targetChannel = targetValue.value[i] as number; + const delta = calculateValueDelta(srcChannel, targetChannel, changeRate); + nextColor.push(Math.round(srcChannel + delta)); + } + + return { + type: 'color', + value: nextColor as typeof srcValue.value, + }; +} + +function calculateValueDelta(srcValue: number, targetValue: number, changeRate: number): number { + const valueSpan = targetValue - srcValue; + return valueSpan * changeRate; +} diff --git a/adev/src/app/features/home/utils/math.ts b/adev/src/app/features/home/animation/calculations/index.ts similarity index 69% rename from adev/src/app/features/home/utils/math.ts rename to adev/src/app/features/home/animation/calculations/index.ts index b170021ce544..4027ab650941 100644 --- a/adev/src/app/features/home/utils/math.ts +++ b/adev/src/app/features/home/animation/calculations/index.ts @@ -6,6 +6,4 @@ * found in the LICENSE file at https://angular.dev/license */ -export function toRadians(degrees: number): number { - return degrees * (Math.PI / 180); -} +export * from './calc-css-value'; diff --git a/adev/src/app/features/home/animation/index.ts b/adev/src/app/features/home/animation/index.ts new file mode 100644 index 000000000000..0cf5883208e5 --- /dev/null +++ b/adev/src/app/features/home/animation/index.ts @@ -0,0 +1,12 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +export * from './animation-creator.service'; +export * from './animation-layer.directive'; +export * from './animation'; +export {AnimationConfig, AnimationDefinition, Styles} from './types'; diff --git a/adev/src/app/features/home/animation/parser/css-value-lexer.spec.ts b/adev/src/app/features/home/animation/parser/css-value-lexer.spec.ts new file mode 100644 index 000000000000..6eed970dfb15 --- /dev/null +++ b/adev/src/app/features/home/animation/parser/css-value-lexer.spec.ts @@ -0,0 +1,101 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {cssValueLexer} from './css-value-lexer'; + +describe('css-value-lexer', () => { + it('should extract the tokens for a simple static value', () => { + const tokens = cssValueLexer('block'); + + expect(tokens).toEqual(['block']); + }); + + it('should extract the tokens for a hex color value', () => { + const tokens = cssValueLexer('#ff0000'); + + expect(tokens).toEqual(['#ff0000']); + }); + + it('should extract the tokens for an RGB color value', () => { + const tokens = cssValueLexer('rgb(255, 255, 0)'); + + expect(tokens).toEqual(['rgb', 255, 255, 0]); + }); + + it('should extract the tokens for an RGBA color value', () => { + const tokens = cssValueLexer('rgba(255, 255, 0, 0.5)'); + + expect(tokens).toEqual(['rgba', 255, 255, 0, 0.5]); + }); + + it('should extract the tokens for a single numeric integer value', () => { + const tokens = cssValueLexer('42px'); + + expect(tokens).toEqual([42, 'px']); + }); + + it('should extract the tokens for a single numeric decimal value', () => { + const tokens = cssValueLexer('66.6%'); + + expect(tokens).toEqual([66.6, '%']); + }); + + it('should extract the tokens for a single numeric negative value', () => { + const tokens = cssValueLexer('-50%'); + + expect(tokens).toEqual([-50, '%']); + }); + + it('should extract the tokens for a single unitless numberic value', () => { + const tokens = cssValueLexer('1337'); + + expect(tokens).toEqual([1337]); + }); + + it('should extract the tokens for a single unitless numeric negative value', () => { + const tokens = cssValueLexer('-33.3'); + + expect(tokens).toEqual([-33.3]); + }); + + it('should extract the tokens for a list of numeric values', () => { + const tokens = cssValueLexer('42px 13.37rem 0%'); + + expect(tokens).toEqual([42, 'px', 13.37, 'rem', 0, '%']); + }); + + it('should extract the tokens for a numeric value with negative numbers', () => { + const tokens = cssValueLexer('42px -13.37px 0rem -25%'); + + expect(tokens).toEqual([42, 'px', -13.37, 'px', 0, 'rem', -25, '%']); + }); + + it('should extract the tokens for a simple transform value', () => { + const tokens = cssValueLexer('translateX(42%)'); + + expect(tokens).toEqual(['translateX', 42, '%']); + }); + + it('should extract the tokens for a transform value with a single function with multiple parameters', () => { + const tokens = cssValueLexer('translate(42%, 0px)'); + + expect(tokens).toEqual(['translate', 42, '%', 0, 'px']); + }); + + it('should extract the tokens for a transform value with multiple functions with multiple parameters', () => { + const tokens = cssValueLexer('translate(42%, 0px) scale(1.5) rotate(180deg)'); + + expect(tokens).toEqual(['translate', 42, '%', 0, 'px', 'scale', 1.5, 'rotate', 180, 'deg']); + }); + + it('should extract the tokens for a transform value with negative numbers', () => { + const tokens = cssValueLexer('translate(42%, -13.37px) scale(-2)'); + + expect(tokens).toEqual(['translate', 42, '%', -13.37, 'px', 'scale', -2]); + }); +}); diff --git a/adev/src/app/features/home/animation/parser/css-value-lexer.ts b/adev/src/app/features/home/animation/parser/css-value-lexer.ts new file mode 100644 index 000000000000..e5c185c4548d --- /dev/null +++ b/adev/src/app/features/home/animation/parser/css-value-lexer.ts @@ -0,0 +1,125 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +type CharType = + | 'letter' + | 'digit' + | 'point' + | 'comma' + | 'hyphen' + | 'hash' + | 'percent' + | 'space' + | 'bracket' + | 'unknown'; + +type BufferType = 'text' | 'color' | 'number' | null; + +// Symbols/`CharType`-s that mark the end of a token +// but should not be included as such. +const END_SYMBOLS: CharType[] = ['space', 'bracket', 'comma']; + +/** + * Extract tokens from a CSS property value string. + * + * @param value CSS property value + * @returns Tokens in the form of strings and numbers + */ +export function cssValueLexer(value: string): (string | number)[] { + const tokens: (string | number)[] = []; + let buffer = ''; + let bufferType: BufferType | null = null; + + const addToken = () => tokens.push(bufferType === 'number' ? parseFloat(buffer) : buffer); + + for (const char of value) { + const charType = getCharType(char); + const newBufferType = getBufferType(charType, bufferType); + + // Check if token end has been reached + if (END_SYMBOLS.includes(charType) && buffer) { + addToken(); + buffer = ''; + bufferType = null; + } else if (newBufferType !== null) { + if (newBufferType !== bufferType && bufferType !== null) { + // Handle a new token/token change + addToken(); + buffer = char; + bufferType = newBufferType; + } else if (newBufferType === bufferType || bufferType === null) { + // Accumulate token string + buffer += char; + bufferType = newBufferType; + } + } + } + + // If the buffer is still filled, + // add the remaing as the last token + if (buffer) { + addToken(); + } + + return tokens; +} + +/** Get the `CharType` of a character. */ +function getCharType(char: string): CharType { + if (char === '.') { + return 'point'; + } + if (char === '-') { + return 'hyphen'; + } + if (char === ',') { + return 'comma'; + } + if (char === '%') { + return 'percent'; + } + if (char === '#') { + return 'hash'; + } + if (char === ' ') { + return 'space'; + } + if (char === '(' || char === ')') { + return 'bracket'; + } + + const code = char.charCodeAt(0); + + if (48 <= code && code <= 57) { + return 'digit'; + } + if ((65 <= code && code <= 90) || (97 <= code && code <= 122)) { + return 'letter'; + } + return 'unknown'; +} + +/** Get the lexer buffer type of a `CharType`. */ +function getBufferType(type: CharType, currentBuffer: BufferType): BufferType { + const colorSymbols: CharType[] = ['hash']; + if (colorSymbols.includes(type) || currentBuffer === 'color') { + return 'color'; + } + + const textSymbols: CharType[] = ['letter', 'percent']; + if (textSymbols.includes(type)) { + return 'text'; + } + + const numberSymbols: CharType[] = ['digit', 'point', 'hyphen']; + if (numberSymbols.includes(type)) { + return 'number'; + } + + return null; +} diff --git a/adev/src/app/features/home/animation/parser/css-value-parser.spec.ts b/adev/src/app/features/home/animation/parser/css-value-parser.spec.ts new file mode 100644 index 000000000000..b42f2e9c39ac --- /dev/null +++ b/adev/src/app/features/home/animation/parser/css-value-parser.spec.ts @@ -0,0 +1,286 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {cssValueParser} from './css-value-parser'; + +describe('css-value-parser', () => { + it('should parse a simple static value', () => { + const value = cssValueParser('block'); + + expect(value).toEqual({ + type: 'static', + value: 'block', + }); + }); + + it('should parse a hex color value', () => { + const value = cssValueParser('#ff7d00'); + + expect(value).toEqual({ + type: 'color', + value: ['rgb', 255, 125, 0], + }); + }); + + it('should parse a short hex color value', () => { + const value = cssValueParser('#f0f'); + + expect(value).toEqual({ + type: 'color', + value: ['rgb', 255, 0, 255], + }); + }); + + it('should parse a hex color value with upper case letters', () => { + const value = cssValueParser('#AABBFF'); + + expect(value).toEqual({ + type: 'color', + value: ['rgb', 170, 187, 255], + }); + }); + + it('should parse an RGB color value', () => { + const value = cssValueParser('rgb(255, 255, 0)'); + + expect(value).toEqual({ + type: 'color', + value: ['rgb', 255, 255, 0], + }); + }); + + it('should parse an RGBA color value', () => { + const value = cssValueParser('rgba(255, 255, 0, 0.75)'); + + expect(value).toEqual({ + type: 'color', + value: ['rgba', 255, 255, 0, 0.75], + }); + }); + + it('should parse a single numeric integer value', () => { + const value = cssValueParser('42px'); + + expect(value).toEqual({ + type: 'numeric', + values: [[42, 'px']], + }); + }); + + it('should parse a single numberic decimal value', () => { + const value = cssValueParser('66.6%'); + + expect(value).toEqual({ + type: 'numeric', + values: [[66.6, '%']], + }); + }); + + it('should parse a single negative numberic value', () => { + const value = cssValueParser('-50%'); + + expect(value).toEqual({ + type: 'numeric', + values: [[-50, '%']], + }); + }); + + it('should parse a single unitless numberic value', () => { + const value = cssValueParser('1337'); + + expect(value).toEqual({ + type: 'numeric', + values: [[1337, '']], + }); + }); + + it('should parse a list of numeric values', () => { + const value = cssValueParser('42px 13.37rem 0%'); + + expect(value).toEqual({ + type: 'numeric', + values: [ + [42, 'px'], + [13.37, 'rem'], + [0, '%'], + ], + }); + }); + + it('should parse a list of unitless numeric values', () => { + const value = cssValueParser('42 13.37 0'); + + expect(value).toEqual({ + type: 'numeric', + values: [ + [42, ''], + [13.37, ''], + [0, ''], + ], + }); + }); + + it('should parse a list of negative and positive numeric values', () => { + const value = cssValueParser('42% -13.37px 0rem -100vw'); + + expect(value).toEqual({ + type: 'numeric', + values: [ + [42, '%'], + [-13.37, 'px'], + [0, 'rem'], + [-100, 'vw'], + ], + }); + }); + + it('should parse a list of negative and positive unitless numeric values', () => { + const value = cssValueParser('42 -13.37 0 -100'); + + expect(value).toEqual({ + type: 'numeric', + values: [ + [42, ''], + [-13.37, ''], + [0, ''], + [-100, ''], + ], + }); + }); + + it('should parse a list of numeric values with and without units', () => { + const value = cssValueParser('13 37px -3.14 66.6rem'); + + expect(value).toEqual({ + type: 'numeric', + values: [ + [13, ''], + [37, 'px'], + [-3.14, ''], + [66.6, 'rem'], + ], + }); + }); + + it('should parse a simple transform value', () => { + const value = cssValueParser('translateX(42%)'); + + expect(value).toEqual({ + type: 'transform', + values: new Map([['translateX', [[42, '%']]]]), + }); + }); + + it('should parse a transform value with a single function with multiple parameters', () => { + const value = cssValueParser('translate(42%, 0px)'); + + expect(value).toEqual({ + type: 'transform', + values: new Map([ + [ + 'translate', + [ + [42, '%'], + [0, 'px'], + ], + ], + ]), + }); + }); + + it('should parse a transform value with a single function with a single unitless parameter', () => { + const value = cssValueParser('scale(1.5)'); + + expect(value).toEqual({ + type: 'transform', + values: new Map([['scale', [[1.5, '']]]]), + }); + }); + + it('should parse a transform value with a single function with multiple unitless parameter', () => { + const value = cssValueParser('scale(1.5, 42)'); + + expect(value).toEqual({ + type: 'transform', + values: new Map([ + [ + 'scale', + [ + [1.5, ''], + [42, ''], + ], + ], + ]), + }); + }); + + it('should parse a transform value with multiple functions with multiple parameters', () => { + const value = cssValueParser('translate(42%, 0px) scale(1.5) rotate(180deg)'); + + expect(value).toEqual({ + type: 'transform', + values: new Map([ + [ + 'translate', + [ + [42, '%'], + [0, 'px'], + ], + ], + ['scale', [[1.5, '']]], + ['rotate', [[180, 'deg']]], + ]), + }); + }); + + it('should parse a transform value with multiple functions with multiple parameters and negative values', () => { + const value = cssValueParser('translate(42%, -1px) scale(-1.5) rotate(180deg)'); + + expect(value).toEqual({ + type: 'transform', + values: new Map([ + [ + 'translate', + [ + [42, '%'], + [-1, 'px'], + ], + ], + ['scale', [[-1.5, '']]], + ['rotate', [[180, 'deg']]], + ]), + }); + }); + + it('should parse an unsupported transform value as a static one', () => { + const value = cssValueParser('matrix(1, 2, 3)'); + + expect(value).toEqual({ + type: 'static', + value: 'matrix(1, 2, 3)', + }); + }); + + it('should parse a transform value which function have both unit and unitless values as static', () => { + const value = cssValueParser('translate(42, 1337px)'); + + expect(value).toEqual({ + type: 'static', + value: 'translate(42, 1337px)', + }); + }); + + it('should parse a transform value with a function without parameters as a static one', () => { + const value = cssValueParser('translate()'); + + expect(value).toEqual({ + type: 'static', + value: 'translate()', + }); + }); +}); diff --git a/adev/src/app/features/home/animation/parser/css-value-parser.ts b/adev/src/app/features/home/animation/parser/css-value-parser.ts new file mode 100644 index 000000000000..c1940caf6277 --- /dev/null +++ b/adev/src/app/features/home/animation/parser/css-value-parser.ts @@ -0,0 +1,216 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {cssValueLexer} from './css-value-lexer'; +import {ColorValue, CssPropertyValue, NumericValue, TransformValue} from './types'; + +// Transform functions that can be parsed +const SUPPORTED_FUNCS = [ + 'translate', + 'rotate', + 'scale', + 'skew', + 'translateX', + 'translateY', + 'translateZ', + 'scaleX', + 'scaleY', + 'scaleZ', + 'skewX', + 'skewY', +]; + +interface ParserHandler { + (tokens: (string | number)[]): CssPropertyValue | null; +} + +// +// Handlers +// + +const colorValuesHandler: ParserHandler = (tokens) => { + const token = tokens[0]; + if (typeof token === 'string') { + if (token.startsWith('#')) { + const channels = []; + + // Handle standard syntax: #ffffff + if (token.length === 7) { + let channelBuffer = ''; + // Skip the first element since it represents the type. + for (let i = 1; i < token.length; i++) { + channelBuffer += token[i]; + if (channelBuffer.length === 2) { + const dec = parseInt(channelBuffer, 16); + channels.push(dec); + channelBuffer = ''; + } + } + } else if (token.length === 4) { + // Handle shorthand color syntax: #fff + for (let i = 1; i < token.length; i++) { + const channel = token[i]; + const hex = channel + channel; + const dec = parseInt(hex, 16); + channels.push(dec); + } + } + + if (channels.length === 3) { + return { + type: 'color', + value: ['rgb', ...channels], + } as ColorValue; + } + } + // RGB and RGBA + if ((token === 'rgb' && tokens.length === 4) || (token === 'rgba' && tokens.length === 5)) { + return { + type: 'color', + value: tokens, + } as ColorValue; + } + } + return null; +}; + +const numericValueHandler: ParserHandler = (tokens) => { + if (typeof tokens[0] === 'number') { + const value: NumericValue = { + type: 'numeric', + values: [], + }; + let buffer = []; + + for (const token of tokens) { + if (typeof token === 'number') { + // Add a value to the list (with or without unit) + if (buffer.length) { + value.values.push((buffer.length === 1 ? [buffer[0], ''] : buffer) as [number, string]); + buffer = []; + } + + buffer.push(token); + } else if (buffer.length === 1) { + // If string, expect a numeric value (i.e. buffer.length == 1) in the buffer. + buffer.push(token); + } else { + // Any other case means, the value is invalid. + return null; + } + } + + // Add any remaining values in the buffer + if (buffer.length) { + value.values.push((buffer.length === 1 ? [buffer[0], ''] : buffer) as [number, string]); + } + + return value; + } + + return null; +}; + +const transformValueHandler: ParserHandler = (tokens) => { + if (tokens.length > 1 && typeof tokens[0] === 'string') { + const value: TransformValue = { + type: 'transform', + values: new Map(), + }; + let functionName = ''; + let paramPairs: [number, string][] = []; + let paramBuffer: unknown[] = []; + let isValid = true; + + const isBufferNumOnly = () => !paramBuffer.find((v) => typeof v === 'string'); + + for (const token of tokens) { + if (typeof token === 'string' && SUPPORTED_FUNCS.includes(token)) { + // If there is already an extracted function, add it to the values map + if (paramPairs.length || paramBuffer.length) { + // If the param buffer is full, this means that it doesn't + // match the usual [number, string][] pattern (i.e. it should be numbers-only) + if (paramBuffer.length) { + if (!isBufferNumOnly()) { + isValid = false; + break; + } + + const pairs = paramBuffer.map((v) => [v, ''] as [number, string]); + paramPairs = paramPairs.concat(pairs); + } + + value.values.set(functionName, paramPairs); + paramPairs = []; + paramBuffer = []; + } + + functionName = token; + } else if (functionName) { + // Handle standard param pairs – number + unit + paramBuffer.push(token); + + if ( + paramBuffer.length === 2 && + typeof paramBuffer[0] === 'number' && + typeof paramBuffer[1] === 'string' + ) { + paramPairs.push(paramBuffer as [number, string]); + paramBuffer = []; + } + } + } + + // Check for remaining functions after the loop has completed + if (functionName && (paramPairs.length || paramBuffer.length)) { + if (paramBuffer.length && isBufferNumOnly()) { + const pairs = paramBuffer.map((v) => [v, ''] as [number, string]); + paramPairs = paramPairs.concat(pairs); + } + + if (paramPairs.length) { + value.values.set(functionName, paramPairs); + } + } + + if (isValid && value.values.size) { + return value; + } + } + return null; +}; + +// Include all handlers that should be part of the parsing here. +const parserHandlers = [colorValuesHandler, numericValueHandler, transformValueHandler]; + +// +// Parser function +// + +/** + * Parse a string to a `CssPropertyValue`. + * + * @param value CSS property value + * @returns Parsed CSS property value + */ +export function cssValueParser(value: string): CssPropertyValue { + const tokens = cssValueLexer(value); + + for (const handler of parserHandlers) { + const value = handler(tokens); + if (value) { + return value; + } + } + + // If not handled + return { + type: 'static', + value, + }; +} diff --git a/adev/src/app/features/home/components/shaders/modules/easing/sine-in-out.glsl.ts b/adev/src/app/features/home/animation/parser/index.ts similarity index 58% rename from adev/src/app/features/home/components/shaders/modules/easing/sine-in-out.glsl.ts rename to adev/src/app/features/home/animation/parser/index.ts index 0cd58ef92bac..77afd84864fa 100644 --- a/adev/src/app/features/home/components/shaders/modules/easing/sine-in-out.glsl.ts +++ b/adev/src/app/features/home/animation/parser/index.ts @@ -6,12 +6,6 @@ * found in the LICENSE file at https://angular.dev/license */ -export default /* glsl */ ` -#ifndef PI -#define PI 3.141592653589793 -#endif - -float sineInOut(float t) { - return -0.5 * (cos(PI * t) - 1.0); -} -`; +export * from './types'; +export * from './utils'; +export {cssValueParser} from './css-value-parser'; diff --git a/adev/src/app/features/home/animation/parser/types.ts b/adev/src/app/features/home/animation/parser/types.ts new file mode 100644 index 000000000000..1683268563c3 --- /dev/null +++ b/adev/src/app/features/home/animation/parser/types.ts @@ -0,0 +1,31 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +export type NumericValue = { + type: 'numeric'; + values: [number, string][]; +}; + +export type StaticValue = { + type: 'static'; + value: string; +}; + +export type ColorValue = { + type: 'color'; + value: ['rgb', number, number, number] | ['rgba', number, number, number, number]; + // red, green, blue, alpha? +}; + +export type TransformValue = { + type: 'transform'; + values: Map; // function name, parameters in the form of a numeric data +}; + +/** A parsed CSS property value. */ +export type CssPropertyValue = NumericValue | StaticValue | ColorValue | TransformValue; diff --git a/adev/src/app/features/home/animation/parser/utils.spec.ts b/adev/src/app/features/home/animation/parser/utils.spec.ts new file mode 100644 index 000000000000..a11c43202883 --- /dev/null +++ b/adev/src/app/features/home/animation/parser/utils.spec.ts @@ -0,0 +1,128 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {stringifyParsedValue} from './utils'; + +describe('CSS Value Parser Utils', () => { + describe('stringifyParsedValue', () => { + it('should stringify a static value', () => { + const output = stringifyParsedValue({ + type: 'static', + value: 'block', + }); + + expect(output).toEqual('block'); + }); + + it('should stringify an RGB color value', () => { + const output = stringifyParsedValue({ + type: 'color', + value: ['rgb', 255, 255, 0], + }); + + expect(output).toEqual('rgb(255, 255, 0)'); + }); + + it('should stringify an RGBA color value', () => { + const output = stringifyParsedValue({ + type: 'color', + value: ['rgba', 255, 125, 0, 0.75], + }); + + expect(output).toEqual('rgba(255, 125, 0, 0.75)'); + }); + + it('should stringify a single numeric value', () => { + const output = stringifyParsedValue({ + type: 'numeric', + values: [[42, 'px']], + }); + + expect(output).toEqual('42px'); + }); + + it('should stringify a unitless numeric value', () => { + const output = stringifyParsedValue({ + type: 'numeric', + values: [[1337, '']], + }); + + expect(output).toEqual('1337'); + }); + + it('should stringify multiple numeric values', () => { + const output = stringifyParsedValue({ + type: 'numeric', + values: [ + [42, 'px'], + [13.37, '%'], + [0, 'rem'], + ], + }); + + expect(output).toEqual('42px 13.37% 0rem'); + }); + + it('should stringify multiple unitless values', () => { + const output = stringifyParsedValue({ + type: 'numeric', + values: [ + [42, ''], + [13.37, ''], + [0, ''], + ], + }); + + expect(output).toEqual('42 13.37 0'); + }); + + it('should stringify a transform value', () => { + const output = stringifyParsedValue({ + type: 'transform', + values: new Map([['translate', [[42, 'px']]]]), + }); + + expect(output).toEqual('translate(42px)'); + }); + + it('should stringify a transform value with a function with multiple paramters', () => { + const output = stringifyParsedValue({ + type: 'transform', + values: new Map([ + [ + 'translate', + [ + [42, 'px'], + [13.37, '%'], + ], + ], + ]), + }); + + expect(output).toEqual('translate(42px, 13.37%)'); + }); + + it('should stringify a transform value with multiple functions', () => { + const output = stringifyParsedValue({ + type: 'transform', + values: new Map([ + [ + 'translate', + [ + [42, 'px'], + [13.37, '%'], + ], + ], + ['scale', [[1.5, '']]], + ]), + }); + + expect(output).toEqual('translate(42px, 13.37%) scale(1.5)'); + }); + }); +}); diff --git a/adev/src/app/features/home/animation/parser/utils.ts b/adev/src/app/features/home/animation/parser/utils.ts new file mode 100644 index 000000000000..6efcd8360520 --- /dev/null +++ b/adev/src/app/features/home/animation/parser/utils.ts @@ -0,0 +1,48 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {CssPropertyValue} from './types'; + +/** + * Convert a parsed CSS property value to its string representation. + * + * @param value Parsed CSS property value + * @returns String CSS property value + */ +export function stringifyParsedValue(value: CssPropertyValue): string { + switch (value.type) { + case 'numeric': + return value.values.map(([num, unit]) => num + unit).join(' '); + case 'transform': + return Array.from(value.values) + .map( + ([fnName, numData]) => + `${fnName}(${numData.map(([num, unit]) => num + unit).join(', ')})`, + ) + .join(' '); + case 'color': + const v = value.value; + let color = v[0] + '('; + for (let i = 1; i < v.length; i++) { + color += v[i] + (i < v.length - 1 ? ', ' : ''); + } + return color + ')'; + case 'static': + return value.value; + } +} + +/** + * Creates a deep copy of a parsed CSS property value. + * + * @param value Value to be copied + * @returns Copied value + */ +export function copyParsedValue(value: T): T { + return structuredClone(value); +} diff --git a/adev/src/app/features/home/animation/plugins/animation-player.component.ts b/adev/src/app/features/home/animation/plugins/animation-player.component.ts new file mode 100644 index 000000000000..64cc5695d054 --- /dev/null +++ b/adev/src/app/features/home/animation/plugins/animation-player.component.ts @@ -0,0 +1,123 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {ChangeDetectionStrategy, Component, computed, signal} from '@angular/core'; +import {Animation} from '../animation'; + +// In milliseconds. Used for going forward or back through the animation. +const TIMESTEP = 100; + +export type ComponentAlignment = 'left' | 'center' | 'right'; + +/** + * Animation player component. + */ +@Component({ + selector: 'adev-animation-player', + changeDetection: ChangeDetectionStrategy.OnPush, + template: ` + @if (animation(); as anim) { +
    +
    +
    +
    +
    + + + + +
    +
    + } + `, + styles: ` + .deck { + position: fixed; + left: 50%; + transform: translateX(-50%); + bottom: 30px; + padding: 10px; + border-radius: 12px; + background: rgba(0,0,0, 0.7); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.1); + z-index: 999999; + } + .deck.left { + left: 130px; + transform: initial; + } + .deck.right { + right: 30px; + left: initial; + transform: initial; + } + .progress-bar { + position: relative; + width: 400px; + height: 6px; + border-radius: 3px; + background-color: #444; + overflow: hidden; + margin-bottom: 10px; + cursor: pointer; + } + .progress { + position: absolute; + top: 0; + left: 0; + height: inherit; + background-color: #ba2391; + pointer-events: none; + } + .controls { + display: flex; + justify-content: center; + gap: 10px; + } + button { + width: 3Opx; + height: 30px; + border-radius: 7px; + background-color: #333; + font-size: 20px; + } + button:hover { + background-color: #444; + } + `, +}) +export class AnimationPlayerComponent { + animation = signal(null); + alignment = signal('center'); + TIMESTEP = TIMESTEP; + + progressPerc = computed(() => this.animation()!.progress() * 100 + '%'); + + playPause() { + const anim = this.animation()!; + + if (!anim.isPlaying()) { + anim.play(); + } else { + anim.pause(); + } + } + + seek(e: MouseEvent) { + const target = e.target as HTMLElement; + const progress = e.offsetX / target.clientWidth; + this.animation()!.seek(progress); + } +} diff --git a/adev/src/app/features/home/animation/plugins/animation-player.ts b/adev/src/app/features/home/animation/plugins/animation-player.ts new file mode 100644 index 000000000000..c00359154b0b --- /dev/null +++ b/adev/src/app/features/home/animation/plugins/animation-player.ts @@ -0,0 +1,40 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {ComponentRef, ViewContainerRef} from '@angular/core'; +import {Animation} from '../animation'; +import {AnimationPlugin} from './types'; +import {AnimationPlayerComponent, ComponentAlignment} from './animation-player.component'; + +export class AnimationPlayer implements AnimationPlugin { + private cmpRef?: ComponentRef; + + /** + * USED FOR ANIMATION DEVELOPMENT. + * Remove imports to this file before shipping the animation. + * + * Animation player. + * + * @param hostVcr VCR of the animation host component. + * @param alignment Alignment of the player. Default: `center` + */ + constructor( + private hostVcr: ViewContainerRef, + private alignment?: ComponentAlignment, + ) {} + + init(animation: Animation) { + this.cmpRef = this.hostVcr.createComponent(AnimationPlayerComponent); + this.cmpRef.instance.animation.set(animation); + this.cmpRef.instance.alignment.set(this.alignment || 'center'); + } + + destroy() { + this.cmpRef?.destroy(); + } +} diff --git a/adev/src/app/features/home/animation/plugins/animation-scroll-handler.ts b/adev/src/app/features/home/animation/plugins/animation-scroll-handler.ts new file mode 100644 index 000000000000..60756e54eea4 --- /dev/null +++ b/adev/src/app/features/home/animation/plugins/animation-scroll-handler.ts @@ -0,0 +1,88 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {ElementRef, Injector, Renderer2, RendererFactory2} from '@angular/core'; +import {WINDOW} from '@angular/docs'; +import {Animation} from '../animation'; +import {AnimationPlugin} from './types'; + +const RESIZE_DEBOUNCE = 500; + +export class AnimationScrollHandler implements AnimationPlugin { + private win: Window; + private renderer: Renderer2; + private unlisteners: (() => void)[] = []; + private scrollHeight: number = 0; + private spacer?: HTMLElement; + private resizeDebounceTimeout?: ReturnType; + + /** + * Enables page scroll control over the animation. + * + * @param hostElementRef `ElementRef` of the animation host component. + * @param injector + * @param addSpacer Enabled by default. Use when the position of the animation is `fixed`. + */ + constructor( + private hostElementRef: ElementRef, + injector: Injector, + private addSpacer: boolean = true, + ) { + this.win = injector.get(WINDOW); + this.renderer = injector.get(RendererFactory2).createRenderer(null, null); + } + + init(animation: Animation) { + // Calculate the total scroll height needed for the animation. + this.scrollHeight = animation.duration / animation.timestep; + + this.unlisteners.push( + this.renderer.listen(this.win, 'scroll', () => { + if (animation.isPlaying()) { + animation.pause(); + } + const progress = this.win.scrollY / this.scrollHeight; + animation.seek(progress); + }), + ); + + if (this.addSpacer) { + this.createSpacer(); + + this.unlisteners.push( + this.renderer.listen(this.win, 'resize', () => { + if (this.resizeDebounceTimeout) { + clearTimeout(this.resizeDebounceTimeout); + } + this.resizeDebounceTimeout = setTimeout(() => this.updateSpacerHeight(), RESIZE_DEBOUNCE); + }), + ); + } + } + + destroy() { + for (const unlisten of this.unlisteners) { + unlisten(); + } + } + + /** Creates and stores a spacer that occupies/creates the scrollable space needed for the animation. */ + private createSpacer() { + this.spacer = this.renderer.createElement('div'); + this.renderer.addClass(this.spacer, 'anim-scroll-spacer'); + this.updateSpacerHeight(); + + this.hostElementRef.nativeElement.appendChild(this.spacer); + } + + /** Update stored spacer's height. */ + private updateSpacerHeight() { + const spacerHeight = this.scrollHeight + this.win.innerHeight; + this.renderer.setStyle(this.spacer, 'height', spacerHeight + 'px'); + } +} diff --git a/adev/src/app/features/home/animation/plugins/types.ts b/adev/src/app/features/home/animation/plugins/types.ts new file mode 100644 index 000000000000..dcf7e0353bac --- /dev/null +++ b/adev/src/app/features/home/animation/plugins/types.ts @@ -0,0 +1,21 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {Animation} from '../animation'; + +/** + * Animation plugin interface. + * Plugins can be added to an animation via `Animation.addPlugin()`. + */ +export interface AnimationPlugin { + /** Contains the plugin initialization login. */ + init(animation: Animation): void; + + /** Will be called on Animation disposal. */ + destroy(): void; +} diff --git a/adev/src/app/features/home/animation/types.ts b/adev/src/app/features/home/animation/types.ts new file mode 100644 index 000000000000..8d541ee6dbee --- /dev/null +++ b/adev/src/app/features/home/animation/types.ts @@ -0,0 +1,58 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {CssPropertyValue} from './parser'; + +export type AnimationConfig = { + /** + * In milliseconds. How much the time increments or decrements when you go forward or back in time. + * In the case of auto play, the timestep virtually acts as FPS (frames per second). + * + * Default: `100` + */ + timestep: number; +}; + +export type Styles = {[key: string]: string}; + +export type ParsedStyles = {[key: string]: CssPropertyValue}; + +interface AnimationRuleBase { + /** + * Selector in the form of `LAYER_ID >> OBJECT_SELECTOR`. + * The object selector should be a class (prefixed with dot: `.my-class`) and is optional. + */ + selector: string; +} + +/** Animation definition */ +export interface DynamicAnimationRule extends AnimationRuleBase { + at?: never; + + /** In seconds. Marks the time frame between which the styles are applied (`[START, END]`). */ + timeframe: [number, number]; + /** Start styles. */ + from: T; + /** End styles. */ + to: T; +} + +export interface StaticAnimationRule extends AnimationRuleBase { + timeframe?: never; + + /** In seconds. Time at which the styles are applied. */ + at: number; + /** Styles to be applied. */ + styles: T; +} + +export type AnimationRule = + | DynamicAnimationRule + | StaticAnimationRule; + +export type AnimationDefinition = AnimationRule[]; diff --git a/adev/src/app/features/home/components/canvas.ts b/adev/src/app/features/home/components/canvas.ts deleted file mode 100644 index d0a9c01e2f98..000000000000 --- a/adev/src/app/features/home/components/canvas.ts +++ /dev/null @@ -1,335 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { - Camera, - Color, - Mesh, - OGLRenderingContext, - RenderTarget, - Renderer, - Transform, - Triangle, -} from 'ogl'; - -import {MaskProgram} from './programs/mask-program'; -import {GradientView} from './views/gradient-view'; -import {AngularView} from './views/angular-view'; -import {LinesView} from './views/lines-view'; -import {BuildView} from './views/build-view'; - -import {BREAKPOINT} from '../home-animation-constants'; - -/** - * Controller class for managing the WebGL canvas, OGL renderer and scenes. - */ -export class Canvas { - private renderer!: Renderer; - private gl!: OGLRenderingContext; - private gradientScene!: Transform; - private gradientCamera!: Camera; - private angularScene!: Transform; - private angularCamera!: Camera; - private linesScene!: Transform; - private linesCamera!: Camera; - private buildScene!: Transform; - private buildCamera!: Camera; - private screen!: Mesh; - private renderTargetA!: RenderTarget; - private renderTargetB!: RenderTarget; - private maskProgram!: MaskProgram; - - private currentClearColor: Color = new Color(); - private needsUpdate: boolean = false; - - gradient!: GradientView; - angular!: AngularView; - lines!: LinesView; - build!: BuildView; - - linesProgress = 0; - - /** - * Create the controller. - */ - constructor( - private readonly element: Element, - private readonly document: Document, - private readonly window: Window, - ) { - this.init(); - this.initMesh(); - this.initViews(); - } - - /** - * Initialize the OGL renderer and scenes. - */ - init(): void { - this.renderer = new Renderer({ - powerPreference: 'high-performance', - depth: false, - }); - this.gl = this.renderer.gl; - this.element.appendChild(this.gl.canvas as HTMLCanvasElement); - - // Gradient scene - this.gradientScene = new Transform(); - this.gradientCamera = new Camera(this.gl, { - left: -1, - right: 1, - top: 1, - bottom: -1, - near: 0, - far: 1, - }); - - // Angular scene - this.angularScene = new Transform(); - this.angularCamera = new Camera(this.gl, { - left: -1, - right: 1, - top: 1, - bottom: -1, - near: 0, - far: 1, - }); - - // Lines scene - this.linesScene = new Transform(); - this.linesCamera = new Camera(this.gl, {fov: 30, near: 0.5, far: 40}); - this.linesCamera.position.z = 10; - this.linesCamera.lookAt([0, 0, 0]); - - // Build scene - this.buildScene = new Transform(); - this.buildCamera = new Camera(this.gl, { - left: -1, - right: 1, - top: 1, - bottom: -1, - near: 0, - far: 1, - }); - } - - /** - * Initialize a fullscreen triangle geometry and mesh for rendering scene composites or - * post-processing, plus render targets and programs. - */ - initMesh(): void { - // Fullscreen triangle - const geometry = new Triangle(this.gl); - this.screen = new Mesh(this.gl, {geometry}); - this.screen.frustumCulled = false; - - // Render targets - this.renderTargetA = new RenderTarget(this.gl, {depth: false}); - this.renderTargetB = new RenderTarget(this.gl, {depth: false}); - - // Mask program - this.maskProgram = new MaskProgram(this.gl, this.window); - this.maskProgram.uniforms['tMap'].value = this.renderTargetA.texture; - this.maskProgram.uniforms['tMask'].value = this.renderTargetB.texture; - this.screen.program = this.maskProgram; - } - - /** - * Initialize views. - */ - initViews(): void { - this.gradient = new GradientView(this.gl, this.document, this.window); - this.gradientScene.addChild(this.gradient); - - this.angular = new AngularView(this.gl); - this.angularScene.addChild(this.angular); - - this.lines = new LinesView(this.gl); - this.linesScene.addChild(this.lines); - - this.build = new BuildView(this.gl, this.document); - this.buildScene.addChild(this.build); - } - - /** - * Theme event handler. - */ - theme(): void { - const rootStyle = getComputedStyle(this.document.querySelector(':root')!); - - this.currentClearColor.set(rootStyle.getPropertyValue('--webgl-page-background').trim()); - this.gl.clearColor( - ...(this.currentClearColor as unknown as [red: number, green: number, blue: number]), - 1, - ); - - // Views - this.gradient.theme(); - } - - /** - * Resize event handler. - */ - resize(width: number, height: number, dpr: number, scale: number): void { - this.renderer.dpr = dpr; - this.renderer.setSize(width, height); - - // Views - this.gradient.resize(width, height, dpr, scale); - this.angular.resize(width, height, dpr, scale); - this.build.resize(width, height, dpr, scale); - - // Gradient scene - this.gradientCamera.left = -width / 2; - this.gradientCamera.right = width / 2; - this.gradientCamera.top = height / 2; - this.gradientCamera.bottom = -height / 2; - this.gradientCamera.orthographic(); - // The camera position is offset for 2D positioning of objects top left - this.gradientCamera.position.x = width / 2; - this.gradientCamera.position.y = -height / 2; - - // Angular scene - this.angularCamera.left = -width / 2; - this.angularCamera.right = width / 2; - this.angularCamera.top = height / 2; - this.angularCamera.bottom = -height / 2; - this.angularCamera.orthographic(); - // The camera position is offset for 2D positioning of objects top left - this.angularCamera.position.x = width / 2; - this.angularCamera.position.y = -height / 2; - - // Lines scene - this.linesCamera.aspect = width / height; - this.linesCamera.perspective(); - - if (width < BREAKPOINT) { - this.linesCamera.position.z = 20; - } else { - this.linesCamera.position.z = height / 60; - } - - // Build scene - this.buildCamera.left = -width / 2; - this.buildCamera.right = width / 2; - this.buildCamera.top = height / 2; - this.buildCamera.bottom = -height / 2; - this.buildCamera.orthographic(); - // The camera position is offset for 2D positioning of objects top left - this.buildCamera.position.x = width / 2; - this.buildCamera.position.y = -height / 2; - - // Render targets - const effectiveWidth = width * dpr; - const effectiveHeight = height * dpr; - - this.renderTargetA.setSize(effectiveWidth, effectiveHeight); - this.renderTargetB.setSize(effectiveWidth, effectiveHeight); - } - - /** - * Update event handler. - */ - update(time: number, deltaTime: number, frame: number, progress: number): void { - // Reset gradient progress - if (progress >= 0 && progress <= 0.16) { - this.gradient.background.userData['progress'] = 0; - } - - this.gradient.update(time); - this.angular.update(); - this.lines.update(time); - this.build.update(); - - // Disable animation at end of page - if ( - !this.gradient.visible && - !this.angular.visible && - !this.lines.visible && - !this.build.visible - ) { - if (this.needsUpdate) { - this.needsUpdate = false; - } else { - return; - } - } else { - this.needsUpdate = true; - } - - const {renderer, renderTargetA, renderTargetB} = this; - - // Gradient pass - renderer.render({ - scene: this.gradientScene, - camera: this.gradientCamera, - target: renderTargetA, - }); - - // Angular pass (mask on transparent background) - this.gl.clearColor(0, 0, 0, 0); - renderer.render({ - scene: this.angularScene, - camera: this.angularCamera, - target: renderTargetB, - }); - - // Build pass (mask on transparent background) - renderer.render({ - scene: this.buildScene, - camera: this.buildCamera, - target: renderTargetB, - clear: false, - }); - - // Set clear color back to default - this.gl.clearColor( - ...(this.currentClearColor as unknown as [red: number, green: number, blue: number]), - 1, - ); - - // Mask pass (render to screen) - renderer.render({scene: this.screen}); - - // Camera parallax/pan/zoom by moving the entire scene - this.linesScene.position.z = -6 + 6 * (1 - (-0.5 + this.linesProgress)); - this.linesCamera.lookAt([0, 0, 0]); - - // Lines pass - renderer.render({ - scene: this.linesScene, - camera: this.linesCamera, - clear: false, - }); - } - - /** - * Promise for the views when they're ready. - */ - ready(): Promise { - return Promise.all([ - this.gradient.ready(), - this.angular.ready(), - this.lines.ready(), - this.build.ready(), - ]); - } - - /** - * Destroys the views, all child views and WebGL context. - */ - destroy(): void { - this.gradient.destroy(); - this.angular.destroy(); - this.lines.destroy(); - this.build.destroy(); - - const extension = this.gl.getExtension('WEBGL_lose_context'); - if (extension) extension.loseContext(); - } -} diff --git a/adev/src/app/features/home/components/home-animation/animation-definition.ts b/adev/src/app/features/home/components/home-animation/animation-definition.ts new file mode 100644 index 000000000000..bc8119cee8b7 --- /dev/null +++ b/adev/src/app/features/home/components/home-animation/animation-definition.ts @@ -0,0 +1,437 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {AnimationDefinition, Styles} from '../../animation'; +import {AnimationRule} from '../../animation/types'; + +/** + * CONSTANTS + */ + +// Represents percentage of the total. +// Avoid using large waves (the total shouldn't be too big as well). +// Check meteorShower function for more details. +const FIRST_WAVE_METEORS = 0.05; +const SECOND_WAVE_METEORS = 0.15; +const THIRD_WAVE_METEORS = 0.25; + +// Use to increase or decrease the animation duration (i.e. a fine tuning parameter). +// Employed by `timeframe()` and `at()`. +const TIMING_MULTIPLIER = 1.55; + +export const ANIM_TIMESTEP = 10; // In milliseconds + +/** + * SELECTORS + */ + +const BANNERS_LAYER_ID = 'banners'; +const ADEV_BANNER = `${BANNERS_LAYER_ID} >> .adev-banner`; +const LEARN_ANGULAR_BTN = `${BANNERS_LAYER_ID} >> .learn-angular`; + +const LOGO_LAYER_ID = 'logo'; +const LOGO = `${LOGO_LAYER_ID} >> .logo`; +const SHIELD = `${LOGO_LAYER_ID} >> .shield`; +const SHIELD_MIDDLE = `${LOGO_LAYER_ID} >> .shield-middle`; +const SHIELD_BOTTOM_A_ARC = `${LOGO_LAYER_ID} >> .shield-bottom-a-arc`; +const SHIELD_BOTTOM_EXTENSION = `${LOGO_LAYER_ID} >> .shield-bottom-extension`; +const CAPITAL_A_LETTER = `${LOGO_LAYER_ID} >> .capt-a-letter`; +const N_LETTER = `${LOGO_LAYER_ID} >> .n-letter`; +const G_LETTER = `${LOGO_LAYER_ID} >> .g-letter`; +const U_LETTER = `${LOGO_LAYER_ID} >> .u-letter`; +const L_LETTER = `${LOGO_LAYER_ID} >> .l-letter`; +const A_LETTER = `${LOGO_LAYER_ID} >> .a-letter`; +const R_LETTER = `${LOGO_LAYER_ID} >> .r-letter`; + +const UWU_LAYER_ID = 'uwu'; + +const WORKS_AT_ANY_SCALE_LAYER_ID = 'works-at-any-scale'; + +const METEOR_FIELD_LAYER_ID = 'meteor-field'; +const METEOR_FIELD = `${METEOR_FIELD_LAYER_ID} >> .field`; +const METEORS = `${METEOR_FIELD_LAYER_ID} >> .meteor`; +const METEOR_ID = (id: number) => `${METEOR_FIELD_LAYER_ID} >> .mt-${id}`; + +const LOVED_BY_MILLIONS_LAYER_ID = 'loved-by-millions'; + +const BUILD_FOR_EVERYONE_LAYER_ID = 'build-for-everyone'; +const BUILD_FOR_EVERYONE_TITLE = `${BUILD_FOR_EVERYONE_LAYER_ID} >> .title`; + +/** + * ANIMATION/HELPER FUNCTIONS + */ + +// Timing functions (they employ `TIMING_MULTIPLIER`) – Use when setting the time of a rule. +const at = (at: number): number => at * TIMING_MULTIPLIER; +const timeframe = (from: number, to: number): [number, number] => [ + from * TIMING_MULTIPLIER, + to * TIMING_MULTIPLIER, +]; + +/** Duration: 1 second */ +function hideLetter(selector: string, startTime: number): AnimationRule { + return { + selector, + timeframe: timeframe(startTime, startTime + 1), + from: { + opacity: '1', + }, + to: { + opacity: '0', + }, + }; +} + +/** Duration: 1 to 2 seconds */ +function showMeteor(selector: string, startTime: number): AnimationRule { + const randomizedStartTime = startTime + Math.random(); // Up to +1 second (excl.) + return { + selector, + timeframe: timeframe(randomizedStartTime, randomizedStartTime + 1), + from: { + opacity: '0', + transform: 'translate(200%, 200%) scale(0.3)', + }, + to: { + opacity: '1', + transform: 'translate(0, 0) scale(1)', + }, + }; +} + +/** Duration: 1 to 2 seconds */ +function meteorShower( + startTime: number, + size: number, + total: number, + inUse: Set, +): AnimationDefinition { + const animations: AnimationRule[] = []; + + while (animations.length < size) { + // We pick a random meteor ID. + // If `inUse` is nearly full relative to `total`, + // we might run into a excessive amount of iterations + // until we fill `animation`. This is why we should keep + // the wave sizes (and their total) relatively small. + const id = Math.round(Math.random() * (total - 1) + 1); + + if (!inUse.has(id)) { + animations.push(showMeteor(METEOR_ID(id), startTime)); + inUse.add(id); + } + } + + return animations; +} + +/** + * DEFINITION + */ + +/** Generate the animation definition for the home page animation. */ +export function generateHomeAnimationDefinition( + isUwu: boolean, + meteorCount: number, +): AnimationDefinition { + // Banners and buttons layer + // ************************* + const bannersLayerAnim: AnimationDefinition = [ + { + selector: ADEV_BANNER, + timeframe: timeframe(2, 3), + from: { + transform: 'translateY(0)', + }, + to: { + transform: 'translateY(-200px)', + }, + }, + { + selector: LEARN_ANGULAR_BTN, + timeframe: timeframe(2.5, 3.5), + from: { + opacity: '1', + }, + to: { + opacity: '0', + }, + }, + { + selector: LEARN_ANGULAR_BTN, + at: at(4), + styles: { + visibility: 'hidden', + }, + }, + ]; + + // Logo layer animation + // ******************** + const logoLayerAnim: AnimationDefinition = [ + { + selector: LOGO, + timeframe: timeframe(0, 5), + from: { + transform: 'translateX(0)', + }, + to: { + transform: 'translateX(467px)', // Value based on the 1280x400 SVG view box + }, + }, + hideLetter(R_LETTER, 1), + hideLetter(A_LETTER, 1.5), + hideLetter(L_LETTER, 2), + hideLetter(U_LETTER, 2.5), + hideLetter(G_LETTER, 3), + hideLetter(N_LETTER, 3.5), + // Make sure that the last letter disappers at the end of layer transition, + // i.e. 4 + 1 = 5th second end time + hideLetter(CAPITAL_A_LETTER, 4), + { + selector: SHIELD_MIDDLE, + timeframe: timeframe(5.5, 5.6), + from: { + transform: 'scale(1)', + }, + to: { + transform: 'scale(0)', + }, + }, + { + selector: SHIELD_BOTTOM_A_ARC, + timeframe: timeframe(5.5, 5.6), + from: { + transform: 'scaleY(1)', + }, + to: { + transform: 'scaleY(0)', + }, + }, + { + selector: SHIELD_BOTTOM_EXTENSION, + timeframe: timeframe(5.5, 5.6), + from: { + transform: 'scale(0)', + }, + to: { + transform: 'scale(1)', + }, + }, + { + selector: SHIELD, + timeframe: timeframe(5.5, 10), + from: { + transform: 'scale(1) rotate(0deg)', + }, + to: { + transform: 'scale(50) rotate(-360deg)', + }, + }, + ]; + + // "UwU logo" layer animation + // ************************** + const uwuLayerAnimation: AnimationDefinition = [ + { + selector: UWU_LAYER_ID, + timeframe: timeframe(0, 5.5), + from: { + transform: 'scale(1)', + }, + to: { + transform: 'scale(0)', + }, + }, + { + selector: UWU_LAYER_ID, + timeframe: timeframe(4, 5.5), + from: { + opacity: '1', + }, + to: { + opacity: '0', + }, + }, + ]; + + // "Works at any scale" layer animation + // ************************************ + const waasLayerAnim: AnimationDefinition = [ + { + selector: WORKS_AT_ANY_SCALE_LAYER_ID, + timeframe: timeframe(5.7, 8), // Make sure it appears after SHIELD_MIDDLE disappears. + from: { + transform: 'scale(0.1)', + opacity: '0', + }, + to: { + transform: 'scale(1)', + opacity: '1', + }, + }, + { + selector: WORKS_AT_ANY_SCALE_LAYER_ID, + timeframe: timeframe(11, 12.5), + from: { + transform: 'scale(1)', + opacity: '1', + }, + to: { + transform: 'scale(1.5)', + opacity: '0', + }, + }, + ]; + + // Meteor field layer animation + // **************************** + const firstWaveSize = meteorCount * FIRST_WAVE_METEORS; + const secondWaveSize = meteorCount * SECOND_WAVE_METEORS; + const thirdWaveSize = meteorCount * THIRD_WAVE_METEORS; + + const meteorsInUse = new Set(); + const firstWave = meteorShower(8, firstWaveSize, meteorCount, meteorsInUse); + const secondWave = meteorShower(10, secondWaveSize, meteorCount, meteorsInUse); + const thirdWave = meteorShower(12, thirdWaveSize, meteorCount, meteorsInUse); + const lastWaveStart = 16; + + // For the last wave, just use the remaining meteors (don't use `meteorShower`). + const lastWave: AnimationRule[] = []; + for (let id = 1; id <= meteorCount; id++) { + if (!meteorsInUse.has(id)) { + lastWave.push(showMeteor(METEOR_ID(id), lastWaveStart)); + } + } + + const meteorFieldLayerAnim: AnimationDefinition = [ + { + selector: METEOR_FIELD, + at: at(7), + styles: { + display: 'flex', + }, + }, + { + selector: METEOR_FIELD, + timeframe: timeframe(8, 18), + from: { + transform: 'scale(1.42)', + }, + to: { + transform: 'scale(1)', + }, + }, + ...firstWave, + ...secondWave, + ...thirdWave, + ...lastWave, + { + selector: METEORS, + timeframe: timeframe(19.5, 21), + from: { + transform: 'translate(0, 0) scale(1)', + }, + to: { + transform: 'translate(-200%, -200%) scale(0.3)', + }, + }, + { + selector: METEOR_FIELD, + timeframe: timeframe(19.5, 21), + from: { + opacity: '1', + }, + to: { + opacity: '0', + }, + }, + { + selector: METEOR_FIELD, + at: at(22), + styles: { + display: 'none', + }, + }, + ]; + + // "Loved by millions" layer animation + // *********************************** + const lovedByMillionsAnim: AnimationDefinition = [ + { + selector: LOVED_BY_MILLIONS_LAYER_ID, + timeframe: timeframe(14, 15.5), + from: { + transform: 'scale(0.75)', + opacity: '0', + }, + to: { + transform: 'scale(1)', + opacity: '1', + }, + }, + { + selector: LOVED_BY_MILLIONS_LAYER_ID, + timeframe: timeframe(19, 20.5), + from: { + transform: 'scale(1)', + opacity: '1', + }, + to: { + transform: 'scale(1.5)', + opacity: '0', + }, + }, + ]; + + // "Build for everyone" layer + // ************************** + const buildForEveryoneAnim: AnimationDefinition = [ + { + selector: BUILD_FOR_EVERYONE_LAYER_ID, + timeframe: timeframe(22, 25), + from: { + transform: 'scale(0.75)', + opacity: '0', + }, + to: { + transform: 'scale(1)', + opacity: '1', + }, + }, + { + selector: BUILD_FOR_EVERYONE_TITLE, + timeframe: timeframe(23, 25), + from: { + 'background-position-x': '100%', + }, + to: { + 'background-position-x': '0', + }, + }, + { + selector: BUILD_FOR_EVERYONE_LAYER_ID, + timeframe: timeframe(29, 31.5), + from: { + opacity: '1', + }, + to: { + opacity: '0', + }, + }, + ]; + + return [ + ...bannersLayerAnim, + ...(!isUwu ? logoLayerAnim : uwuLayerAnimation), + ...waasLayerAnim, + ...meteorFieldLayerAnim, + ...lovedByMillionsAnim, + ...buildForEveryoneAnim, + ]; +} diff --git a/adev/src/app/features/home/components/home-animation/home-animation.component.html b/adev/src/app/features/home/components/home-animation/home-animation.component.html new file mode 100644 index 000000000000..a599d9eefada --- /dev/null +++ b/adev/src/app/features/home/components/home-animation/home-animation.component.html @@ -0,0 +1,142 @@ +
    + + + + @if (!isUwu()) { + +
    + + + + + + + + + + + + + + + +
    + } @else { + +
    + Angular logo +
    + } + + +
    +

    Works at any scale

    +

    + Angular lets you start small on a well-lit path and supports you as your team and apps grow. +

    +
    + + + @if (meteorFieldData(); as meteorFieldData) { +
    +
    + @for (type of meteors(); track $index) { +
    + } +
    +
    + } + + +
    +

    Loved by millions

    +

    + Join the millions of developers all over the world building with Angular in a thriving and + friendly community. +

    +
    + + +
    +

    Build for everyone

    +

    + Rely on Angular's built-in hydration, internationalization, security, and accessibility + support to build for everyone around the world. +

    +
    +
    diff --git a/adev/src/app/features/home/components/home-animation/home-animation.component.scss b/adev/src/app/features/home/components/home-animation/home-animation.component.scss new file mode 100644 index 000000000000..f34850d587f8 --- /dev/null +++ b/adev/src/app/features/home/components/home-animation/home-animation.component.scss @@ -0,0 +1,397 @@ +@use 'sass:math'; +@use '@angular/docs/styles/media-queries' as mq; + +/* + * Global transition. + * + * Scrolling via mouse scroll wheel will result in a non-continuous scrollY, + * unlike a touchpad, which in turn results in "gaps" in the animation calculations. + * Therefore, in order to keep things smooth, we are systematically adding CSS + * transitions to the CSS properties that else look jagged when scrolling. + */ +$transition: 200ms linear; + +:host { + display: block; + position: relative; + + .animation { + position: fixed; + top: 0; + bottom: 0; + right: 0; + left: 0; + + .layer { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + + h2 { + font-size: 4vw; + font-weight: 600; + white-space: nowrap; + margin-top: 0; + margin-bottom: 0.5em; + z-index: 1; + + @include mq.for-tablet-landscape-down { + & { + font-size: 2rem; + } + } + } + + p { + font-weight: 400; + color: var(--quaternary-contrast); + font-size: clamp(1rem, 1vw, 2rem); + line-height: 1.5; + width: clamp(375px, 50%, 600px); + margin: 0 auto; + } + + h2, + p { + background-color: var(--page-background); + box-shadow: 0 0 20px 20px var(--page-background); + + @include mq.for-desktop-down { + box-shadow: 0 0 10px 10px var(--page-background); + } + } + } + + .banners-layer { + z-index: 10; + + .adev-banner { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 0.5rem; + border: 1px solid var(--senary-contrast); + background: var(--page-background); + position: absolute; + border-radius: 0.25rem; + padding: 10px; + max-width: 100%; + width: fit-content; + box-sizing: border-box; + transition: + background 0.3s ease, + border 0.3s ease, + transform $transition; + top: var(--layout-padding); + left: calc(var(--layout-padding) + var(--primary-nav-width)); + + @include mq.for-tablet-landscape-down { + & { + top: 6rem; + left: var(--layout-padding); + } + } + + @include mq.for-phone-only { + & { + top: 5rem; + } + } + + h1, + p { + display: inline; + font-size: 0.875rem; + margin: 0; + background-image: var(--red-to-pink-to-purple-horizontal-gradient); + background-clip: text; + color: transparent; + width: fit-content; + font-weight: 500; + box-shadow: none; + position: relative; + + &.adev-banner-cta { + color: var(--tertiary-contrast); + + &::after { + content: ''; + position: absolute; + width: 100%; + transform: scaleX(0); + height: 1px; + bottom: -2px; + left: 0; + background: var(--red-to-pink-to-purple-horizontal-gradient); + transform-origin: bottom right; + transition: transform 0.3s ease; + } + } + } + + &:hover { + .adev-banner-cta { + &::after { + transform: scaleX(1); + transform-origin: bottom left; + } + } + } + } + + .learn-angular { + position: absolute; + left: 50%; + bottom: 5%; + transform: translateX(-50%); + transition: opacity $transition; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + gap: 50px; + + button { + font-size: 1rem; + padding: 1rem 1.75rem; + + &::after { + font-size: 1rem; + } + } + + .adev-arrow { + transform: rotate(45deg); + border: solid var(--primary-contrast); + border-width: 0 2px 2px 0; + display: inline-block; + padding: 7px; + } + } + } + + .logo-layer { + user-select: none; + pointer-events: none; + + .svg { + position: absolute; + width: 100%; + height: 100%; + fill-rule: evenodd; + clip-rule: evenodd; + stroke-linejoin: round; + stroke-miterlimit: 2; + } + + .wrapper { + transform: scale(0.55); + transform-origin: 50% 50%; + + @include mq.for-tablet-down { + & { + transform: scale(0.8); + } + } + + @include mq.for-big-desktop-up { + & { + transform: scale(0.5); + } + } + + .logo { + transition: transform $transition; + + .shield { + /* `transform-origin` values are calculated based on the 1280x400 SVG view box */ + + &, + .shield-middle { + transform-origin: 177px 200px; + transition: transform $transition; + } + + .shield-bottom-a-arc { + transform-origin: 0 302px; + transition: transform $transition; + } + + .shield-bottom-extension { + transform-origin: 177px 340px; + transition: transform $transition; + transform: scale(0); + } + } + + .letter { + transition: opacity $transition; + } + } + } + } + + .uwu-layer { + display: flex; + align-items: center; + justify-content: center; + transition: + transform $transition, + opacity $transition; + + img { + user-select: none; + width: max(calc(700 * min(100vw, 2560px) / 1470), 350px); + height: auto; + } + } + + .works-at-any-scale-layer, + .loved-by-millions-layer, + .build-for-everyone-layer { + user-select: none; + pointer-events: none; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; + opacity: 0; + z-index: 1; + transition: + transform $transition, + opacity $transition; + } + + .works-at-any-scale-layer { + transform: scale(0); + } + + .loved-by-millions-layer, + .build-for-everyone-layer { + transform: scale(0.75); + } + + .build-for-everyone-layer { + .title { + color: transparent; + display: inline-block; + background: linear-gradient(110deg, #f31a5b 0, #8737e9 50%, #3a373f 0%); + background-size: 205% 100%; + background-clip: text; + background-size: 205% 100%; + background-position-x: 100%; + transition: background-position-x $transition; + } + } + + .meteor-field-layer { + overflow: hidden; + + .field { + --math-pi: #{math.$pi}rad; + + position: absolute; + flex-wrap: wrap; + align-content: flex-start; + gap: var(--meteor-gap); + display: none; + transform: scale(1.42); + top: 0; + left: 0; + transform-origin: 50% 50%; + transition: + opacity $transition, + transform $transition; + + .meteor { + position: relative; + width: var(--meteor-width); + height: var(--meteor-height); + opacity: 0; + transform: translate(200%, 200%) scale(0.3); + transition: + opacity $transition, + transform $transition; + + &::after { + content: ''; + position: absolute; + width: 4px; + height: var(--meteor-tail-length); + border-radius: 2px; + transform-origin: top center; + transform: rotate(var(--meteor-tilt-angle)); + top: 0; + left: 0; + } + + @mixin meteor-gradient($startColor, $endColor) { + background: linear-gradient( + calc(var(--math-pi) + var(--meteor-tilt-angle)), + $startColor 0, + $endColor 66%, + transparent 100% + ); + } + + &.type-1::after { + @include meteor-gradient(rgb(228, 49, 85), rgb(219, 64, 219)); + } + + &.type-2::after { + @include meteor-gradient(rgb(152, 56, 226), rgb(217, 18, 167)); + } + + &.type-3::after { + @include meteor-gradient(rgb(214, 53, 150), rgb(229, 91, 229)); + } + } + } + } + + &.reduced-motion { + position: relative; + + .banners-layer { + height: 100vh; + + @include mq.for-phone-only { + .adev-banner { + top: 6rem; + } + } + + @include mq.for-tablet-landscape-up { + .adev-banner { + left: var(--layout-padding); + } + } + } + + .logo-layer { + position: relative; + height: 100vh; + + @include mq.for-tablet-landscape-down { + margin-top: -75px; + } + } + + .works-at-any-scale-layer, + .loved-by-millions-layer, + .build-for-everyone-layer { + position: relative; + height: 120vh; + opacity: 1; + transform: scale(1); + } + + .build-for-everyone-layer > .title { + background-position-x: 0; + } + } + } +} diff --git a/adev/src/app/features/home/components/home-animation/home-animation.component.ts b/adev/src/app/features/home/components/home-animation/home-animation.component.ts new file mode 100644 index 000000000000..dd7f8fdd0891 --- /dev/null +++ b/adev/src/app/features/home/components/home-animation/home-animation.component.ts @@ -0,0 +1,178 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { + afterNextRender, + ChangeDetectionStrategy, + Component, + ElementRef, + inject, + Injector, + input, + OnDestroy, + output, + signal, + viewChildren, +} from '@angular/core'; +import {RouterLink} from '@angular/router'; +import {WINDOW, isIos, shouldReduceMotion} from '@angular/docs'; + +import {Animation, AnimationCreatorService, AnimationLayerDirective} from '../../animation'; +import {AnimationScrollHandler} from '../../animation/plugins/animation-scroll-handler'; +import {generateHomeAnimationDefinition, ANIM_TIMESTEP} from './animation-definition'; + +export const METEOR_HW_RATIO = 1.42; // Height to width ratio +export const METEOR_GAP_RATIO = 1.33; // Use 0.7 for WebGL-like field. Renders a lot of elements though. + +// A map with screen size to meteor width +export const METEOR_WIDTH_MAP = [ + [800, 60], + [1100, 90], +]; + +export const METEOR_WIDTH_DEFAULT = 120; // For screens larger than 1100px + +type MeteorDimensions = { + width: number; + height: number; + tailLength: number; + gap: number; + tiltAngle: number; // In radians +}; + +type MeteorFieldData = { + width: number; + height: number; + count: number; + marginLeft: number; + marginTop: number; +}; + +@Component({ + selector: 'adev-home-animation', + imports: [AnimationLayerDirective, RouterLink], + templateUrl: './home-animation.component.html', + styleUrl: './home-animation.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [AnimationCreatorService], +}) +export class HomeAnimationComponent implements OnDestroy { + private readonly win = inject(WINDOW); + private readonly animCreator = inject(AnimationCreatorService); + private readonly injector = inject(Injector); + private readonly elementRef = inject(ElementRef); + private animation?: Animation; + + readonly animationLayers = viewChildren(AnimationLayerDirective); + + readonly ctaLink = isIos ? 'overview' : 'tutorials/learn-angular'; + + readonly isUwu = input.required(); + readonly ready = output(); + + readonly reducedMotion = signal(shouldReduceMotion()); + readonly meteorFieldData = signal(null); + readonly meteors = signal([]); + + constructor() { + if (!this.reducedMotion()) { + this.initAnimation(); + } else { + this.ready.emit(true); + } + } + + ngOnDestroy() { + this.animation?.dispose(); + } + + private initAnimation() { + // Limitation: Meteor dimensions won't change on page resize + const meteorDimensions = this.calculateMeteorDimensions(); + const data = this.calculateMeteorFieldData(meteorDimensions); + this.setCssVariables(meteorDimensions); + this.meteorFieldData.set(data); + + // Generate a meteor field. The number represents the type [1, 3] + this.meteors.set(new Array(data.count).fill(1).map(() => Math.round(Math.random() * 2 + 1))); + + afterNextRender({ + read: () => { + this.animation = this.animCreator + .createAnimation(this.animationLayers(), { + timestep: ANIM_TIMESTEP, + }) + .define(generateHomeAnimationDefinition(this.isUwu(), this.meteors().length)) + .addPlugin(new AnimationScrollHandler(this.elementRef, this.injector)); + + this.ready.emit(true); + }, + }); + } + + /** Calculte the dimensions and sizes of a meteor – width, height, tail, tilt angle, etc. */ + private calculateMeteorDimensions(): MeteorDimensions { + let width = METEOR_WIDTH_DEFAULT; + + for (const [screenSize, meteorWidth] of METEOR_WIDTH_MAP) { + if (this.win.innerWidth <= screenSize) { + width = meteorWidth; + } + } + + const height = width * METEOR_HW_RATIO; + const gap = width * METEOR_GAP_RATIO; + + // Pythagorean theorem + some trigonometry + const tailLength = Math.sqrt(width * width + height * height); + const tiltAngle = -Math.asin(width / tailLength); + + return { + width, + height, + gap, + tailLength, + tiltAngle, + }; + } + + /** Calculate the number of meteors and size of the field. */ + private calculateMeteorFieldData(meteorDim: MeteorDimensions): MeteorFieldData { + const mW = meteorDim.width + meteorDim.gap; + const mH = meteorDim.height + meteorDim.gap; + let rows = 1; + let cols = 1; + + while (cols * mW - meteorDim.gap <= this.win.innerWidth) { + cols++; + } + while (rows * mH - meteorDim.gap <= this.win.innerHeight) { + rows++; + } + + const width = cols * mW - meteorDim.gap; + const height = rows * mH - meteorDim.gap; + + return { + count: rows * cols, + width, + height, + marginLeft: -(width - this.win.innerWidth) / 2, + marginTop: -(height - this.win.innerHeight) / 2, + }; + } + + private setCssVariables({width, height, tailLength, tiltAngle, gap}: MeteorDimensions) { + const styleRef = this.elementRef.nativeElement.style; + styleRef.setProperty('--meteor-width', width + 'px'); + styleRef.setProperty('--meteor-height', height + 'px'); + styleRef.setProperty('--meteor-tail-length', tailLength + 'px'); + styleRef.setProperty('--meteor-tilt-angle', tiltAngle + 'rad'); + styleRef.setProperty('--meteor-gap', gap + 'px'); + } +} diff --git a/adev/src/app/features/home/components/home-editor.component.ts b/adev/src/app/features/home/components/home-editor.component.ts index d8e2cf7f25ec..b65a9adde849 100644 --- a/adev/src/app/features/home/components/home-editor.component.ts +++ b/adev/src/app/features/home/components/home-editor.component.ts @@ -17,10 +17,13 @@ import { OnInit, } from '@angular/core'; import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; -import {forkJoin} from 'rxjs'; +import {forkJoin, switchMap} from 'rxjs'; -import {injectAsync} from '../../../core/services/inject-async'; -import {EmbeddedEditor, EmbeddedTutorialManager} from '../../../editor'; +import { + EmbeddedEditor, + injectEmbeddedTutorialManager, + injectNodeRuntimeSandbox, +} from '../../../editor'; @Component({ selector: 'adev-code-editor', @@ -32,7 +35,6 @@ import {EmbeddedEditor, EmbeddedTutorialManager} from '../../../editor'; }) export class CodeEditorComponent implements OnInit { private readonly cdRef = inject(ChangeDetectorRef); - private readonly embeddedTutorialManager = inject(EmbeddedTutorialManager); private readonly environmentInjector = inject(EnvironmentInjector); private readonly destroyRef = inject(DestroyRef); @@ -47,13 +49,18 @@ export class CodeEditorComponent implements OnInit { // and completed, which can lead to a memory leak if the user navigates away from // this component to another page. forkJoin([ - injectAsync(this.environmentInjector, () => - import('../../../editor/index').then((c) => c.NodeRuntimeSandbox), - ), - this.embeddedTutorialManager.fetchAndSetTutorialFiles(this.tutorialFiles), + injectNodeRuntimeSandbox(this.environmentInjector), + injectEmbeddedTutorialManager(this.environmentInjector), ]) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(([nodeRuntimeSandbox]) => { + .pipe( + switchMap(([nodeRuntimeSandbox, embeddedTutorialManager]) => + embeddedTutorialManager + .fetchAndSetTutorialFiles(this.tutorialFiles) + .then(() => nodeRuntimeSandbox), + ), + takeUntilDestroyed(this.destroyRef), + ) + .subscribe((nodeRuntimeSandbox) => { this.cdRef.markForCheck(); nodeRuntimeSandbox.init(); }); diff --git a/adev/src/app/features/home/components/programs/basic-program.ts b/adev/src/app/features/home/components/programs/basic-program.ts deleted file mode 100644 index c0f3c9115313..000000000000 --- a/adev/src/app/features/home/components/programs/basic-program.ts +++ /dev/null @@ -1,37 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {OGLRenderingContext, Program, Texture} from 'ogl'; - -import BasicShader from '../shaders/basic-shader'; - -const {vertex100, fragment100, vertex300, fragment300} = BasicShader; - -/** - * Basic texture map shader program with alpha channel for the "Build for everyone" heading. - * - * @see {@link BasicShader} for the GLSL shader. - */ -export class BasicProgram extends Program { - /** - * Create the shader program. - */ - constructor(gl: OGLRenderingContext, texture: Texture) { - super(gl, { - uniforms: { - tMap: {value: texture}, - uAlpha: {value: 1}, - }, - vertex: gl.renderer.isWebgl2 ? vertex300 : vertex100, - fragment: gl.renderer.isWebgl2 ? fragment300 : fragment100, - transparent: true, - depthTest: false, - depthWrite: false, - }); - } -} diff --git a/adev/src/app/features/home/components/programs/glyph-program.ts b/adev/src/app/features/home/components/programs/glyph-program.ts deleted file mode 100644 index 60596b2de769..000000000000 --- a/adev/src/app/features/home/components/programs/glyph-program.ts +++ /dev/null @@ -1,43 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {Color, OGLRenderingContext, Program, Texture} from 'ogl'; - -import GlyphShader from '../shaders/glyph-shader'; - -const {vertex100, fragment100, vertex300, fragment300} = GlyphShader; - -/** - * Multi-channel signed distance field (MSDF) shader program for the inner triangle and "Angular" - * letters of the logo, and the "Build for everyone" heading. - * - * Textures generated with `msdfgen`, which includes support for advanced SVG decoding: - * `msdfgen -svg logo-lockup.svg -o logo-lockup-msdf.png -size 700 172 -testrender logo-lockup-render.png 700 172` - * `msdfgen -svg build-for-everyone.svg -o build-msdf.png -size 433 58 -autoframe -testrender build-render.png 433 58` - * - * @see {@link GlyphShader} for the GLSL shader. - */ -export class GlyphProgram extends Program { - /** - * Create the shader program. - */ - constructor(gl: OGLRenderingContext, texture: Texture, color: Color) { - super(gl, { - uniforms: { - tMap: {value: texture}, - uColor: {value: color}, - uAlpha: {value: 1}, - }, - vertex: gl.renderer.isWebgl2 ? vertex300 : vertex100, - fragment: gl.renderer.isWebgl2 ? fragment300 : fragment100, - transparent: true, - depthTest: false, - depthWrite: false, - }); - } -} diff --git a/adev/src/app/features/home/components/programs/gradient-program.ts b/adev/src/app/features/home/components/programs/gradient-program.ts deleted file mode 100644 index fa8629156040..000000000000 --- a/adev/src/app/features/home/components/programs/gradient-program.ts +++ /dev/null @@ -1,41 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {Color, OGLRenderingContext, Program, Texture} from 'ogl'; - -import GradientShader from '../shaders/gradient-shader'; - -const {vertex100, fragment100, vertex300, fragment300} = GradientShader; - -/** - * Gradient shader program for the background of the Angular logo. - * - * @see {@link GradientShader} for the GLSL shader. - */ -export class GradientProgram extends Program { - /** - * Create the shader program. - */ - constructor(gl: OGLRenderingContext, texture: Texture, window: Window) { - super(gl, { - uniforms: { - tMap: {value: texture}, - uGrayColor: {value: new Color(0xa39fa9)}, - uProgress: {value: 0}, - uAlpha: {value: 1}, - uDebug: {value: /[?&]gradient/.test(window.location.search) ? 1 : 0}, - uTime: {value: 0}, - }, - vertex: gl.renderer.isWebgl2 ? vertex300 : vertex100, - fragment: gl.renderer.isWebgl2 ? fragment300 : fragment100, - transparent: true, - depthTest: false, - depthWrite: false, - }); - } -} diff --git a/adev/src/app/features/home/components/programs/line-glyph-program.ts b/adev/src/app/features/home/components/programs/line-glyph-program.ts deleted file mode 100644 index 227958eaba9e..000000000000 --- a/adev/src/app/features/home/components/programs/line-glyph-program.ts +++ /dev/null @@ -1,43 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {Color, OGLRenderingContext, Program, Texture} from 'ogl'; - -import LineGlyphShader from '../shaders/line-glyph-shader'; - -const {vertex100, fragment100, vertex300, fragment300} = LineGlyphShader; - -/** - * Multi-channel signed distance field (MSDF) shader program for a line instance. - * - * Textures generated with `msdfgen`, which includes support for advanced SVG decoding: - * `msdfgen -svg line.svg -o line-msdf.png -size 235 300 -testrender line-render.png 235 300` - * - * @see {@link LineGlyphShader} for the GLSL shader. - */ -export class LineGlyphProgram extends Program { - /** - * Create the shader program. - */ - constructor(gl: OGLRenderingContext, texture: Texture) { - super(gl, { - uniforms: { - tMap: {value: texture}, - uPinkColor: {value: [new Color(0xf65fe3), new Color(0x873df5)]}, - uPurpleColor: {value: [new Color(0xb666f2), new Color(0xea3a8a)]}, - uRedColor: {value: [new Color(0xe92d64), new Color(0xf469e4)]}, - uTime: {value: 0}, - }, - vertex: gl.renderer.isWebgl2 ? vertex300 : vertex100, - fragment: gl.renderer.isWebgl2 ? fragment300 : fragment100, - transparent: true, - depthTest: false, - depthWrite: false, - }); - } -} diff --git a/adev/src/app/features/home/components/programs/logo-program.ts b/adev/src/app/features/home/components/programs/logo-program.ts deleted file mode 100644 index 46a18b006bef..000000000000 --- a/adev/src/app/features/home/components/programs/logo-program.ts +++ /dev/null @@ -1,38 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {Color, OGLRenderingContext, Program} from 'ogl'; - -import LogoShader from '../shaders/logo-shader'; - -const {vertex100, fragment100, vertex300, fragment300} = LogoShader; - -/** - * Signed distance field (SDF) shader program for the outer polygons of the logo. - * - * @see {@link LogoShader} for the GLSL shader. - */ -export class LogoProgram extends Program { - /** - * Create the shader program. - */ - constructor(gl: OGLRenderingContext, color: Color) { - super(gl, { - uniforms: { - uColor: {value: color}, - uProgress: {value: 0}, - uAlpha: {value: 1}, - }, - vertex: gl.renderer.isWebgl2 ? vertex300 : vertex100, - fragment: gl.renderer.isWebgl2 ? fragment300 : fragment100, - transparent: true, - depthTest: false, - depthWrite: false, - }); - } -} diff --git a/adev/src/app/features/home/components/programs/mask-program.ts b/adev/src/app/features/home/components/programs/mask-program.ts deleted file mode 100644 index 6be4284a002c..000000000000 --- a/adev/src/app/features/home/components/programs/mask-program.ts +++ /dev/null @@ -1,41 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {OGLRenderingContext, Program} from 'ogl'; - -import MaskShader from '../shaders/mask-shader'; - -const {vertex100, fragment100, vertex300, fragment300} = MaskShader; - -/** - * Alpha mask shader program for the Angular logo. - * - * Uses the green channel of the mask texture as the output alpha channel of the gradient map - * texture, creating a mask of the logo with the gradient background inside the logo. - * - * @see {@link MaskShader} for the GLSL shader. - */ -export class MaskProgram extends Program { - /** - * Create the shader program. - */ - constructor(gl: OGLRenderingContext, window: Window) { - super(gl, { - uniforms: { - tMap: {value: null}, - tMask: {value: null}, - uDebug: {value: /[?&]debug|gradient/.test(window.location.search) ? 1 : 0}, - }, - vertex: gl.renderer.isWebgl2 ? vertex300 : vertex100, - fragment: gl.renderer.isWebgl2 ? fragment300 : fragment100, - transparent: true, - depthTest: false, - depthWrite: false, - }); - } -} diff --git a/adev/src/app/features/home/components/shaders/basic-shader.ts b/adev/src/app/features/home/components/shaders/basic-shader.ts deleted file mode 100644 index 6163d4401b19..000000000000 --- a/adev/src/app/features/home/components/shaders/basic-shader.ts +++ /dev/null @@ -1,58 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -const vertex = /* glsl */ ` -attribute vec3 position; -attribute vec2 uv; - -uniform mat4 modelViewMatrix; -uniform mat4 projectionMatrix; - -varying vec2 vUv; - -void main() { - vUv = uv; - - gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); -} -`; - -const fragment = /* glsl */ ` -precision highp float; - -uniform sampler2D tMap; -uniform float uAlpha; - -varying vec2 vUv; - -void main() { - gl_FragColor = texture2D(tMap, vUv); - gl_FragColor.a *= uAlpha; -} -`; - -export default { - vertex100: vertex, - - fragment100: /* glsl */ `#extension GL_OES_standard_derivatives : enable -precision highp float; -${fragment}`, - - vertex300: /* glsl */ `#version 300 es -#define attribute in -#define varying out -${vertex}`, - - fragment300: /* glsl */ `#version 300 es -precision highp float; -#define varying in -#define texture2D texture -#define gl_FragColor FragColor -out vec4 FragColor; -${fragment}`, -}; diff --git a/adev/src/app/features/home/components/shaders/glyph-shader.ts b/adev/src/app/features/home/components/shaders/glyph-shader.ts deleted file mode 100644 index eb48fd0f8fd1..000000000000 --- a/adev/src/app/features/home/components/shaders/glyph-shader.ts +++ /dev/null @@ -1,70 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import msdf from './modules/msdf/msdf.glsl'; - -const vertex = /* glsl */ ` -attribute vec3 position; -attribute vec2 uv; - -uniform mat4 modelViewMatrix; -uniform mat4 projectionMatrix; - -varying vec2 vUv; - -void main() { - vUv = uv; - - gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); -} -`; - -const fragment = /* glsl */ ` -precision highp float; - -uniform sampler2D tMap; -uniform vec3 uColor; -uniform float uAlpha; - -varying vec2 vUv; - -${msdf} - -void main() { - float alpha = msdf(tMap, vUv); - alpha *= uAlpha; - - if (alpha < 0.01) { - discard; - } - - gl_FragColor.rgb = uColor; - gl_FragColor.a = alpha; -} -`; - -export default { - vertex100: vertex, - - fragment100: /* glsl */ `#extension GL_OES_standard_derivatives : enable -precision highp float; -${fragment}`, - - vertex300: /* glsl */ `#version 300 es -#define attribute in -#define varying out -${vertex}`, - - fragment300: /* glsl */ `#version 300 es -precision highp float; -#define varying in -#define texture2D texture -#define gl_FragColor FragColor -out vec4 FragColor; -${fragment}`, -}; diff --git a/adev/src/app/features/home/components/shaders/gradient-shader.ts b/adev/src/app/features/home/components/shaders/gradient-shader.ts deleted file mode 100644 index 15d229bd4670..000000000000 --- a/adev/src/app/features/home/components/shaders/gradient-shader.ts +++ /dev/null @@ -1,112 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import sineInOut from './modules/easing/sine-in-out.glsl'; - -const vertex = /* glsl */ ` -attribute vec3 position; -attribute vec2 uv; - -uniform mat4 modelViewMatrix; -uniform mat4 projectionMatrix; - -varying vec2 vUv; - -void main() { - vUv = uv; - - gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); -} -`; - -const fragment = /* glsl */ ` -precision highp float; - -uniform sampler2D tMap; -uniform vec3 uGrayColor; -uniform float uProgress; -uniform float uAlpha; -uniform float uDebug; -uniform float uTime; - -varying vec2 vUv; - -${sineInOut} - -void main() { - float time = fract(uTime / 6.0); - float t = abs(2.0 * time - 1.0); - - // Rotation starts at 35.642°, 3 sec 180° and 6 sec 360° - float currentAngle = 35.642 + time * 360.0; - - vec2 uv = vUv; - uv.x -= 0.1 * (1.0 - sineInOut(t)); - - vec2 origin = vec2(0.5, 0.5); - uv -= origin; - - float angle = radians(currentAngle) + atan(uv.y, uv.x); - - float len = length(uv); - uv = vec2(cos(angle) * len, sin(angle) * len) + origin; - - gl_FragColor = texture2D(tMap, uv); - - if (uDebug == 1.0) { - // Anti-aliased outer circle - float radius = 0.5; - float d = fwidth(len); - float circle = smoothstep(radius - d, radius + d, len); - - gl_FragColor.a = (1.0 - circle) * uAlpha; - - // Anti-aliased center point - radius = 0.005; - circle = smoothstep(radius - d, radius + d, len); - - gl_FragColor.rgb = mix(vec3(1), gl_FragColor.rgb, circle); - } else { - gl_FragColor.a *= uAlpha; - } - - if (uProgress > 0.0) { - // Anti-aliased gray unfilled angle - float theta = radians(20.0); - uv = vec2(cos(theta) * vUv.x - sin(theta) * vUv.y, - sin(theta) * vUv.x + cos(theta) * vUv.y); - - float progress = 2.0 * uProgress - 1.0; - float d = 0.001; - float angle = smoothstep(uv.x - d, uv.x + d, progress); - - gl_FragColor.rgb = mix(uGrayColor, gl_FragColor.rgb, angle); - } -} -`; - -export default { - vertex100: vertex, - - fragment100: /* glsl */ `#extension GL_OES_standard_derivatives : enable -precision highp float; -${fragment}`, - - vertex300: /* glsl */ `#version 300 es -#define attribute in -#define varying out -${vertex}`, - - fragment300: /* glsl */ `#version 300 es -precision highp float; -#define varying in -#define texture2D texture -#define gl_FragColor FragColor -out vec4 FragColor; -${fragment}`, -}; diff --git a/adev/src/app/features/home/components/shaders/line-glyph-shader.ts b/adev/src/app/features/home/components/shaders/line-glyph-shader.ts deleted file mode 100644 index 0395edb6d44e..000000000000 --- a/adev/src/app/features/home/components/shaders/line-glyph-shader.ts +++ /dev/null @@ -1,108 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import msdf from './modules/msdf/msdf.glsl'; - -const vertex = /* glsl */ ` -attribute vec3 position; -attribute vec2 uv; - -uniform mat4 modelViewMatrix; -uniform mat4 projectionMatrix; - -attribute mat4 instanceMatrix; -attribute float instanceColorIndex; -attribute float instanceRandom; -attribute float instanceOpacity; - -uniform vec3 uPinkColor[2]; -uniform vec3 uPurpleColor[2]; -uniform vec3 uRedColor[2]; - -varying vec2 vUv; -varying vec3 vColor[2]; -varying float vInstanceRandom; -varying float vInstanceOpacity; - -void main() { - vUv = uv; - - if (instanceColorIndex == 0.0) { - vColor[0] = uPinkColor[0]; - vColor[1] = uPinkColor[1]; - } else if (instanceColorIndex == 1.0) { - vColor[0] = uPurpleColor[0]; - vColor[1] = uPurpleColor[1]; - } else if (instanceColorIndex == 2.0) { - vColor[0] = uRedColor[0]; - vColor[1] = uRedColor[1]; - } - - vInstanceRandom = instanceRandom; - vInstanceOpacity = instanceOpacity; - - gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0); -} -`; - -const fragment = /* glsl */ ` -precision highp float; - -uniform sampler2D tMap; -uniform float uTime; - -varying vec2 vUv; -varying vec3 vColor[2]; -varying float vInstanceRandom; -varying float vInstanceOpacity; - -${msdf} - -void main() { - float alpha = msdf(tMap, vUv); - alpha *= vInstanceOpacity; - - if (alpha < 0.01) { - discard; - } - - vec2 uv = vUv; - uv.x += vInstanceRandom * uTime * 0.5; - - uv.x = fract(uv.x); // Wrap around 1.0 - - // Linear gradient, mirrored for wrapping - vec3 color = mix(vColor[0], vColor[1], smoothstep(0.0, 0.3333, uv.x)); - color = mix(color, vColor[1], smoothstep(0.3333, 0.6666, uv.x)); - color = mix(color, vColor[0], smoothstep(0.6666, 1.0, uv.x)); - - gl_FragColor.rgb = color; - gl_FragColor.a = smoothstep(1.0, 0.3333, vUv.x) * alpha; -} -`; - -export default { - vertex100: vertex, - - fragment100: /* glsl */ `#extension GL_OES_standard_derivatives : enable -precision highp float; -${fragment}`, - - vertex300: /* glsl */ `#version 300 es -#define attribute in -#define varying out -${vertex}`, - - fragment300: /* glsl */ `#version 300 es -precision highp float; -#define varying in -#define texture2D texture -#define gl_FragColor FragColor -out vec4 FragColor; -${fragment}`, -}; diff --git a/adev/src/app/features/home/components/shaders/logo-shader.ts b/adev/src/app/features/home/components/shaders/logo-shader.ts deleted file mode 100644 index ab58b310760c..000000000000 --- a/adev/src/app/features/home/components/shaders/logo-shader.ts +++ /dev/null @@ -1,103 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import sdPolygon from './modules/sdf-primitives/sd-polygon.glsl'; - -const vertex = /* glsl */ ` -attribute vec3 position; -attribute vec2 uv; - -uniform mat4 modelViewMatrix; -uniform mat4 projectionMatrix; - -varying vec2 vUv; - -void main() { - vUv = uv; - - gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); -} -`; - -const fragment = /* glsl */ ` -precision highp float; - -uniform vec3 uColor; -uniform float uProgress; -uniform float uAlpha; - -varying vec2 vUv; - -#define MAX_NUM_VERTICES 5 - -${sdPolygon} - -void main() { - // Polygon animation - vec2[MAX_NUM_VERTICES] bottom; - bottom[0] = vec2(0.292446808510638, 1.0 - mix(0.7381, 0.7781, uProgress)); - bottom[1] = vec2(mix(0.239468085106383, 0.133085106382979, uProgress), 1.0 - mix(0.8592, 0.7781, uProgress)); - bottom[2] = vec2(0.50031914893617, 1.0 - 1.0); - bottom[3] = vec2(mix(0.761170212765957, 0.867553191489362, uProgress), 1.0 - mix(0.8592, 0.7781, uProgress)); - bottom[4] = vec2(0.707553191489362, 1.0 - mix(0.7381, 0.7781, uProgress)); - - vec2[MAX_NUM_VERTICES] right; - right[0] = vec2(mix(0.618404255319149, 0.597127659574468, uProgress), 1.0 - 0.0); - right[1] = vec2(0.964042553191489, 1.0 - mix(0.7023, 0.6623, uProgress)); - right[2] = vec2(1.0, 1.0 - 0.1665); - - vec2[MAX_NUM_VERTICES] left; - left[0] = vec2(mix(0.381595744680851, 0.402872340425532, uProgress), 1.0 - 0.0); - left[1] = vec2(0.035957446808511, 1.0 - mix(0.7023, 0.6623, uProgress)); - left[2] = vec2(0.0, 1.0 - 0.1665); - - float sdBottom = sdPolygon(vUv, bottom, 5); - float sdRight = sdPolygon(vUv, right, 3); - float sdLeft = sdPolygon(vUv, left, 3); - - // Anti-alias - float dBottom = fwidth(sdBottom); - float alphaBottom = smoothstep(dBottom, -dBottom, sdBottom); - float dRight = fwidth(sdRight); - float alphaRight = smoothstep(dRight, -dRight, sdRight); - float dLeft = fwidth(sdLeft); - float alphaLeft = smoothstep(dLeft, -dLeft, sdLeft); - - float alpha = max(alphaBottom, alphaRight); - alpha = max(alpha, alphaLeft); - alpha *= uAlpha; - - if (alpha < 0.01) { - discard; - } - - gl_FragColor.rgb = uColor; - gl_FragColor.a = alpha; -} -`; - -export default { - vertex100: vertex, - - fragment100: /* glsl */ `#extension GL_OES_standard_derivatives : enable -precision highp float; -${fragment}`, - - vertex300: /* glsl */ `#version 300 es -#define attribute in -#define varying out -${vertex}`, - - fragment300: /* glsl */ `#version 300 es -precision highp float; -#define varying in -#define texture2D texture -#define gl_FragColor FragColor -out vec4 FragColor; -${fragment}`, -}; diff --git a/adev/src/app/features/home/components/shaders/mask-shader.ts b/adev/src/app/features/home/components/shaders/mask-shader.ts deleted file mode 100644 index f8cb8d05d8af..000000000000 --- a/adev/src/app/features/home/components/shaders/mask-shader.ts +++ /dev/null @@ -1,60 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -const vertex = /* glsl */ ` -attribute vec3 position; -attribute vec2 uv; - -varying vec2 vUv; - -void main() { - vUv = uv; - - gl_Position = vec4(position, 1.0); -} -`; - -const fragment = /* glsl */ ` -precision highp float; - -uniform sampler2D tMap; -uniform sampler2D tMask; -uniform float uDebug; - -varying vec2 vUv; - -void main() { - if (uDebug == 1.0) { - gl_FragColor = max(texture2D(tMap, vUv), texture2D(tMask, vUv)); - } else { - gl_FragColor = texture2D(tMap, vUv); - gl_FragColor.a = texture2D(tMask, vUv).g; - } -} -`; - -export default { - vertex100: vertex, - - fragment100: /* glsl */ `#extension GL_OES_standard_derivatives : enable -precision highp float; -${fragment}`, - - vertex300: /* glsl */ `#version 300 es -#define attribute in -#define varying out -${vertex}`, - - fragment300: /* glsl */ `#version 300 es -precision highp float; -#define varying in -#define texture2D texture -#define gl_FragColor FragColor -out vec4 FragColor; -${fragment}`, -}; diff --git a/adev/src/app/features/home/components/shaders/modules/msdf/msdf.glsl.ts b/adev/src/app/features/home/components/shaders/modules/msdf/msdf.glsl.ts deleted file mode 100644 index bda8ed20fe29..000000000000 --- a/adev/src/app/features/home/components/shaders/modules/msdf/msdf.glsl.ts +++ /dev/null @@ -1,16 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -export default /* glsl */ ` -float msdf(sampler2D image, vec2 uv) { - vec3 tex = texture2D(image, uv).rgb; - float signedDist = max(min(tex.r, tex.g), min(max(tex.r, tex.g), tex.b)) - 0.5; - float d = fwidth(signedDist); - return smoothstep(-d, d, signedDist); -} -`; diff --git a/adev/src/app/features/home/components/shaders/modules/sdf-primitives/sd-polygon.glsl.ts b/adev/src/app/features/home/components/shaders/modules/sdf-primitives/sd-polygon.glsl.ts deleted file mode 100644 index 46f020ba8ba5..000000000000 --- a/adev/src/app/features/home/components/shaders/modules/sdf-primitives/sd-polygon.glsl.ts +++ /dev/null @@ -1,27 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -export default /* glsl */ ` -#ifndef MAX_NUM_VERTICES -#define MAX_NUM_VERTICES 5 -#endif - -float sdPolygon(vec2 p, vec2[MAX_NUM_VERTICES] v, int num) { - float d = dot(p - v[0], p - v[0]); - float s = 1.0; - for (int i = 0, j = num - 1; i < num; j = i, i++) { - vec2 e = v[j] - v[i]; - vec2 w = p - v[i]; - vec2 b = w - e * clamp(dot(w, e) / dot(e, e), 0.0, 1.0); - d = min(d, dot(b, b)); - bvec3 cond = bvec3(p.y >= v[i].y, p.y < v[j].y, e.x * w.y > e.y * w.x); - if (all(cond) || all(not(cond))) s = -s; - } - return s * sqrt(d); -} -`; diff --git a/adev/src/app/features/home/components/views/angular-glyph.ts b/adev/src/app/features/home/components/views/angular-glyph.ts deleted file mode 100644 index 3267f33739ea..000000000000 --- a/adev/src/app/features/home/components/views/angular-glyph.ts +++ /dev/null @@ -1,89 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {Color, Mesh, OGLRenderingContext, Plane, Texture, Vec2} from 'ogl'; - -import {View} from './view'; -import {GlyphProgram} from '../programs/glyph-program'; - -import {toRadians} from '../../utils/math'; - -/** - * An OGL `Transform` used for the animation of the inner triangle and "Angular" letters of the logo. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class AngularGlyph extends View { - private origin: Vec2; - private mesh!: Mesh; - - /** - * Create a glyph view. - */ - constructor( - private readonly gl: OGLRenderingContext, - private readonly texture: Texture, - private readonly color: Color, - private translate: Vec2 = new Vec2(0.5, -0.5), // Top left - ) { - super(); - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - this.userData['width'] = 700; - this.userData['height'] = 172; - - this.origin = new Vec2( - Math.round(this.userData['width'] * (this.translate.x - 0.5)), - Math.round(this.userData['height'] * (this.translate.y + 0.5)), - ); - - this.translate = new Vec2( - Math.round(this.userData['width'] * this.translate.x), - Math.round(this.userData['height'] * this.translate.y), - ); - - this.init(); - } - - /** - * Initialize geometry, program and mesh for the view. - */ - override init(): void { - const geometry = new Plane(this.gl); - - const program = new GlyphProgram(this.gl, this.texture, this.color); - - const mesh = new Mesh(this.gl, {geometry, program}); - mesh.frustumCulled = false; - mesh.position.set(this.translate.x, this.translate.y, 0); // Offset mesh for transform origin - mesh.scale.set(this.userData['width'], this.userData['height'], 1); - this.addChild(mesh); - - this.mesh = mesh; - } - - /** - * Update position, rotation and scale of the view, and alpha uniform of the program. - */ - override update(): void { - this.position.x = -this.origin.x + this.userData['x']; - this.position.y = -this.origin.y + -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - this.mesh.program.uniforms['uAlpha'].value = - this.userData['opacity'] * this.parent!.userData['opacity']; - } -} diff --git a/adev/src/app/features/home/components/views/angular-logo.ts b/adev/src/app/features/home/components/views/angular-logo.ts deleted file mode 100644 index e40f9bfd8b9e..000000000000 --- a/adev/src/app/features/home/components/views/angular-logo.ts +++ /dev/null @@ -1,91 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {Color, Mesh, OGLRenderingContext, Plane, Vec2} from 'ogl'; - -import {View} from './view'; -import {LogoProgram} from '../programs/logo-program'; - -import {toRadians} from '../../utils/math'; - -/** - * An OGL `Transform` used for the animation of the outer polygons of the logo. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class AngularLogo extends View { - private origin: Vec2; - private mesh!: Mesh; - - /** - * Create the logo view. - */ - constructor( - private readonly gl: OGLRenderingContext, - private readonly color: Color, - private translate: Vec2 = new Vec2(), // Center - ) { - super(); - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - this.userData['width'] = 158.6; - this.userData['height'] = 168; - this.userData['progress'] = 0; - - this.origin = new Vec2( - Math.round(this.userData['width'] * (this.translate.x - 0.5)), - Math.round(this.userData['height'] * (this.translate.y + 0.5)), - ); - - this.translate = new Vec2( - Math.round(this.userData['width'] * this.translate.x), - Math.round(this.userData['height'] * this.translate.y), - ); - - this.init(); - } - - /** - * Initialize geometry, program and mesh for the view. - */ - override init(): void { - const geometry = new Plane(this.gl); - - const program = new LogoProgram(this.gl, this.color); - - const mesh = new Mesh(this.gl, {geometry, program}); - mesh.frustumCulled = false; - mesh.position.set(this.translate.x, this.translate.y, 0); // Offset mesh for transform origin - mesh.scale.set(this.userData['width'], this.userData['height'], 1); - this.addChild(mesh); - - this.mesh = mesh; - } - - /** - * Update position, rotation and scale of the view, and progress and alpha uniforms of the - * program. - */ - override update(): void { - this.position.x = -this.origin.x + this.userData['x']; - this.position.y = -this.origin.y + -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - this.mesh.program.uniforms['uProgress'].value = this.userData['progress']; - this.mesh.program.uniforms['uAlpha'].value = - this.userData['opacity'] * this.parent!.userData['opacity']; - } -} diff --git a/adev/src/app/features/home/components/views/angular-view.ts b/adev/src/app/features/home/components/views/angular-view.ts deleted file mode 100644 index 8e97092384c9..000000000000 --- a/adev/src/app/features/home/components/views/angular-view.ts +++ /dev/null @@ -1,63 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import type {OGLRenderingContext} from 'ogl'; - -import {View} from './view'; -import {Angular} from './angular'; - -/** - * An OGL `Transform` used for the top-level view of the Angular logo mask. - */ -export class AngularView extends View { - wordmark!: Angular; - - /** - * Create the mask view. - */ - constructor(private readonly gl: OGLRenderingContext) { - super(); - - this.visible = false; - - this.userData['visible'] = this.visible; - - this.init(); - } - - /** - * Initialize child views. - */ - override init(): void { - this.wordmark = new Angular(this.gl); - this.addChild(this.wordmark); - } - - /** - * Resize the child views. - */ - override resize(width: number, height: number, dpr: number, scale: number): void { - this.wordmark.resize(width, height, dpr, scale); - } - - /** - * Update the child views. - */ - override update(): void { - this.visible = this.userData['visible']; - - this.wordmark.update(); - } - - /** - * Promise for the child views when they're ready. - */ - override ready(): Promise { - return this.wordmark.init(); - } -} diff --git a/adev/src/app/features/home/components/views/angular.ts b/adev/src/app/features/home/components/views/angular.ts deleted file mode 100644 index 57c183cd89d4..000000000000 --- a/adev/src/app/features/home/components/views/angular.ts +++ /dev/null @@ -1,108 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {Color, OGLRenderingContext, Vec2} from 'ogl'; - -import {AngularGlyph} from './angular-glyph'; -import {AngularLogo} from './angular-logo'; -import {View} from './view'; - -import {toRadians} from '../../utils/math'; -import {loadTexture} from '../../utils/ogl'; - -/** - * An OGL `Transform` used for the animation of the Angular logo. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class Angular extends View { - private viewWidth = 700; - private viewHeight = 172; - private viewScale = 1; - private origin: Vec2; - - /** - * Create the Angular logo view. - */ - constructor(private readonly gl: OGLRenderingContext) { - super(); - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - - this.origin = new Vec2(); - } - - /** - * Initialize child views. - */ - override async init(): Promise { - const logo = new AngularLogo(this.gl, new Color(1, 1, 1)); - this.addChild(logo); - - const msdf = await Promise.all([ - loadTexture(this.gl, 'assets/textures/logo-2-msdf.png'), - loadTexture(this.gl, 'assets/textures/logo-3-msdf.png'), - loadTexture(this.gl, 'assets/textures/logo-4-msdf.png'), - loadTexture(this.gl, 'assets/textures/logo-5-msdf.png'), - loadTexture(this.gl, 'assets/textures/logo-6-msdf.png'), - loadTexture(this.gl, 'assets/textures/logo-7-msdf.png'), - loadTexture(this.gl, 'assets/textures/logo-8-msdf.png'), - loadTexture(this.gl, 'assets/textures/logo-9-msdf.png'), - ]); - - msdf.forEach((texture, i) => { - texture.minFilter = this.gl.LINEAR; - texture.generateMipmaps = false; - - const glyph = new AngularGlyph( - this.gl, - texture, - new Color(1, 1, 1), - i < 1 ? new Vec2(0.5 - 0.1123, 0) : new Vec2(0.5, -0.5), - ); - this.addChild(glyph); - }); - } - - /** - * Update size and position of the view, based on the size of the screen. - */ - override resize(width: number, height: number, dpr: number, scale: number): void { - this.viewScale = scale; - - this.userData['width'] = this.viewWidth * this.viewScale; - this.userData['height'] = this.viewHeight * this.viewScale; - - // Centered - this.origin.set( - Math.round((width - this.userData['width']) / 2), - Math.round((height - this.userData['height']) / 2), - ); - } - - /** - * Update position, rotation and scale of the view, and child views. - */ - override update(): void { - this.position.x = this.origin.x + this.userData['x']; - this.position.y = -this.origin.y + -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.viewScale * this.userData['scale']); - - this.children.forEach((node) => { - node.update(); - }); - } -} diff --git a/adev/src/app/features/home/components/views/build-text.ts b/adev/src/app/features/home/components/views/build-text.ts deleted file mode 100644 index 13f3328905b8..000000000000 --- a/adev/src/app/features/home/components/views/build-text.ts +++ /dev/null @@ -1,120 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {Color, Mesh, OGLRenderingContext, Plane} from 'ogl'; - -import {View} from './view'; -import {GlyphProgram} from '../programs/glyph-program'; - -import {toRadians} from '../../utils/math'; -import {loadTexture} from '../../utils/ogl'; - -import {BREAKPOINT, BUILD_TEXT_HEIGHT_RATIO} from '../../home-animation-constants'; - -/** - * An OGL `Transform` used for the animation of the "Build for everyone" heading. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class BuildText extends View { - private viewWidth = 433; - private viewHeight = 58; - private aspect = this.viewWidth / this.viewHeight; - private mesh!: Mesh; - - /** - * Create the build text. - */ - constructor( - private readonly gl: OGLRenderingContext, - private readonly document: Document, - ) { - super(); - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - } - - /** - * Initialize child views. - */ - override async init(): Promise { - const texture = await loadTexture(this.gl, 'assets/textures/build-msdf.png'); - texture.minFilter = this.gl.LINEAR; - texture.generateMipmaps = false; - - const geometry = new Plane(this.gl); - - const program = new GlyphProgram(this.gl, texture, new Color(1, 1, 1)); - - const mesh = new Mesh(this.gl, {geometry, program}); - mesh.frustumCulled = false; - this.addChild(mesh); - - this.mesh = mesh; - } - - /** - * Update size and position of the view, based on the CSS heading. - */ - override resize(width: number, height: number, dpr: number, scale: number): void { - const heading = this.document.querySelector('.adev-build-webgl-text h2')!; - const bounds = heading.getBoundingClientRect(); - let textHeight; - - if (width < BREAKPOINT) { - // Mobile fixed size (in px) - textHeight = 48; - } else { - // Desktop calculation (in px) - textHeight = bounds.height * BUILD_TEXT_HEIGHT_RATIO; - } - - this.userData['width'] = textHeight * this.aspect; - this.userData['height'] = textHeight; - - // Positioned relative to the CSS heading, vertical offset from the center, Y flipped - let y = 1 - (bounds.y - (height - bounds.height) / 2); - - // Vertical offset adjustment (in px) - if (width < BREAKPOINT) { - y -= 4; - } else { - y -= 6 * scale; - } - - this.mesh.position.set(0, y, 0); - this.mesh.scale.set(this.userData['width'], this.userData['height'], 1); - } - - /** - * Update position, rotation and scale of the view, and alpha uniform of the program. - */ - override update(): void { - this.position.x = this.userData['x']; - this.position.y = -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - this.mesh.program.uniforms['uAlpha'].value = - this.userData['opacity'] * this.parent!.userData['opacity']; - } - - /** - * Promise for the child views when they're ready. - */ - override ready(): Promise { - return this.init(); - } -} diff --git a/adev/src/app/features/home/components/views/build-view.ts b/adev/src/app/features/home/components/views/build-view.ts deleted file mode 100644 index 6d9f244e73bb..000000000000 --- a/adev/src/app/features/home/components/views/build-view.ts +++ /dev/null @@ -1,89 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {OGLRenderingContext, Vec2} from 'ogl'; - -import {View} from './view'; -import {BuildText} from './build-text'; - -import {toRadians} from '../../utils/math'; - -/** - * An OGL `Transform` used for the top-level view of the build section. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class BuildView extends View { - private origin: Vec2; - - text!: BuildText; - - /** - * Create the build view. - */ - constructor( - private readonly gl: OGLRenderingContext, - private readonly document: Document, - ) { - super(); - - this.visible = false; - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - - this.origin = new Vec2(); - - this.init(); - } - - /** - * Initialize child views. - */ - override init(): void { - this.text = new BuildText(this.gl, this.document); - this.addChild(this.text); - } - - /** - * Update size and position of the view, based on the size of the screen, and child views. - */ - override resize(width: number, height: number, dpr: number, scale: number): void { - // Centered - this.origin.set(Math.round(width / 2), Math.round(height / 2)); - - this.text.resize(width, height, dpr, scale); - } - - /** - * Update position, rotation and scale of the view, and child views. - */ - override update(): void { - this.position.x = this.origin.x + this.userData['x']; - this.position.y = -this.origin.y + -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - this.visible = this.userData['opacity'] > 0; - - this.text.update(); - } - - /** - * Promise for the child views when they're ready. - */ - override ready(): Promise { - return this.text.init(); - } -} diff --git a/adev/src/app/features/home/components/views/gradient-view.ts b/adev/src/app/features/home/components/views/gradient-view.ts deleted file mode 100644 index abb3dd04a303..000000000000 --- a/adev/src/app/features/home/components/views/gradient-view.ts +++ /dev/null @@ -1,105 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {OGLRenderingContext, Vec2} from 'ogl'; - -import {View} from './view'; -import {Gradient} from './gradient'; - -import {toRadians} from '../../utils/math'; - -/** - * An OGL `Transform` used for the top-level view of the gradient background. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class GradientView extends View { - private origin: Vec2; - - background!: Gradient; - - /** - * Create the gradient view. - */ - constructor( - private readonly gl: OGLRenderingContext, - private readonly document: Document, - private readonly window: Window, - ) { - super(); - - this.visible = false; - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - - this.origin = new Vec2(); - - this.init(); - } - - /** - * Initialize child views. - */ - override init(): void { - this.background = new Gradient(this.gl, this.document, this.window); - this.addChild(this.background); - } - - /** - * Update the theme of child views. - */ - override theme(): void { - this.background.theme(); - } - - /** - * Resize the child views. - */ - override resize(width: number, height: number, dpr: number, scale: number): void { - // Centered - this.origin.set(Math.round(width / 2), Math.round(height / 2)); - - this.background.resize(width, height, dpr, scale); - } - - /** - * Update position, rotation and scale of the view, and child views. - */ - override update(time: number): void { - this.position.x = this.origin.x + this.userData['x']; - this.position.y = -this.origin.y + -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - // "Build for everyone" gradient centered, scale set by the child view - if (this.background.userData['progress'] > 0) { - this.position.x = this.origin.x; - this.position.y = -this.origin.y; // Y flipped - - this.scale.set(1); - } - - this.visible = this.userData['opacity'] > 0; - - this.background.update(time); - } - - /** - * Promise for the child views when they're ready. - */ - override ready(): Promise { - return this.background.init(); - } -} diff --git a/adev/src/app/features/home/components/views/gradient.ts b/adev/src/app/features/home/components/views/gradient.ts deleted file mode 100644 index 054bacbc2ae0..000000000000 --- a/adev/src/app/features/home/components/views/gradient.ts +++ /dev/null @@ -1,121 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {Mesh, OGLRenderingContext, Plane} from 'ogl'; - -import {View} from './view'; -import {GradientProgram} from '../programs/gradient-program'; - -import {toRadians} from '../../utils/math'; -import {loadTexture} from '../../utils/ogl'; - -/** - * An OGL `Transform` used for the animation of the gradient background. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class Gradient extends View { - private viewWidth = 700; - private viewScale = 1; - private mesh!: Mesh; - - /** - * Create the gradient background. - */ - constructor( - private readonly gl: OGLRenderingContext, - private readonly document: Document, - private readonly window: Window, - ) { - super(); - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - this.userData['progress'] = 0; - this.userData['buildWidth'] = 0; // Used for the "Build for everyone" heading width - } - - /** - * Initialize geometry, program and mesh for the view. - */ - override async init(): Promise { - const texture = await loadTexture(this.gl, 'assets/textures/gradient.jpg'); - - const geometry = new Plane(this.gl); - - const program = new GradientProgram(this.gl, texture, this.window); - - const mesh = new Mesh(this.gl, {geometry, program}); - mesh.frustumCulled = false; - this.addChild(mesh); - - this.mesh = mesh; - } - - /** - * Update color uniforms of the material, based on the current theme. - */ - override theme(): void { - const rootStyle = getComputedStyle(this.document.querySelector(':root')!); - - this.mesh.program.uniforms['uGrayColor'].value.set( - rootStyle.getPropertyValue('--webgl-gray-unfilled').trim(), - ); - } - - /** - * Update size and position of the view, based on the size of the screen. - */ - override resize(width: number, height: number, dpr: number, scale: number): void { - this.viewScale = scale; - - // The gradient is 1.34x the width of the Angular logo - const size = this.viewWidth * this.viewScale * 1.34; - this.userData['width'] = size; - this.userData['height'] = size; - } - - /** - * Update position, rotation and scale of the view, position and scale of the mesh, and progress, - * alpha and time uniforms of the program. - */ - override update(time: number): void { - this.position.x = this.userData['x']; - this.position.y = -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - if (this.userData['progress'] > 0) { - // "Build for everyone" gradient centered, same width as the heading - this.mesh.position.set(0); - this.mesh.scale.set(this.userData['buildWidth'], this.userData['buildWidth'], 1); - } else { - // Positioned relative to the Angular logo, Y flipped - this.mesh.position.set(-102 * this.viewScale, -40 * this.viewScale, 0); - this.mesh.scale.set(this.userData['width'], this.userData['height'], 1); - } - - this.mesh.program.uniforms['uProgress'].value = this.userData['progress']; - this.mesh.program.uniforms['uAlpha'].value = - this.userData['opacity'] * this.parent!.userData['opacity']; - this.mesh.program.uniforms['uTime'].value = time; - } - - /** - * Promise for the child views when they're ready. - */ - override ready(): Promise { - return this.init(); - } -} diff --git a/adev/src/app/features/home/components/views/line-object.ts b/adev/src/app/features/home/components/views/line-object.ts deleted file mode 100644 index 12948d768db2..000000000000 --- a/adev/src/app/features/home/components/views/line-object.ts +++ /dev/null @@ -1,59 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {Mesh, Vec3} from 'ogl'; - -import {View} from './view'; - -import {toRadians} from '../../utils/math'; - -/** - * An OGL `Transform` used for the animation of a line instance. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class LineObject extends View { - /** - * Create a line view. - */ - constructor( - private readonly origin: Vec3, - private readonly mesh: Mesh, - private readonly index: number, - ) { - super(); - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - } - - /** - * Update position, rotation and scale of the view, and alpha attribute of the geometry. - */ - override update(): void { - this.position.x = this.origin.x + this.userData['x']; - this.position.y = this.origin.y + -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - this.updateMatrix(); - - this.matrix.toArray(this.mesh.geometry.attributes['instanceMatrix'].data, this.index * 16); - - this.mesh.geometry.attributes['instanceOpacity'].data!.set( - [this.userData['opacity'] * this.parent!.userData['opacity']], - this.index, - ); - } -} diff --git a/adev/src/app/features/home/components/views/lines-view.ts b/adev/src/app/features/home/components/views/lines-view.ts deleted file mode 100644 index 36e4139ac9a7..000000000000 --- a/adev/src/app/features/home/components/views/lines-view.ts +++ /dev/null @@ -1,64 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {isMobile} from '@angular/docs'; -import type {OGLRenderingContext} from 'ogl'; - -import {View} from './view'; -import {Lines} from './lines'; - -/** - * An OGL `Transform` used for the top-level view of the lines section. - */ -export class LinesView extends View { - // Number of divisions on a square grid - // For example 9 × 9 = 81 line instances - private divisions = isMobile ? 9 : 14; - - container!: Lines; - - /** - * Create the lines view. - */ - constructor(private readonly gl: OGLRenderingContext) { - super(); - - this.visible = false; - - // Center the container - const offset = this.divisions - 2; - this.position.x = -offset; - this.position.y = -offset; - - this.init(); - } - - /** - * Initialize child views. - */ - override init(): void { - this.container = new Lines(this.gl, this.divisions); - this.addChild(this.container); - } - - /** - * Update the child views. - */ - override update(time: number): void { - this.visible = this.container.userData['opacity'] > 0; - - this.container.update(time); - } - - /** - * Promise for the child views when they're ready. - */ - override ready(): Promise { - return this.container.init(); - } -} diff --git a/adev/src/app/features/home/components/views/lines.ts b/adev/src/app/features/home/components/views/lines.ts deleted file mode 100644 index 191add68d251..000000000000 --- a/adev/src/app/features/home/components/views/lines.ts +++ /dev/null @@ -1,146 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {InstancedMesh, OGLRenderingContext, Plane, Transform} from 'ogl'; - -import {View} from './view'; -import {LineGlyphProgram} from '../programs/line-glyph-program'; -import {LineObject} from './line-object'; - -import {toRadians} from '../../utils/math'; -import {loadTexture} from '../../utils/ogl'; - -// An index number used for the color of the line instance -enum InstanceColorIndex { - Pink = 0, - Purple = 1, - Red = 2, -} - -/** - * An OGL `Transform` used for the animation of the lines section. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class Lines extends View { - private mesh!: InstancedMesh; - - /** - * Create the container view. - */ - constructor( - private readonly gl: OGLRenderingContext, - private readonly divisions: number, - ) { - super(); - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - } - - /** - * Initialize geometry, program and mesh for the view. - */ - override async init(): Promise { - const texture = await loadTexture(this.gl, 'assets/textures/line-msdf.png'); - texture.minFilter = this.gl.LINEAR; - texture.generateMipmaps = false; - - const viewWidth = 235; - const viewHeight = 300; - const aspect = viewWidth / viewHeight; - const size = 1.6; - const width = size * aspect; - const height = size; - const widthDivisions = this.divisions; - const heightDivisions = this.divisions; - const numInstances = widthDivisions * heightDivisions; - - const geometry = new Plane(this.gl, {width, height}); - geometry.addAttribute('instanceMatrix', { - instanced: 1, - size: 16, - data: new Float32Array(numInstances * 16), - }); - geometry.addAttribute('instanceColorIndex', { - instanced: 1, - size: 1, - data: new Float32Array(numInstances).map( - (): InstanceColorIndex => Math.floor(Math.random() * 3), - ), - }); - geometry.addAttribute('instanceRandom', { - instanced: 1, - size: 1, - data: new Float32Array(numInstances).map(() => Math.random()), - }); - geometry.addAttribute('instanceOpacity', { - instanced: 1, - size: 1, - data: new Float32Array(numInstances).fill(1), - }); - - const program = new LineGlyphProgram(this.gl, texture); - - const mesh = new InstancedMesh(this.gl, {geometry, program}); - // TODO: @pschroen add support for instanced mesh frustum culling - // mesh.addFrustumCull(); - - const object = new Transform(); - - let index = 0; - - for (let y = 0; y < heightDivisions; y++) { - for (let x = 0; x < widthDivisions; x++) { - object.position.set(2 * x, 2 * y, 0); - object.updateMatrix(); - - object.matrix.toArray(mesh.geometry.attributes['instanceMatrix'].data, index * 16); - - const line = new LineObject(object.position.clone(), mesh, index); - this.addChild(line); - - index++; - } - } - - mesh.geometry.attributes['instanceMatrix'].needsUpdate = true; - - // Add instanced mesh last - this.addChild(mesh); - - this.mesh = mesh; - } - - /** - * Update position, rotation and scale of the view, time uniform of the program, and child views. - */ - override update(time: number): void { - this.position.x = this.userData['x']; - this.position.y = -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - this.mesh.program.uniforms['uTime'].value = time; - - this.children.forEach((node: Transform) => { - if (node instanceof View) { - node.update(); - } - }); - - this.mesh.geometry.attributes['instanceMatrix'].needsUpdate = true; - this.mesh.geometry.attributes['instanceOpacity'].needsUpdate = true; - } -} diff --git a/adev/src/app/features/home/components/views/view.ts b/adev/src/app/features/home/components/views/view.ts deleted file mode 100644 index ba6570d17d09..000000000000 --- a/adev/src/app/features/home/components/views/view.ts +++ /dev/null @@ -1,67 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {Transform} from 'ogl'; - -/** - * An OGL `Transform` used as a base class for implementing views. - */ -export class View extends Transform { - /** - * The parent. - */ - override parent: View | null = null; - - /** - * An array with the children. - */ - override children: View[] = []; - - /** - * An object for storing custom data. - */ - userData: Record = {}; - - /** - * Stub for initializing child views. - */ - init(): void {} - - /** - * Stub for updating child views, based on the current theme. - */ - theme(): void {} - - /** - * Stub for resizing child views. - */ - resize(width?: number, height?: number, dpr?: number, scale?: number): void {} - - /** - * Stub for updating child views. - */ - update(time?: number, deltaTime?: number, frame?: number, progress?: number): void {} - - /** - * Stub for initializing child views when they're ready. - */ - ready(): void | Promise {} - - /** - * Destroys the child views and empties the children array. - */ - destroy(): void { - for (let i = this.children.length - 1; i >= 0; i--) { - if ('destroy' in this.children[i]) { - this.children[i].destroy(); - } - } - - this.children.length = 0; - } -} diff --git a/adev/src/app/features/home/home-animation-constants.ts b/adev/src/app/features/home/home-animation-constants.ts deleted file mode 100644 index f7429b6f3ec9..000000000000 --- a/adev/src/app/features/home/home-animation-constants.ts +++ /dev/null @@ -1,33 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -// Defines one breakpoint (in px) between mobile and desktop sizing. -export const BREAKPOINT = 1000; - -// Defines maximum application size (in px) that can be rendered on a page. -// If a viewport width is bigger than this size, we limit the width to this value. -export const MAX_APP_WIDTH = 2560; - -// Defines the "Build for everyone" heading height ratio. -// The computed CSS heading size (in px) is multiplied by this value to compensate for the -// difference in height of the MSDF texture. -export const BUILD_TEXT_HEIGHT_RATIO = 0.88; - -export const SCALE_DIV = '.adev-scale'; -export const LINES_TEXT = '.adev-lines-text'; -export const LINES_DIV = '.adev-lines'; -export const BUILD_TEXT = '.adev-build-text'; -export const CTA = '.adev-cta'; -export const ARROW = '.adev-arrow'; -export const SCALE_TEXT = '.adev-scale-text'; -export const CANVAS = '.adev-canvas'; -export const MOVING_LOGO = '.adev-logo'; - -export const HEADER_CLASS_NAME = 'adev-header'; -export const WEBGL_CLASS_NAME = 'adev-webgl'; -export const LOADED_CLASS_NAME = 'adev-loaded'; diff --git a/adev/src/app/features/home/home.component.html b/adev/src/app/features/home/home.component.html index 83e73aa167cc..77e44585fc2f 100644 --- a/adev/src/app/features/home/home.component.html +++ b/adev/src/app/features/home/home.component.html @@ -1,140 +1,17 @@ -
    -
    - + + + +@if (!animationReady()) { +
    +} + +
    +
    + @defer (when showEditor(); prefetch when prefetchEditor()) { + + } @loading { + Code editor + }
    -
    - -
    -
    -
    -
    -

    Works at any scale

    -

    - Angular lets you start small on a well-lit path and supports you as your team and apps - grow. -

    -
    -
    -
    -
    -
    -
    -
    -
    -

    Loved by millions

    -

    - Join the millions of developers all over the world building with Angular in a thriving - and friendly community. -

    -
    -
    -
    -
    -
    -
    -
    -
    -

    - Build for everyone - -

    -

    - Rely on Angular's built-in hydration, internationalization, security, and accessibility - support to build for everyone around the world. -

    -
    -
    -
    - -
    -
    -
    -
    - @defer (on viewport(buildForEveryone); prefetch on viewport(lovedByMillions)) { - - } @loading { - Code editor - } -
    -
    -
    - - -
    diff --git a/adev/src/app/features/home/home.component.scss b/adev/src/app/features/home/home.component.scss index fb501f021dd1..8029cb3c70e2 100644 --- a/adev/src/app/features/home/home.component.scss +++ b/adev/src/app/features/home/home.component.scss @@ -2,6 +2,7 @@ :host { width: 100%; + position: relative; // While editor is loading, display an svg of the editor .docs-dark-mode & { @@ -20,262 +21,9 @@ } } } - .adev-banner { - display: flex; - align-items: center; - flex-wrap: wrap; - gap: 0.5rem; - z-index: 10; - border: 1px solid var(--senary-contrast); - background: var(--page-background); - position: relative; - border-radius: 0.25rem; - padding: 10px; - max-width: 100%; - width: fit-content; - box-sizing: border-box; - transition: background 0.3s ease, border 0.3s ease; - - h1, - p { - display: inline; - font-size: 0.875rem; - margin: 0; - background-image: var(--red-to-pink-to-purple-horizontal-gradient); - background-clip: text; - -webkit-background-clip: text; - color: transparent; - width: fit-content; - font-weight: 500; - - &.adev-banner-cta { - color: var(--tertiary-contrast); - &::after { - content: ''; - position: absolute; - width: 100%; - transform: scaleX(0); - height: 1px; - bottom: -2px; - left: 0; - background: var(--red-to-pink-to-purple-horizontal-gradient); - transform-origin: bottom right; - transition: transform 0.3s ease; - } - } - } - &:hover { - .adev-banner-cta { - &::after { - transform: scaleX(1); - transform-origin: bottom left; - } - } - } - } -} - -.adev-top { - position: absolute; - top: 0; - - @include mq.for-tablet-landscape-down { - top: 6rem; - } - - @include mq.for-phone-only { - top: 4.5rem; - } - - .adev-top-content { - display: flex; - justify-content: space-between; - align-items: center; - flex-wrap: wrap; - padding-top: 10px; - padding-inline: var(--layout-padding); - gap: 0.5rem; - - @include mq.for-tablet-landscape-up { - padding-top: var(--layout-padding); - padding-left: calc(var(--layout-padding) + var(--primary-nav-width)); - } - } -} - -.adev-home { - img, - svg { - user-select: none; - } - - h2, - p { - position: relative; - } - - h2 { - font-size: 4vw; - font-weight: 600; - white-space: nowrap; - margin-top: 0; - margin-bottom: 0.5em; - - @media screen and (max-width: 1000px) { - font-size: 2rem; - } - } - p { - font-weight: 400; - color: var(--quaternary-contrast); - font-size: clamp(1rem, 1vw, 2rem); - line-height: 1.5; - width: clamp(375px, 50%, 600px); - margin: 0 auto; - } - - .adev-cta { - position: fixed; - left: 50%; - bottom: 10%; - transform: translateX(-50%); - display: inline-block; - padding: 7px; - opacity: 0; - visibility: hidden; - transition: opacity 0.5s linear, visibility 0.5s linear; - - button { - font-size: 1rem; - padding: 1rem 1.75rem; - &::after { - font-size: 1rem; - } - } - } - - .adev-arrow { - position: fixed; - left: 50%; - bottom: 5%; - transform: translateX(-50%) rotate(45deg); - border: solid var(--primary-contrast); - border-width: 0 2px 2px 0; - display: inline-block; - padding: 7px; - opacity: 0; - transition: opacity 0.5s linear; - } - - .adev-canvas { - position: fixed; - top: 0; - width: calc(100vw - 8px); - height: 100vh; - max-width: 2560px; - margin-inline: auto; - pointer-events: none; - overflow: hidden; - - // hide canvas to prevent fouc - opacity: 0; - - // large viewport height for canvas - @supports (height: 100lvh) { - height: 100lvh; - } - } - - .adev-logo, - .adev-scale, - .adev-lines, - .adev-build { - height: 130vh; - overflow: hidden; - - @supports (height: 100lvh) { - height: 130lvh; - } - } - - .adev-logo-wordmark, - .adev-scale-text, - .adev-lines-text, - .adev-build-text, - .adev-build-webgl-text { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - text-align: center; - top: 0; - width: 100vw; + .spacer { height: 100vh; - max-width: 2560px; - margin-inline: auto; - pointer-events: none; - overflow: hidden; - - @supports (height: 100lvh) { - height: 100lvh; - } - } - - .adev-build-webgl-text { - display: none; - visibility: hidden; - position: fixed; - } - - .adev-scale-container, - .adev-lines-container, - .adev-build-container { - position: relative; - } - - .adev-lines-container { - &::before { - content: ''; - position: absolute; - left: -50px; - top: 0; - right: -50px; - bottom: -50px; - background-color: var(--page-background); - filter: blur(25px); - } - } - - .adev-scale-wrapper, - .adev-lines-wrapper, - .adev-build-wrapper { - position: relative; - } - - .adev-build-text, - .adev-build-webgl-text { - h2 { - color: var(--gray-unfilled); - - @media screen and (max-width: 1000px) { - font-size: 2.75rem; - } - } - - .adev-gradient { - position: absolute; - left: 0; - top: 0; - right: 0; - background: url('../../../assets/textures/gradient.jpg'); - background-size: cover; - background-position: center; - background-clip: text; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - clip-path: inset(0%); - } } .adev-editor-scroll-container { @@ -283,15 +31,36 @@ height: 300vh; background-color: var(--page-background); - .adev-sticky-editor { + .adev-code-editor { + background-color: var(--page-background); + padding-bottom: 60px; position: sticky; top: calc((100vh - (100vh - 110px)) / 2); + @include mq.for-tablet { top: calc(((100vh - (100vh - 110px)) / 2) + 36px); } @include mq.for-phone-only { top: calc(((100vh - (100vh - 110px)) / 2) + 25px); } + + // stylelint-disable-next-line + ::ng-deep { + embedded-editor { + margin: 0 auto; + display: flex; + width: 75vw; + height: calc(100vh - 110px); + + @include mq.for-phone-only { + width: 95vw; + } + + .adev-editor-container { + width: 100%; + } + } + } } img { @@ -304,103 +73,4 @@ width: 75vw; } } - - &.adev-header { - .adev-cta, - .adev-arrow { - opacity: 1; - visibility: visible; - } - } - - &.adev-webgl { - .adev-logo, - .adev-scale, - .adev-lines { - height: 200vh; - - @supports (height: 100lvh) { - height: 200lvh; - } - } - - .adev-logo-wordmark, - .adev-scale-text, - .adev-lines-text, - .adev-build-text { - position: fixed; - } - - .adev-scale-text, - .adev-lines-text, - .adev-build-text { - opacity: 0; - } - - .adev-build { - height: 300vh; - - @supports (height: 100lvh) { - height: 300lvh; - } - } - - .adev-build-text { - h2 { - opacity: 0; - } - } - - .adev-build-webgl-text { - display: flex; - } - - &.adev-loaded { - .adev-canvas { - opacity: unset; - } - - .adev-logo-wordmark { - opacity: 0; - } - } - } -} - -.adev-code-editor { - background-color: var(--page-background); - padding-bottom: 60px; - - // stylelint-disable-next-line - ::ng-deep { - embedded-editor { - margin: 0 auto; - display: flex; - width: 75vw; - height: calc(100vh - 110px); - - @include mq.for-phone-only { - width: 95vw; - } - - .adev-editor-container { - width: 100%; - } - } - } -} - -.adev-code-editor-gradient { - position: absolute; - left: 0; - right: 0; - margin-top: -100vh; - height: 100vh; - background: linear-gradient(to top, var(--page-background), transparent); - pointer-events: none; - - @supports (height: 100svh) { - margin-top: -100svh; - height: 100svh; - } } diff --git a/adev/src/app/features/home/home.component.ts b/adev/src/app/features/home/home.component.ts index 32b7b113f15e..068778e01f27 100644 --- a/adev/src/app/features/home/home.component.ts +++ b/adev/src/app/features/home/home.component.ts @@ -6,139 +6,65 @@ * found in the LICENSE file at https://angular.dev/license */ -import {DOCUMENT, isPlatformBrowser} from '@angular/common'; import { AfterViewInit, ChangeDetectionStrategy, Component, - ElementRef, - Injector, - OnDestroy, - OnInit, - PLATFORM_ID, - ViewChild, + computed, inject, + OnDestroy, + Renderer2, + signal, } from '@angular/core'; -import {WINDOW, shouldReduceMotion, isIos} from '@angular/docs'; -import {ActivatedRoute, RouterLink} from '@angular/router'; - -import {injectAsync} from '../../core/services/inject-async'; +import {ActivatedRoute} from '@angular/router'; +import {DOCUMENT} from '@angular/common'; +import {WINDOW} from '@angular/docs'; +import {HomeAnimationComponent} from './components/home-animation/home-animation.component'; import {CodeEditorComponent} from './components/home-editor.component'; -import {HEADER_CLASS_NAME} from './home-animation-constants'; -import type {HomeAnimation} from './services/home-animation.service'; - export const TUTORIALS_HOMEPAGE_DIRECTORY = 'homepage'; @Component({ selector: 'adev-home', - imports: [RouterLink, CodeEditorComponent], + imports: [HomeAnimationComponent, CodeEditorComponent], templateUrl: './home.component.html', styleUrls: ['./home.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export default class Home implements OnInit, AfterViewInit, OnDestroy { - @ViewChild('home') home!: ElementRef; - - private readonly document = inject(DOCUMENT); - private readonly injector = inject(Injector); - private readonly platformId = inject(PLATFORM_ID); - private readonly window = inject(WINDOW); +export default class Home implements AfterViewInit, OnDestroy { private readonly activatedRoute = inject(ActivatedRoute); + private readonly renderer = inject(Renderer2); + private readonly win = inject(WINDOW); + private readonly doc = inject(DOCUMENT); + private scrollListener?: () => void; protected readonly tutorialFiles = TUTORIALS_HOMEPAGE_DIRECTORY; protected readonly isUwu = 'uwu' in this.activatedRoute.snapshot.queryParams; - private element!: HTMLDivElement; - private homeAnimation?: HomeAnimation; - private intersectionObserver: IntersectionObserver | undefined; - - ctaLink = 'tutorials/learn-angular'; - ctaIosLink = 'overview'; - - ngOnInit(): void { - if (isIos) { - this.ctaLink = this.ctaIosLink; - } - } - - ngAfterViewInit() { - this.element = this.home.nativeElement; - - if (isPlatformBrowser(this.platformId)) { - // Always scroll to top on home page (even for navigating back) - this.window.scrollTo({top: 0, left: 0, behavior: 'instant'}); - - // Create a single intersection observer used for disabling the animation - // at the end of the page, and to load the embedded editor. - this.initIntersectionObserver(); - - if (this.isWebGLAvailable() && !shouldReduceMotion() && !this.isUwu) { - this.loadHomeAnimation(); - } - } - } - - ngOnDestroy(): void { - if (isPlatformBrowser(this.platformId)) { - // Stop observing and disconnect - this.intersectionObserver?.disconnect(); - - if (this.homeAnimation) { - this.homeAnimation.destroy(); - } - } - } - - private initIntersectionObserver(): void { - const header = this.document.querySelector('.adev-top'); - const footer = this.document.querySelector('footer'); - this.intersectionObserver = new IntersectionObserver((entries) => { - const headerEntry = entries.find((entry) => entry.target === header); - const footerEntry = entries.find((entry) => entry.target === footer); + private scrollProgress = signal(0); - // CTA and arrow animation - this.headerTop(headerEntry); + prefetchEditor = computed(() => this.scrollProgress() > 0.25); + showEditor = computed(() => this.scrollProgress() > 0.35); - // Disable animation at end of page - if (this.homeAnimation) { - this.homeAnimation.disableEnd(footerEntry); - } - }); + animationReady = signal(false); - // Start observing - this.intersectionObserver.observe(header!); - this.intersectionObserver.observe(footer!); + ngAfterViewInit() { + this.scrollListener = this.renderer.listen(this.win, 'scroll', () => + // Keep track of the scroll progress since the home animation uses + // different mechanics for the standard and reduced-motion animations. + this.scrollProgress.set(this.win.scrollY / this.doc.body.scrollHeight), + ); } - private headerTop(headerEntry: IntersectionObserverEntry | undefined): void { - if (!headerEntry) { - return; - } - - if (headerEntry.isIntersecting) { - this.element.classList.add(HEADER_CLASS_NAME); - } else { - this.element.classList.remove(HEADER_CLASS_NAME); + ngOnDestroy() { + // Unlisten the scroll event. + if (this.scrollListener) { + this.scrollListener(); } } - private async loadHomeAnimation() { - this.homeAnimation = await injectAsync(this.injector, () => - import('./services/home-animation.service').then((c) => c.HomeAnimation), - ); - - await this.homeAnimation.init(this.element); - } - - private isWebGLAvailable() { - try { - return !!document - .createElement('canvas') - .getContext('webgl', {failIfMajorPerformanceCaveat: true}); - } catch (e) { - return false; - } + onAnimationReady(ready: boolean) { + this.animationReady.set(ready); } } diff --git a/adev/src/app/features/home/services/home-animation.service.ts b/adev/src/app/features/home/services/home-animation.service.ts deleted file mode 100644 index bef70be9233f..000000000000 --- a/adev/src/app/features/home/services/home-animation.service.ts +++ /dev/null @@ -1,545 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {DOCUMENT} from '@angular/common'; -import {DestroyRef, Injectable, inject} from '@angular/core'; -import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; -import {RESIZE_EVENT_DELAY, WEBGL_LOADED_DELAY, WINDOW} from '@angular/docs'; -import {gsap} from 'gsap'; -import {ScrollTrigger} from 'gsap/ScrollTrigger'; -import {fromEvent} from 'rxjs'; -import {debounceTime} from 'rxjs/operators'; -import {ThemeManager} from '../../../core/services/theme-manager.service'; -import {Canvas} from '../components/canvas'; -import {View} from '../components/views/view'; -import { - BREAKPOINT, - BUILD_TEXT, - CANVAS, - LINES_DIV, - LINES_TEXT, - LOADED_CLASS_NAME, - MAX_APP_WIDTH, - MOVING_LOGO, - SCALE_DIV, - SCALE_TEXT, - WEBGL_CLASS_NAME, -} from '../home-animation-constants'; - -/** - * Injectable service for the WebGL animation of the home page. - * - * This class contains your usual script for GSAP animations, however it's been extended with a - * number of classes and utilities that follow a simple MVC design pattern of views and programs - * for OGL. - * - * A view is an OGL `Transform`, the `userData: View["userData"]` object is used for the GSAP animation, - * and the `update` method applies the values to the `Transform`. - * - * @see {@link Canvas} for the controller class implementation. - */ -@Injectable() -export class HomeAnimation { - private readonly destroyRef = inject(DestroyRef); - private readonly document = inject(DOCUMENT); - private readonly window = inject(WINDOW); - private readonly themeManager = inject(ThemeManager); - - private scale = 1; - private progress = 0; - private logoMovement = 0; - private logoAnimation!: gsap.core.Timeline; - private logoProgress = 0; - private logoProgressTarget = 0; - private lerpSpeed = 0.1; - - private canvas!: Canvas; - private gradientView!: View['userData']; - private gradient!: View['userData']; - private angularView!: View['userData']; - private wordmark!: View['userData']; - private glyphs!: View[]; - private logo!: View['userData']; - private logoInner!: View['userData']; - private angular!: View['userData']; - private linesContainer!: View['userData']; - private lines!: View['userData']; - private buildView!: View['userData']; - - private element!: HTMLDivElement; - private animations: Array = []; - - private refreshRate = 60; - private playbackRate = 1; - - /** - * Initialize CSS styles, GSAP, the WebGL canvas and animations. - */ - async init(element: HTMLDivElement): Promise { - this.element = element; - - // CSS styles needed for the animation - this.element.classList.add(WEBGL_CLASS_NAME); - - // Initialize ScrollTrigger - gsap.registerPlugin(ScrollTrigger); - ScrollTrigger.enable(); - ScrollTrigger.config({ - ignoreMobileResize: true, - }); - - await this.initCanvas(); - this.getViews(); - - // Call theme and resize handlers once before setting the animations - this.onTheme(); - this.onResize(); - this.setAnimations(); - - // Call update handler once before starting the animation - this.onUpdate(0, 0, 0, 0); - this.enable(); - - // Workaround for the flash of white before the programs are ready - setTimeout(() => { - // Show the canvas - this.element.classList.add(LOADED_CLASS_NAME); - }, WEBGL_LOADED_DELAY); - } - - /** - * Initialize the canvas controller. - */ - private async initCanvas(): Promise { - this.canvas = new Canvas(this.document.querySelector(CANVAS)!, this.document, this.window); - - await this.canvas.ready(); - } - - /** - * Get the views. - */ - private getViews(): void { - this.gradientView = this.canvas.gradient.userData; - this.gradient = this.canvas.gradient.background.userData; - this.angularView = this.canvas.angular.userData; - this.wordmark = this.canvas.angular.wordmark.userData; - this.glyphs = this.canvas.angular.wordmark.children.slice(); - this.logo = this.glyphs[0].userData; - this.logoInner = this.glyphs[1].userData; - this.angular = this.glyphs.slice(2).map((glyph) => glyph.userData); - - this.linesContainer = this.canvas.lines.container.userData; - this.lines = this.canvas.lines.container.children - .slice(0, -1) // Skip the last child, the instanced mesh - .map((line) => line.userData); - - this.buildView = this.canvas.build.userData; - } - - /** - * Set the animations. - */ - private setAnimations(): void { - this.animations = [ - ...this.setLogoAnimation(), - this.setWorksAtAnyScaleAnimation(), - ...this.setColorfulLinesAnimation(), - this.setLovedByMillionsAnimation(), - this.setBuildForEveryoneAnimation(), - this.setBuildForEveryoneGradientAnimation(), - this.setScrollProgressAnimation(), - ]; - } - - /** - * Gradient, logo icon and "Angular" letters animation. - */ - private setLogoAnimation(): Array { - // Gradient and logo movement to the right - const movementAnimation = gsap.timeline({ - scrollTrigger: { - trigger: MOVING_LOGO, - start: 'center bottom', - end: 'center center', - scrub: 0.5, - invalidateOnRefresh: true, - }, - }); - - movementAnimation.fromTo( - [this.gradientView, this.wordmark], - { - x: 0, - }, - { - x: () => this.logoMovement, - ease: 'none', - }, - ); - - // "Angular" letters - const lettersAnimation = gsap.timeline({ - scrollTrigger: { - trigger: MOVING_LOGO, - start: 'center bottom', - end: 'center center', - scrub: 0.5, - }, - }); - - lettersAnimation.fromTo( - this.angular, - { - opacity: 1, - }, - { - opacity: 0, - stagger: { - each: 0.2, - from: 'end', - }, - ease: 'none', - }, - ); - - // Logo icon "explosion" - const logoAnimation = gsap - .timeline({paused: true}) - .to(this.gradientView, {scale: 10, duration: 1, ease: 'power1.in'}) - .to(this.logo, {scale: 40, duration: 1, ease: 'power1.in'}, 0) - .to(this.logo, {rotation: -270, duration: 1, ease: 'power1.in'}, 0) - .to(this.logo, {progress: 1, duration: 0.25, ease: 'power1.in'}, 0) - .to(this.logoInner, {scale: 0, opacity: 0, duration: 0.25, ease: 'power1.out'}, 0) - .set(this.angularView, {visible: false}, 0.8); - - // Logo progress used for icon "transformation" - const logoProgressAnimation = gsap.timeline({ - scrollTrigger: { - trigger: MOVING_LOGO, - start: 'center center', - end: () => `bottom+=${this.document.body.clientHeight} bottom`, - scrub: 0.5, - onUpdate: ({progress}) => { - if (progress > 0.25) { - this.logoProgressTarget = progress; - } else if (progress > 0.125) { - this.logoProgressTarget = 0.25; - } else { - this.logoProgressTarget = 0; - } - }, - }, - }); - - // Logo animation is scrubbed by the `onUpdate` method - this.logoAnimation = logoAnimation; - - return [movementAnimation, lettersAnimation, logoAnimation, logoProgressAnimation]; - } - - /** - * "Works at any scale" animation. - */ - private setWorksAtAnyScaleAnimation(): gsap.core.Animation { - const scaleTextAnimation = gsap.timeline({ - scrollTrigger: { - trigger: MOVING_LOGO, - start: 'center+=10% center', - end: () => `bottom+=${this.document.body.clientHeight} bottom`, - scrub: 0.5, - }, - }); - - scaleTextAnimation.fromTo( - SCALE_TEXT, - {scale: 0.1, opacity: 0}, - {scale: 1, opacity: 1, duration: 1, ease: 'power1.in'}, - ); - - // "Works at any scale" fade out animation - scaleTextAnimation.to(SCALE_TEXT, {scale: 1.3, opacity: 0, delay: 0.8}); - - return scaleTextAnimation; - } - - /** - * Colorful lines animation. - */ - private setColorfulLinesAnimation(): Array { - const linesAnimation = gsap.timeline({ - scrollTrigger: { - trigger: SCALE_DIV, - start: 'top+=18% bottom', - end: () => `bottom+=${this.document.body.clientHeight * 2} bottom`, - scrub: 0.5, - }, - }); - - linesAnimation - .fromTo( - this.lines, - { - x: 3, - y: 4, - scale: 0, - opacity: 0, - }, - { - x: 0, - y: 0, - scale: 1, - opacity: 1, - duration: 1, - stagger: { - each: 0.05, - from: 'random', - }, - ease: 'power1.out', - }, - 0, - ) - .set(this.linesContainer, {opacity: 1}, 0); - - // Lines fade out animation - linesAnimation.to(this.linesContainer, { - x: -1.5, - y: -2, - opacity: 0, - ease: 'power1.in', - }); - - // Lines progress used for camera zoom - const linesProgressAnimation = gsap.timeline({ - scrollTrigger: { - trigger: SCALE_DIV, - start: 'top+=18% bottom', - end: () => `bottom+=${this.document.body.clientHeight * 2} bottom`, - scrub: 0.5, - }, - }); - - linesProgressAnimation.to(this.canvas, {linesProgress: 1, duration: 1, ease: 'none'}); - - return [linesAnimation, linesProgressAnimation]; - } - - /** - * "Loved by millions" animation. - */ - private setLovedByMillionsAnimation(): gsap.core.Animation { - const linesTextAnimation = gsap.timeline({ - scrollTrigger: { - trigger: SCALE_DIV, - start: 'bottom bottom', - end: () => `bottom+=${this.document.body.clientHeight * 2} bottom`, - scrub: 0.5, - }, - }); - - linesTextAnimation.fromTo(LINES_TEXT, {scale: 0.8, opacity: 0}, {scale: 1, opacity: 1}); - - // "Loved by millions" fade out animation - linesTextAnimation.to(LINES_TEXT, {scale: 1.3, opacity: 0, delay: 0.8}); - - return linesTextAnimation; - } - - /** - * "Build for everyone" animation. - */ - private setBuildForEveryoneAnimation(): gsap.core.Animation { - const buildTextAnimation = gsap.timeline({ - scrollTrigger: { - trigger: LINES_DIV, - start: 'bottom bottom', - end: () => `bottom+=${this.document.body.clientHeight * 2} bottom`, - scrub: 0.5, - }, - }); - - buildTextAnimation - .fromTo(BUILD_TEXT, {scale: 0.8, opacity: 0}, {scale: 1, opacity: 1}) - .fromTo(this.buildView, {scale: 0.8, opacity: 0}, {scale: 1, opacity: 1}, 0); - - return buildTextAnimation; - } - - /** - * "Build for everyone" gradient animation. - */ - private setBuildForEveryoneGradientAnimation(): gsap.core.Animation { - const buildTextGradientAnimation = gsap.timeline({ - scrollTrigger: { - trigger: LINES_DIV, - start: 'bottom bottom', - end: () => `bottom+=${this.document.body.clientHeight * 2} bottom`, - scrub: 0.5, - }, - }); - - buildTextGradientAnimation.fromTo(this.gradient, {progress: 0}, {progress: 1}, 0); - - return buildTextGradientAnimation; - } - - /** - * Scroll progress animation. - */ - private setScrollProgressAnimation(): gsap.core.Animation { - const scrollProgressAnimation = gsap.timeline({ - scrollTrigger: { - trigger: '.adev-home', - start: 'top top', - end: 'bottom bottom', - scrub: 0.5, - onUpdate: ({progress}) => { - this.progress = progress; - }, - }, - }); - - // Initial values - scrollProgressAnimation.set(this.angularView, {visible: true, immediateRender: true}); - - return scrollProgressAnimation; - } - - /** - * Add event handlers. - */ - private addListeners(): void { - // TODO: This doesn't unsubscribe because of https://github.com/angular/angular/issues/50221 - // We need to update angular - this.themeManager.themeChanged$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => { - this.onTheme(); - }); - - fromEvent(this.window, 'resize') - .pipe(debounceTime(RESIZE_EVENT_DELAY), takeUntilDestroyed(this.destroyRef)) - .subscribe(() => { - this.onResize(); - }); - - gsap.ticker.add(this.onUpdate); - } - - /** - * Remove event handlers. - */ - private removeListeners(): void { - gsap.ticker.remove(this.onUpdate); - } - - /** - * Theme event handler. - */ - private onTheme(): void { - this.canvas.theme(); - } - - /** - * Resize event handler. - */ - private onResize(): void { - let width = this.window.innerWidth; - const height = this.document.body.clientHeight; - const dpr = this.window.devicePixelRatio; - - if (width > MAX_APP_WIDTH) { - width = MAX_APP_WIDTH; - } - - if (width < BREAKPOINT) { - this.scale = 0.5; - } else { - this.scale = width / 1470; - } - - this.canvas.resize(width, height, dpr, this.scale); - - if (width < BREAKPOINT) { - this.logoMovement = 136; - } else { - this.logoMovement = 272 * this.scale; - } - - // "Build for everyone" gradient is the same width as the heading - gsap.set(this.gradient, {buildWidth: this.canvas.build.text.userData['width']}); - - ScrollTrigger.refresh(); - } - - /** - * Update event handler. - * An arrow function is required for binding to the listener. - */ - private onUpdate: gsap.TickerCallback = (time: number, deltaTime: number, frame: number) => { - this.playbackRate = this.refreshRate / (1000 / deltaTime); - - this.logoProgress = gsap.utils.interpolate( - this.logoProgress, - this.logoProgressTarget, - this.lerpSpeed * this.playbackRate, - ); - this.logoAnimation.progress(this.logoProgress); - - this.canvas.update(time, deltaTime, frame, this.progress); - // TODO: add support for class fields arrow function - // An arrow function is required for binding to the listener - }; - - /** - * Starts the WebGL animation. - */ - private enable(): void { - this.addListeners(); - } - - /** - * Stops the WebGL animation. - */ - private disable(): void { - this.removeListeners(); - } - - /** - * Disables the animation at the end of the page. - */ - disableEnd(footerEntry: IntersectionObserverEntry | undefined): void { - if (!footerEntry) { - return; - } - - // Note: the views disable themselves based on opacity: - // `this.visible = this.userData['opacity'] > 0;` - if (footerEntry.isIntersecting) { - gsap?.set([this.gradientView, this.buildView], {opacity: 0}); - } else if (this.progress > 0.8) { - gsap?.set([this.gradientView, this.buildView], {opacity: 1}); - } - } - - /** - * Destroys the animations, removes the listeners, CSS classes and releases the objects for - * garbage collection. - */ - destroy(): void { - this.element.classList.remove(LOADED_CLASS_NAME); - this.element.classList.remove(WEBGL_CLASS_NAME); - - this.disable(); - - ScrollTrigger.disable(); - - this.animations.forEach((animation) => animation.kill()); - this.animations = []; - - this.canvas.destroy(); - } -} diff --git a/adev/src/app/features/home/utils/ogl.ts b/adev/src/app/features/home/utils/ogl.ts deleted file mode 100644 index 9646ac9142c8..000000000000 --- a/adev/src/app/features/home/utils/ogl.ts +++ /dev/null @@ -1,21 +0,0 @@ -/*! - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {OGLRenderingContext, Texture, TextureLoader} from 'ogl'; - -/** - * Load a texture. - * @example - * const texture = await loadTexture(gl, 'assets/textures/line-msdf.png'); - * texture.minFilter = gl.LINEAR; - * texture.generateMipmaps = false; - */ -export function loadTexture(gl: OGLRenderingContext, src: string): Promise { - const texture = TextureLoader.load(gl, {src}); - return texture.loaded!.then(() => texture); -} diff --git a/adev/src/app/features/playground/playground.component.spec.ts b/adev/src/app/features/playground/playground.component.spec.ts index d94a1c37c1fa..ea9cdad7aa55 100644 --- a/adev/src/app/features/playground/playground.component.spec.ts +++ b/adev/src/app/features/playground/playground.component.spec.ts @@ -9,7 +9,8 @@ import {ComponentFixture, TestBed} from '@angular/core/testing'; import {WINDOW} from '@angular/docs'; -import {NodeRuntimeSandbox, EmbeddedTutorialManager} from '../../editor'; +import {EmbeddedTutorialManager} from '../../editor'; +import {NodeRuntimeSandbox} from '../../editor/node-runtime-sandbox.service'; import TutorialPlayground from './playground.component'; diff --git a/adev/src/app/features/playground/playground.component.ts b/adev/src/app/features/playground/playground.component.ts index 0f16e388755e..b5b3234c9db9 100644 --- a/adev/src/app/features/playground/playground.component.ts +++ b/adev/src/app/features/playground/playground.component.ts @@ -24,7 +24,8 @@ import {IconComponent, PlaygroundTemplate} from '@angular/docs'; import {forkJoin, switchMap, tap} from 'rxjs'; import {injectAsync} from '../../core/services/inject-async'; -import type {EmbeddedTutorialManager, NodeRuntimeSandbox} from '../../editor/index'; +import {injectNodeRuntimeSandbox} from '../../editor/index'; +import type {NodeRuntimeSandbox} from '../../editor/node-runtime-sandbox.service'; import PLAYGROUND_ROUTE_DATA_JSON from '../../../../src/assets/tutorials/playground/routes.json'; @@ -62,9 +63,7 @@ export default class PlaygroundComponent implements AfterViewInit { // and completed, which can lead to a memory leak if the user navigates away from // the playground component to another page. forkJoin({ - nodeRuntimeSandbox: injectAsync(this.environmentInjector, () => - import('../../editor/index').then((c) => c.NodeRuntimeSandbox), - ), + nodeRuntimeSandbox: injectNodeRuntimeSandbox(this.environmentInjector), embeddedEditorComponent: import('../../editor/index').then((c) => c.EmbeddedEditor), }) .pipe( @@ -88,6 +87,7 @@ export default class PlaygroundComponent implements AfterViewInit { async changeTemplate(template: PlaygroundTemplate): Promise { this.selectedTemplate = template; await this.loadTemplate(template.path); + await this.nodeRuntimeSandbox!.reset(); } private async loadTemplate(tutorialPath: string) { diff --git a/adev/src/app/features/references/api-items-section/api-items-section.component.html b/adev/src/app/features/references/api-items-section/api-items-section.component.html index 3b0ec811cfbb..52578f6aecb7 100644 --- a/adev/src/app/features/references/api-items-section/api-items-section.component.html +++ b/adev/src/app/features/references/api-items-section/api-items-section.component.html @@ -26,10 +26,10 @@

    class="docs-api-item-label" aria-hidden="true" /> - {{ apiItem.title }} + {{ apiItem.title }} @if (apiItem.isDeprecated) { - <!> + <!> }

  • } diff --git a/adev/src/app/features/references/api-items-section/api-items-section.component.scss b/adev/src/app/features/references/api-items-section/api-items-section.component.scss index dec2b9080fc1..a13c428ce45e 100644 --- a/adev/src/app/features/references/api-items-section/api-items-section.component.scss +++ b/adev/src/app/features/references/api-items-section/api-items-section.component.scss @@ -28,33 +28,39 @@ } .adev-api-items-section-grid { - display: grid; - grid-template-columns: 1fr 1fr 1fr; + column-count: 3; + column-gap: 0.5rem; padding: 0; @container api-ref-page (max-width: 798px) { - grid-template-columns: 1fr 1fr; + column-count: 2; } @container api-ref-page (max-width: 600px) { - grid-template-columns: 1fr; + column-count: 1; } li { - display: flex; + display: inline-flex; align-items: center; border-inline-start: 1px solid var(--senary-contrast); padding: 0.3rem; padding-inline-start: 0.75rem; font-size: 0.875rem; + text-overflow: ellipsis; + box-sizing: border-box; + width: 100%; a { color: var(--quaternary-contrast); display: flex; align-items: center; + overflow: hidden; + padding-block: 2px; } .adev-item-title { - margin-block-start: 3px; + overflow: hidden; + text-overflow: ellipsis; } &:hover { @@ -73,7 +79,7 @@ gap: 1em; } -.docs-deprecated { +.adev-deprecated { font-family: var(--code-font); background-color: var(--senary-contrast); color: var(--tertiary-contrast); diff --git a/adev/src/app/features/references/api-items-section/api-items-section.component.spec.ts b/adev/src/app/features/references/api-items-section/api-items-section.component.spec.ts index 7a79182ecfc5..ddb4a9fba95b 100644 --- a/adev/src/app/features/references/api-items-section/api-items-section.component.spec.ts +++ b/adev/src/app/features/references/api-items-section/api-items-section.component.spec.ts @@ -10,7 +10,6 @@ import {ComponentFixture, TestBed} from '@angular/core/testing'; import ApiItemsSection from './api-items-section.component'; import {ApiItemsGroup} from '../interfaces/api-items-group'; -import {ApiReferenceManager} from '../api-reference-list/api-reference-manager.service'; import {ApiItemType} from '../interfaces/api-item-type'; import {provideRouter} from '@angular/router'; import {By} from '@angular/platform-browser'; @@ -60,7 +59,7 @@ describe('ApiItemsSection', () => { fixture.detectChanges(); const deprecatedApiIcons = fixture.debugElement.queryAll( - By.css('.adev-api-items-section-grid li .docs-deprecated'), + By.css('.adev-api-items-section-grid li .adev-deprecated'), ); const deprecatedApiTitle = deprecatedApiIcons[0].parent?.query(By.css('.adev-item-title')); diff --git a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.html b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.html index d61fcf0aa8c9..8c5e47f8de6e 100644 --- a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.html +++ b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.html @@ -1,30 +1,9 @@ -
    - - - - @for (tab of tabs(); track tab.url) { - -
    - -
    -
    - } -
    -
    - -@if (isApiTabActive()) { +@if (docContent(); as docContent) { - + [docContent]="docContent.contents" + [hasToc]="true" + (contentLoaded)="onContentLoaded()" + /> }
    Jump to details
    diff --git a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.scss b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.scss index a2ac3ac78023..3d475c60b4f1 100644 --- a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.scss +++ b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.scss @@ -1,11 +1,23 @@ @use '@angular/docs/styles/media-queries' as mq; +@use '@angular/docs/styles/reference' as ref; :host { - display: flex; - gap: 1rem; + display: block; width: 100%; + max-width: var(--page-width); + padding: var(--layout-padding) 0 1rem var(--layout-padding); box-sizing: border-box; - flex-direction: column; + + @include mq.for-desktop-down { + padding: var(--layout-padding); + max-width: none; + } + + &::-webkit-scrollbar-thumb { + background-color: var(--septenary-contrast); + border-radius: 10px; + transition: background-color 0.3s ease; + } h1 { font-size: 1.5rem; @@ -27,391 +39,7 @@ } } -// stylelint-disable-next-line ::ng-deep { - .adev-header-and-tabs { - padding: var(--layout-padding) 0 1rem var(--layout-padding); - box-sizing: border-box; - width: 100%; - max-width: var(--page-width); - - @include mq.for-desktop-down { - padding: var(--layout-padding); - max-width: none; - } - - &::-webkit-scrollbar-thumb { - background-color: var(--septenary-contrast); - border-radius: 10px; - transition: background-color 0.3s ease; - } - } - - .docs-code { - pre { - margin-block: 0; - } - } - - .docs-reference-header { - > p { - color: var(--secondary-contrast); - margin-block-start: 0; - margin-block-end: 1.5rem; - } - - .docs-code { - margin-block-end: 1.5rem; - } - } - - .adev-reference-tab-body { - margin-block-start: 1.5rem; - docs-viewer > div { - :first-child { - margin-top: 0; - } - } - } - - .docs-reference-api-tab { - display: flex; - gap: 1.81rem; - align-items: flex-start; - margin-bottom: 1px; - - @include mq.for-desktop-down { - flex-direction: column; - } - - & > .docs-code { - box-sizing: border-box; - width: 100%; - overflow: hidden; - padding: 0; - - @include mq.for-desktop-down { - width: 100%; - position: static; - } - - button { - transition: background-color 0.3s ease; - - &.shiki-ln-line-highlighted { - background-color: var(--senary-contrast); - } - &:hover { - background-color: var(--septenary-contrast); - } - &:focus { - background-color: var(--senary-contrast); - } - } - - // Hide copy source code button - button[docs-copy-source-code] { - display: none; - } - } - - code { - margin-block: 0; - } - - pre { - white-space: pre; - overflow-x: auto; - margin: 0; - } - } - - .docs-reference-cli-toc { - margin-bottom: 1rem; - } - - .adev-reference-tab { - min-width: 50ch; - margin-block-start: 2.5rem; - } - - .docs-reference-members-container { - width: 40%; - box-sizing: border-box; - width: 100%; - max-width: var(--page-width); - padding: 0 0 1rem var(--layout-padding); - - @include mq.for-desktop-down { - padding: var(--layout-padding); - padding-top: 0; - max-width: none; - } - } - - // Sidebar - .docs-reference-members { - display: flex; - flex-direction: column; - gap: 20px; - - @include mq.for-desktop-down { - width: 100%; - } - } - - .docs-reference-title { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - padding-block-end: 0; - gap: 0.5rem; - - > div { - margin-block: 0.67em; - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 0.5rem; - - h1 { - margin-block: 0; - } - } - - a { - fill: var(--quinary-contrast); - transition: fill 0.3s ease; - - &:hover { - fill: var(--primary-contrast); - } - } - } - - .adev-reference-labels { - display: flex; - gap: 0.5rem; - } - - .docs-reference-category { - color: var(--gray-400); - font-size: 0.875rem; - font-weight: 500; - line-height: 1.4rem; - letter-spacing: -0.00875rem; - } - - .docs-reference-card-header { - display: flex; - align-items: center; - justify-content: space-between; - gap: 0.5rem; - flex-wrap: wrap; - - padding: 0.7rem 1rem; - - code:not(pre *) { - padding: 0 0.3rem; - } - } - - .docs-reference-member-card { - border: 1px solid var(--senary-contrast); - border-radius: 0.25rem; - position: relative; - transition: border 0.3s ease; - - &::before { - content: ''; - inset: -1px; - position: absolute; - background: transparent; - border-radius: 0.35rem; - z-index: 0; - } - - &:focus { - box-shadow: 10px 4px 40px 0 rgba(0, 0, 0, 0.01); - - &::before { - background: var(--red-to-pink-to-purple-horizontal-gradient); - } - } - - header { - display: flex; - flex-direction: column; - border-radius: 0.25rem 0.25rem 0 0; - background-color: var(--octonary-contrast); - position: relative; - z-index: 10; - cursor: pointer; - transition: - background-color 0.3s ease, - border 0.3s ease; - - & > code { - max-width: 100%; - } - - code:has(pre) { - padding: 0; - } - - pre { - margin: 0; - - /* Do we have a better alternative ? */ - overflow: auto; - } - } - - .docs-reference-card-header { - h3 { - display: inline-block; - font-family: var(--code-font); - font-size: 1rem; - letter-spacing: -0.025rem; - margin: 0; - max-width: 100%; - overflow: hidden; - text-overflow: ellipsis; - } - - code, - span { - font-size: 0.875rem; - } - } - - > p { - padding-inline: 1.25rem; - margin-block-end: 0; - } - } - - .docs-reference-card-body { - padding: 0.25rem 1.25rem; - background: var(--septenary-contrast); - transition: background-color 0.3s ease; - color: var(--quaternary-contrast); - border-radius: 0 0 0.25rem 0.25rem; - position: relative; - z-index: 10; - hr { - margin-block: 2rem; - } - .docs-code { - margin-block-end: 1rem; - } - - &:empty { - display: none; - } - } - - // when it's not the only card... - .docs-reference-card-item:has(~ .docs-reference-card-item) { - border: 1px solid var(--senary-contrast); - margin-block: 1rem; - border-radius: 0.25rem; - padding-inline: 1rem; - } - // & the last card - .docs-reference-card-item:last-child { - &:not(:first-of-type) { - border: 1px solid var(--senary-contrast); - margin-block: 1rem; - border-radius: 0.25rem; - padding-inline: 1rem; - } - } - - .docs-reference-card-item { - span { - display: inline-block; - font-size: 0.875rem; - } - code { - font-size: 0.875rem; - } - } - - .docs-function-definition { - &:has(*) { - border-block-end: 1px solid var(--senary-contrast); - } - } - - .docs-deprecation-message { - border-block-end: 1px solid var(--senary-contrast); - } - - .docs-param-group { - margin-block-start: 1rem; - } - - // If it's the only param group... - .docs-param-group:not(:has(~ .docs-param-group)) { - margin-block: 1rem; - } - - .docs-return-type { - padding-block: 1rem; - - // & does not follow a function definition - &:not(.docs-function-definition + .docs-return-type) { - border-block-start: 1px solid var(--senary-contrast); - } - } - - .docs-param-keyword { - color: var(--primary-contrast); - font-family: var(--code-font); - margin-inline-end: 0.5rem; - } - - .docs-param-name { - color: var(--vivid-pink); - font-family: var(--code-font); - margin-inline-end: 0.25rem; - &::after { - content: ':'; - } - } - - .docs-deprecated { - color: var(--page-background); - background-color: var(--quaternary-contrast); - width: max-content; - border-radius: 0.25rem; - padding: 0.1rem 0.25rem; - margin-block-start: 1rem; - } - - // deprecated markers beside header - .docs-reference-header ~ .docs-deprecated { - margin-block-start: 0.5rem; - } - - .docs-parameter-description { - p:first-child { - margin-block-start: 0; - } - } - - .docs-ref-content { - padding: 1rem 0; - - &:not(:first-child) { - border-block-start: 1px solid var(--senary-contrast); - } - - .docs-param-keyword { - display: block; - margin: 0 0 0.5rem 0; - } - } + @include ref.reference-common(); + @include ref.api-reference(); } diff --git a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.spec.ts b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.spec.ts index 7bc5a6a40bc3..18c9830c022e 100644 --- a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.spec.ts +++ b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.spec.ts @@ -6,37 +6,29 @@ * found in the LICENSE file at https://angular.dev/license */ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {TestBed} from '@angular/core/testing'; -import {MatTabGroupHarness} from '@angular/material/tabs/testing'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; import {provideNoopAnimations} from '@angular/platform-browser/animations'; import {ReferenceScrollHandler} from '../services/reference-scroll-handler.service'; -import {signal} from '@angular/core'; import {provideRouter, withComponentInputBinding} from '@angular/router'; import {RouterTestingHarness} from '@angular/router/testing'; import ApiReferenceDetailsPage from './api-reference-details-page.component'; -import {By} from '@angular/platform-browser'; describe('ApiReferenceDetailsPage', () => { let component: ApiReferenceDetailsPage; - let loader: HarnessLoader; - let harness: RouterTestingHarness; + let fixture: ComponentFixture; let fakeApiReferenceScrollHandler = { setupListeners: () => {}, - membersMarginTopInPx: signal(10), - updateMembersMarginTop: () => {}, }; - const SAMPLE_CONTENT_WITH_TABS = `
    -
    -
    -
    -
    -
    -
    `; + const SAMPLE_CONTENT_WITH_SECTIONS = `
    +
    API
    +
    +
    Description
    +
    Examples
    +
    Usage Notes
    +
    `; beforeEach(async () => { TestBed.configureTestingModule({ @@ -51,7 +43,7 @@ describe('ApiReferenceDetailsPage', () => { data: { 'docContent': { id: 'id', - contents: SAMPLE_CONTENT_WITH_TABS, + contents: SAMPLE_CONTENT_WITH_SECTIONS, }, }, }, @@ -61,10 +53,9 @@ describe('ApiReferenceDetailsPage', () => { ], }); TestBed.overrideProvider(ReferenceScrollHandler, {useValue: fakeApiReferenceScrollHandler}); - harness = await RouterTestingHarness.create(); - const {fixture} = harness; + const harness = await RouterTestingHarness.create(); + fixture = harness.fixture; component = await harness.navigateByUrl('/', ApiReferenceDetailsPage); - loader = TestbedHarnessEnvironment.loader(fixture); fixture.detectChanges(); }); @@ -72,39 +63,10 @@ describe('ApiReferenceDetailsPage', () => { expect(component).toBeTruthy(); }); - it('should render tabs for all elements with tab attribute', async () => { - const matTabGroup = await loader.getHarness(MatTabGroupHarness); + it('should load the doc content', () => { + expect(component.docContent()?.contents).toBeTruthy(); - const tabs = await matTabGroup.getTabs(); - - expect(tabs.length).toBe(4); - }); - - it('should display members cards when API tab is active', async () => { - const matTabGroup = await loader.getHarness(MatTabGroupHarness); - const tabs = await matTabGroup.getTabs(); - - let membersCard = harness.fixture.debugElement.query( - By.css('.docs-reference-members-container'), - ); - expect(membersCard).toBeTruthy(); - - await matTabGroup.selectTab({label: await tabs[1].getLabel()}); - - membersCard = harness.fixture.debugElement.query(By.css('.docs-reference-members-container')); - expect(membersCard).toBeFalsy(); - - await matTabGroup.selectTab({label: await tabs[0].getLabel()}); - - membersCard = harness.fixture.debugElement.query(By.css('.docs-reference-members-container')); - expect(membersCard).toBeTruthy(); - }); - - it('should setup scroll listeners when API members are loaded', () => { - const setupListenersSpy = spyOn(fakeApiReferenceScrollHandler, 'setupListeners'); - - component.membersCardsLoaded(); - - expect(setupListenersSpy).toHaveBeenCalled(); + const docsViewer = fixture.nativeElement.querySelector('docs-viewer'); + expect(docsViewer).toBeTruthy(); }); }); diff --git a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.ts b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.ts index 5593f197fba6..77201a355f42 100644 --- a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.ts +++ b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.ts @@ -6,113 +6,81 @@ * found in the LICENSE file at https://angular.dev/license */ -import {ChangeDetectionStrategy, Component, inject, input, computed} from '@angular/core'; -import {DOCUMENT} from '@angular/common'; -import {MatTabsModule} from '@angular/material/tabs'; +import {ChangeDetectionStrategy, Component, effect, inject, input, Renderer2} from '@angular/core'; +import {toSignal} from '@angular/core/rxjs-interop'; import {DocContent, DocViewer} from '@angular/docs'; -import {ActivatedRoute, Router} from '@angular/router'; -import {ApiItemType} from './../interfaces/api-item-type'; +import {ActivatedRoute} from '@angular/router'; +import {DOCUMENT} from '@angular/common'; import {ReferenceScrollHandler} from '../services/reference-scroll-handler.service'; -import { - API_REFERENCE_DETAILS_PAGE_HEADER_CLASS_NAME, - API_REFERENCE_DETAILS_PAGE_MEMBERS_CLASS_NAME, - API_REFERENCE_TAB_ATTRIBUTE, - API_REFERENCE_TAB_API_LABEL, - API_TAB_CLASS_NAME, - API_REFERENCE_TAB_URL_ATTRIBUTE, -} from '../constants/api-reference-prerender.constants'; -import {AppScroller} from '../../../app-scroller'; +import {API_SECTION_CLASS_NAME} from '../constants/api-reference-prerender.constants'; + +const HIGHLIGHTED_CARD_CLASS = 'highlighted'; @Component({ selector: 'adev-reference-page', - imports: [DocViewer, MatTabsModule], + standalone: true, + imports: [DocViewer], templateUrl: './api-reference-details-page.component.html', styleUrls: ['./api-reference-details-page.component.scss'], providers: [ReferenceScrollHandler], changeDetection: ChangeDetectionStrategy.OnPush, }) export default class ApiReferenceDetailsPage { - private readonly activatedRoute = inject(ActivatedRoute); + private readonly referenceScrollHandler = inject(ReferenceScrollHandler); + private readonly route = inject(ActivatedRoute); private readonly document = inject(DOCUMENT); - private readonly router = inject(Router); - private readonly scrollHandler = inject(ReferenceScrollHandler); - private readonly appScroller = inject(AppScroller); - - docContent = input(); - tab = input(); - - // aliases - ApiItemType = ApiItemType; - - // computed state - parsedDocContent = computed(() => { - // TODO: pull this logic outside of a computed where it can be tested etc. - const docContent = this.docContent(); - - if (docContent === undefined) { - return { - header: undefined, - members: undefined, - tabs: [], - }; - } - - const element = this.document.createElement('div'); - element.innerHTML = docContent.contents; - - // Get the innerHTML of the header element from received document. - const header = element.querySelector(API_REFERENCE_DETAILS_PAGE_HEADER_CLASS_NAME); - // Get the innerHTML of the card elements from received document. - const members = element.querySelector(API_REFERENCE_DETAILS_PAGE_MEMBERS_CLASS_NAME); + private readonly renderer = inject(Renderer2); - // Get the tab elements from received document. - // We're expecting that tab element will contain `tab` attribute. - const tabs = Array.from(element.querySelectorAll(`[${API_REFERENCE_TAB_ATTRIBUTE}]`)).map( - (tab) => ({ - url: tab.getAttribute(API_REFERENCE_TAB_URL_ATTRIBUTE)!, - title: tab.getAttribute(API_REFERENCE_TAB_ATTRIBUTE)!, - content: tab.innerHTML, - }), - ); + private highlightedElement: HTMLElement | null = null; - element.remove(); - - return { - header: header?.innerHTML, - members: members?.innerHTML, - tabs, - }; - }); - - tabs = () => this.parsedDocContent().tabs; - - selectedTabIndex = computed(() => { - const existingTabIdx = this.tabs().findIndex((tab) => tab.url === this.tab()); - return Math.max(existingTabIdx, 0); - }); - - isApiTabActive = computed(() => { - const activeTabTitle = this.tabs()[this.selectedTabIndex()]?.title; - return activeTabTitle === API_REFERENCE_TAB_API_LABEL || activeTabTitle === 'CLI'; - }); + docContent = input(); + urlFragment = toSignal(this.route.fragment); constructor() { - this.appScroller.disableScrolling = true; + effect(() => this.highlightCard()); } - ngOnDestroy() { - this.appScroller.disableScrolling = false; + onContentLoaded() { + this.referenceScrollHandler.setupListeners(API_SECTION_CLASS_NAME); + this.scrollToSectionLegacy(); + this.highlightCard(); } - membersCardsLoaded(): void { - this.scrollHandler.setupListeners(API_TAB_CLASS_NAME); + /** Handle legacy URLs with a `tab` query param from the old tab layout */ + private scrollToSectionLegacy() { + const params = this.route.snapshot.queryParams; + const tab = params['tab'] as string | undefined; + + if (tab) { + const section = this.document.getElementById(tab); + + if (section) { + // `scrollIntoView` is ignored even, if the element exists. + // It seems that it's related to: https://issues.chromium.org/issues/40715316 + // Hence, the usage of `setTimeout`. + setTimeout(() => { + section.scrollIntoView({behavior: 'smooth'}); + }, 100); + } + } } - tabChange(tabIndex: number) { - this.router.navigate([], { - relativeTo: this.activatedRoute, - queryParams: {tab: this.tabs()[tabIndex].url}, - queryParamsHandling: 'merge', - }); + /** Highlight the member card that corresponds to the URL fragment. */ + private highlightCard() { + if (this.highlightedElement) { + this.renderer.removeClass(this.highlightedElement, HIGHLIGHTED_CARD_CLASS); + this.highlightedElement = null; + } + + const fragment = this.urlFragment(); + + if (fragment) { + const element = this.document.getElementById(fragment); + + if (element) { + this.renderer.addClass(element, HIGHLIGHTED_CARD_CLASS); + } + this.highlightedElement = element; + } } } diff --git a/adev/src/app/features/references/api-reference-list/api-reference-list.component.html b/adev/src/app/features/references/api-reference-list/api-reference-list.component.html index f8d9d9d14c62..e621558c8b97 100644 --- a/adev/src/app/features/references/api-reference-list/api-reference-list.component.html +++ b/adev/src/app/features/references/api-reference-list/api-reference-list.component.html @@ -4,7 +4,12 @@

    API Reference

    - + { let component: ApiReferenceList; @@ -103,7 +105,7 @@ describe('ApiReferenceList', () => { }); it('should set selected type when provided type is different than selected', async () => { - expect(component.type()).toBe(ALL_STATUSES_KEY); + expect(component.type()).toBe(ALL_TYPES_KEY); component.filterByItemType(ApiItemType.BLOCK); await RouterTestingHarness.create(`/api?type=${ApiItemType.BLOCK}`); expect(component.type()).toBe(ApiItemType.BLOCK); @@ -116,12 +118,15 @@ describe('ApiReferenceList', () => { component.filterByItemType(ApiItemType.BLOCK); harness.navigateByUrl(`/api`); - expect(component.type()).toBe(ALL_STATUSES_KEY); + expect(component.type()).toBe(ALL_TYPES_KEY); }); - it('should set the value of the queryParam equal to the query value', async () => { + it('should set the value of the queryParam equal to the query text field', async () => { const location = TestBed.inject(Location); - component.query.set('item1'); + + const textField = fixture.debugElement.query(By.directive(TextField)); + (textField.componentInstance as TextField).setValue('item1'); + await fixture.whenStable(); expect(location.path()).toBe(`?query=item1&type=All`); }); @@ -129,7 +134,8 @@ describe('ApiReferenceList', () => { it('should keep the values of existing queryParams and set new queryParam equal to the type', async () => { const location = TestBed.inject(Location); - component.query.set('item1'); + const textField = fixture.debugElement.query(By.directive(TextField)); + (textField.componentInstance as TextField).setValue('item1'); await fixture.whenStable(); expect(location.path()).toBe(`?query=item1&type=All`); diff --git a/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts b/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts index 78f6d0a7f042..95bbdd82d025 100644 --- a/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts +++ b/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts @@ -11,7 +11,6 @@ import { Component, ElementRef, computed, - effect, inject, model, signal, @@ -28,7 +27,7 @@ import ApiItemLabel from '../api-item-label/api-item-label.component'; import {ApiLabel} from '../pipes/api-label.pipe'; import {ApiItemsGroup} from '../interfaces/api-items-group'; -export const ALL_STATUSES_KEY = 'All'; +export const ALL_TYPES_KEY = 'All'; @Component({ selector: 'adev-reference-list', @@ -44,7 +43,7 @@ export default class ApiReferenceList { // inputs query = model(''); - type = model(ALL_STATUSES_KEY); + type = model(ALL_TYPES_KEY); // const state itemTypes = Object.values(ApiItemType); @@ -61,26 +60,10 @@ export default class ApiReferenceList { // Use the CVA to focus when https://github.com/angular/angular/issues/31133 is implemented if (matchMedia('(hover: hover) and (pointer:fine)').matches) { scheduleOnIdle(() => { - this.filterInput().nativeElement.querySelector('input').focus(); + this.filterInput().nativeElement.querySelector('input').focus({preventScroll: true}); }); } }); - - effect(() => { - const params: Params = { - 'query': this.query() ?? null, - 'type': this.type() ?? null, - }; - - this.router.navigate([], { - queryParams: params, - replaceUrl: true, - preserveFragment: true, - info: { - disableScrolling: true, - }, - }); - }); } filteredGroups = computed((): ApiItemsGroup[] => { @@ -95,7 +78,7 @@ export default class ApiReferenceList { (query !== undefined ? apiItem.title.toLocaleLowerCase().includes(query) : true) && (this.includeDeprecated() ? true : apiItem.isDeprecated === this.includeDeprecated()) && (this.type() === undefined || - this.type() === ALL_STATUSES_KEY || + this.type() === ALL_TYPES_KEY || apiItem.itemType === this.type()) ); }), @@ -104,7 +87,27 @@ export default class ApiReferenceList { }); filterByItemType(itemType: ApiItemType): void { - this.type.update((currentType) => (currentType === itemType ? ALL_STATUSES_KEY : itemType)); + this.type.update((currentType) => (currentType === itemType ? ALL_TYPES_KEY : itemType)); + this.syncUrlWithFilters(); + } + + // Avoid calling in an `effect`. The `navigate` call will replace the state in + // the history which will nullify the `Scroll` position which, respectively, + // will break the scroll position restoration. Not only that but `disableScrolling=true`. + syncUrlWithFilters() { + const params: Params = { + 'query': this.query() ?? null, + 'type': this.type() ?? null, + }; + + this.router.navigate([], { + queryParams: params, + replaceUrl: true, + preserveFragment: true, + info: { + disableScrolling: true, + }, + }); } } diff --git a/adev/src/app/features/references/api-reference-list/api-reference-manager.service.ts b/adev/src/app/features/references/api-reference-list/api-reference-manager.service.ts index ba1f9dd2b705..0af4d7e5cf32 100644 --- a/adev/src/app/features/references/api-reference-list/api-reference-manager.service.ts +++ b/adev/src/app/features/references/api-reference-list/api-reference-manager.service.ts @@ -28,17 +28,15 @@ export class ApiReferenceManager { groups.push({ title: module.moduleLabel.replace('@angular/', ''), id: module.normalizedModuleName, - items: module.entries - .map((api) => { - const url = getApiUrl(module, api.name); - return { - itemType: api.type, - title: api.name, - isDeprecated: !!api.isDeprecated, - url, - }; - }) - .sort((a, b) => a.title.localeCompare(b.title)), + items: module.entries.map((api) => { + const url = getApiUrl(module, api.name); + return { + itemType: api.type, + title: api.name, + isDeprecated: !!api.isDeprecated, + url, + }; + }), }); } diff --git a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.html b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.html index 4345ce9f1e8e..b9ba87546e1d 100644 --- a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.html +++ b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.html @@ -1,11 +1,5 @@ -
    - -
    - - +@if (docContent(); as docContent) { + +}
    Jump to details
    diff --git a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.scss b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.scss index e1d1fcc38e8d..9d356ce0c804 100644 --- a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.scss +++ b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.scss @@ -1,123 +1,21 @@ @use '@angular/docs/styles/media-queries' as mq; -// Note: cli-reference-details-page is receiving page styles -// from api-reference-details-page.component.scss +@use '@angular/docs/styles/reference' as ref; -// stylelint-disable-next-line -::ng-deep { - .adev-ref-content { - display: flex; - padding-block: 1rem; - gap: 1rem; - &:not(:last-of-type) { - border-block-end: 1px solid var(--senary-contrast); - } - } - - .adev-header-and-tabs { - &.adev-cli-content { - width: 100%; - max-width: var(--page-width); - - @include mq.for-desktop-down { - max-width: none; - } - } - } - - .adev-cli-members-container { - padding: 0 0 var(--layout-padding) var(--layout-padding); - padding-bottom: 1rem; - box-sizing: border-box; - max-width: var(--page-width); - - @include mq.for-desktop-down { - width: 100%; - padding: var(--layout-padding); - padding-top: 0; - max-width: none; - } - } - - .adev-ref-option-and-description { - flex-grow: 1; - max-width: calc(100% - 80px); - p { - margin-block-end: 0; - } - } - - .docs-reference-type-and-default { - width: 4.375rem; - flex-shrink: 0; - span { - display: block; - font-size: 0.875rem; - margin-block-end: 0.2rem; - white-space: nowrap; - - &:not(:first-child) { - margin-block-start: 1rem; - } - } +:host { + display: block; + width: 100%; + max-width: var(--page-width); + padding: var(--layout-padding) 0 1rem var(--layout-padding); + box-sizing: border-box; - code { - font-size: 0.775rem; - } + @include mq.for-desktop-down { + padding: var(--layout-padding); + max-width: none; } +} - .adev-reference-cli-toc { - border: 1px solid var(--senary-contrast); - border-radius: 0.3rem; - position: relative; - transition: border 0.3s ease; - - &::before { - content: ''; - inset: -1px; - position: absolute; - background: transparent; - border-radius: 0.35rem; - z-index: 0; - } - - &:has(.shiki-ln-line-highlighted) { - &::before { - background: var(--red-to-pink-to-purple-horizontal-gradient); - } - } - - pre { - border-radius: 0.25rem; - position: relative; - z-index: 100; - background: var(--octonary-contrast); - } - } - - .shiki-ln-line-argument, - .shiki-ln-line-option { - padding: 0.1rem 0.2rem 0.2rem; - margin-inline: 0.1rem; - color: var(--quaternary-contrast); - background: transparent; - border-radius: 0.25rem; - position: relative; - transition: - color 0.3s ease, - background 0.3s ease, - border 0.3s ease; - - &:hover { - color: var(--primary-contrast); - background: var(--septenary-contrast); - } - - &.shiki-ln-line-highlighted { - color: var(--primary-contrast); - background: var(--senary-contrast); - } - } - .shiki-ln-line-argument { - margin-inline-start: 0.2rem; - } +// stylelint-disable-next-line +::ng-deep { + @include ref.reference-common(); + @include ref.cli-reference(); } diff --git a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.spec.ts b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.spec.ts index a0e7a100511f..fc7e14c94384 100644 --- a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.spec.ts +++ b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.spec.ts @@ -6,23 +6,20 @@ * found in the LICENSE file at https://angular.dev/license */ -import {TestBed} from '@angular/core/testing'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; import CliReferenceDetailsPage from './cli-reference-details-page.component'; -import {RouterTestingHarness, RouterTestingModule} from '@angular/router/testing'; -import {signal} from '@angular/core'; +import {RouterTestingHarness} from '@angular/router/testing'; import {ReferenceScrollHandler} from '../services/reference-scroll-handler.service'; -import {provideRouter} from '@angular/router'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {provideRouter, withComponentInputBinding} from '@angular/router'; +import {provideNoopAnimations} from '@angular/platform-browser/animations'; describe('CliReferenceDetailsPage', () => { let component: CliReferenceDetailsPage; - let harness: RouterTestingHarness; + let fixture: ComponentFixture; let fakeApiReferenceScrollHandler = { setupListeners: () => {}, - membersMarginTopInPx: signal(0), - updateMembersMarginTop: () => {}, }; const SAMPLE_CONTENT = ` @@ -34,33 +31,42 @@ describe('CliReferenceDetailsPage', () => { beforeEach(async () => { TestBed.configureTestingModule({ - imports: [CliReferenceDetailsPage, RouterTestingModule], + imports: [CliReferenceDetailsPage], providers: [ - provideRouter([ - { - path: '**', - component: CliReferenceDetailsPage, - data: { - 'docContent': { - id: 'id', - contents: SAMPLE_CONTENT, + provideNoopAnimations(), + provideRouter( + [ + { + path: '**', + component: CliReferenceDetailsPage, + data: { + 'docContent': { + id: 'id', + contents: SAMPLE_CONTENT, + }, }, }, - }, - ]), + ], + withComponentInputBinding(), + ), ], }); TestBed.overrideProvider(ReferenceScrollHandler, {useValue: fakeApiReferenceScrollHandler}); - harness = await RouterTestingHarness.create(); - const {fixture} = harness; + const harness = await RouterTestingHarness.create(); + fixture = harness.fixture; component = await harness.navigateByUrl('/', CliReferenceDetailsPage); - TestbedHarnessEnvironment.loader(fixture); fixture.detectChanges(); }); - it('should set content on init', () => { - expect(component.mainContentInnerHtml()).toBe('First column content'); - expect(component.cardsInnerHtml()).toBe('Members content'); + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should load the doc content', () => { + expect(component.docContent()?.contents).toBeTruthy(); + + const docsViewer = fixture.nativeElement.querySelector('docs-viewer'); + expect(docsViewer).toBeTruthy(); }); }); diff --git a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.ts b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.ts index 75414c361643..ebbadfe7b361 100644 --- a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.ts +++ b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.ts @@ -6,81 +6,16 @@ * found in the LICENSE file at https://angular.dev/license */ -import {DOCUMENT} from '@angular/common'; -import { - ChangeDetectionStrategy, - Component, - DestroyRef, - OnInit, - inject, - signal, -} from '@angular/core'; -import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; +import {ChangeDetectionStrategy, Component, input} from '@angular/core'; import {DocContent, DocViewer} from '@angular/docs'; -import {ActivatedRoute} from '@angular/router'; -import {map} from 'rxjs/operators'; -import {ReferenceScrollHandler} from '../services/reference-scroll-handler.service'; -import {API_REFERENCE_DETAILS_PAGE_MEMBERS_CLASS_NAME} from '../constants/api-reference-prerender.constants'; - -export const CLI_MAIN_CONTENT_SELECTOR = '.docs-reference-cli-content'; -export const CLI_TOC = '.adev-reference-cli-toc'; @Component({ selector: 'adev-cli-reference-page', imports: [DocViewer], templateUrl: './cli-reference-details-page.component.html', - styleUrls: [ - './cli-reference-details-page.component.scss', - '../api-reference-details-page/api-reference-details-page.component.scss', - ], - providers: [ReferenceScrollHandler], + styleUrls: ['./cli-reference-details-page.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export default class CliReferenceDetailsPage implements OnInit { - private readonly activatedRoute = inject(ActivatedRoute); - private readonly destroyRef = inject(DestroyRef); - private readonly document = inject(DOCUMENT); - private readonly scrollHandler = inject(ReferenceScrollHandler); - - cardsInnerHtml = signal(''); - mainContentInnerHtml = signal(''); - - ngOnInit(): void { - this.setPageContent(); - } - - contentLoaded(): void { - this.scrollHandler.setupListeners(CLI_TOC); - } - - // Fetch the content for CLI Reference page based on the active route. - private setPageContent(): void { - this.activatedRoute.data - .pipe( - map((data) => data['docContent']), - takeUntilDestroyed(this.destroyRef), - ) - .subscribe((doc: DocContent | undefined) => { - this.setContentForPageSections(doc); - }); - } - - private setContentForPageSections(doc: DocContent | undefined) { - const element = this.document.createElement('div'); - element.innerHTML = doc?.contents!; - - // Get the innerHTML of the main content from received document. - const mainContent = element.querySelector(CLI_MAIN_CONTENT_SELECTOR); - if (mainContent) { - this.mainContentInnerHtml.set(mainContent.innerHTML); - } - - // Get the innerHTML of the cards from received document. - const cards = element.querySelector(API_REFERENCE_DETAILS_PAGE_MEMBERS_CLASS_NAME); - if (cards) { - this.cardsInnerHtml.set(cards.innerHTML); - } - - element.remove(); - } +export default class CliReferenceDetailsPage { + docContent = input(); } diff --git a/adev/src/app/features/references/constants/api-reference-prerender.constants.ts b/adev/src/app/features/references/constants/api-reference-prerender.constants.ts index f0a9dd731e2b..84cc97814b90 100644 --- a/adev/src/app/features/references/constants/api-reference-prerender.constants.ts +++ b/adev/src/app/features/references/constants/api-reference-prerender.constants.ts @@ -6,10 +6,5 @@ * found in the LICENSE file at https://angular.dev/license */ -export const API_REFERENCE_DETAILS_PAGE_HEADER_CLASS_NAME = '.docs-reference-header'; -export const API_REFERENCE_DETAILS_PAGE_MEMBERS_CLASS_NAME = '.docs-reference-members-container'; -export const API_REFERENCE_TAB_ATTRIBUTE = 'data-tab'; -export const API_REFERENCE_TAB_URL_ATTRIBUTE = 'data-tab-url'; -export const API_REFERENCE_TAB_API_LABEL = 'API'; -export const API_TAB_CLASS_NAME = '.docs-reference-api-tab'; +export const API_SECTION_CLASS_NAME = 'docs-reference-api-section'; export const MEMBER_ID_ATTRIBUTE = 'member-id'; diff --git a/adev/src/app/features/references/services/reference-scroll-handler.service.ts b/adev/src/app/features/references/services/reference-scroll-handler.service.ts index 7dc77823fb87..f8df1204726e 100644 --- a/adev/src/app/features/references/services/reference-scroll-handler.service.ts +++ b/adev/src/app/features/references/services/reference-scroll-handler.service.ts @@ -7,55 +7,29 @@ */ import {DOCUMENT, isPlatformBrowser} from '@angular/common'; -import {DestroyRef, Injectable, Injector, PLATFORM_ID, inject} from '@angular/core'; +import {DestroyRef, Injectable, PLATFORM_ID, inject} from '@angular/core'; import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; import {fromEvent} from 'rxjs'; import {MEMBER_ID_ATTRIBUTE} from '../constants/api-reference-prerender.constants'; -import {WINDOW} from '@angular/docs'; import {Router} from '@angular/router'; -import {AppScroller} from '../../../app-scroller'; - -// Adds some space/margin between the top of the target element and the top of viewport. -const SCROLL_MARGIN_TOP = 100; @Injectable() export class ReferenceScrollHandler { private readonly destroyRef = inject(DestroyRef); private readonly document = inject(DOCUMENT); - private readonly injector = inject(Injector); - private readonly window = inject(WINDOW); private readonly router = inject(Router); - private readonly appScroller = inject(AppScroller); private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); - setupListeners(tocSelector: string): void { + setupListeners(tocClass: string): void { if (!this.isBrowser) { return; } - this.setupCodeToCListeners(tocSelector); - this.setupFragmentChangeListener(); - } - - private setupFragmentChangeListener() { - this.router.routerState.root.fragment - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((fragment) => { - // If there is no fragment or the scroll event has a position (traversing through history), - // allow the scroller to handler scrolling instead of going to the fragment - if (!fragment || this.appScroller.lastScrollEvent?.position) { - this.appScroller.scroll(this.injector); - return; - } - - const card = this.document.getElementById(fragment) as HTMLDivElement | null; - card?.focus(); - this.scrollToCard(card); - }); + this.setupCodeToCListeners(tocClass); } - private setupCodeToCListeners(tocSelector: string): void { - const tocContainer = this.document.querySelector(tocSelector); + private setupCodeToCListeners(tocClass: string): void { + const tocContainer = this.document.querySelector(`.${tocClass}`); if (!tocContainer) { return; @@ -82,21 +56,6 @@ export class ReferenceScrollHandler { }); } - private scrollToCard(card: HTMLDivElement | null): void { - if (!card) { - return; - } - - if (card !== document.activeElement) { - (document.activeElement).blur(); - } - - this.window.scrollTo({ - top: card!.offsetTop - SCROLL_MARGIN_TOP, - behavior: 'smooth', - }); - } - private getMemberId(lineButton: HTMLButtonElement | null): string | undefined { if (!lineButton) { return undefined; diff --git a/adev/src/app/features/tutorial/tutorial.component.spec.ts b/adev/src/app/features/tutorial/tutorial.component.spec.ts index d0af41c957f3..249fb219fe95 100644 --- a/adev/src/app/features/tutorial/tutorial.component.spec.ts +++ b/adev/src/app/features/tutorial/tutorial.component.spec.ts @@ -14,12 +14,8 @@ import {provideNoopAnimations} from '@angular/platform-browser/animations'; import {provideRouter} from '@angular/router'; import {of} from 'rxjs'; -import { - EMBEDDED_EDITOR_SELECTOR, - EmbeddedEditor, - EmbeddedTutorialManager, - NodeRuntimeSandbox, -} from '../../editor'; +import {EMBEDDED_EDITOR_SELECTOR, EmbeddedEditor, EmbeddedTutorialManager} from '../../editor'; +import {NodeRuntimeSandbox} from '../../editor/node-runtime-sandbox.service'; import {mockAsyncProvider} from '../../core/services/inject-async'; import Tutorial from './tutorial.component'; diff --git a/adev/src/app/features/tutorial/tutorial.component.ts b/adev/src/app/features/tutorial/tutorial.component.ts index 5ed9051ae2a2..cdb3e6f17dbb 100644 --- a/adev/src/app/features/tutorial/tutorial.component.ts +++ b/adev/src/app/features/tutorial/tutorial.component.ts @@ -8,11 +8,12 @@ import {isPlatformBrowser, NgComponentOutlet, NgTemplateOutlet} from '@angular/common'; import { - AfterViewInit, + afterNextRender, ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, + DestroyRef, ElementRef, EnvironmentInjector, inject, @@ -35,14 +36,16 @@ import { TutorialNavigationItem, } from '@angular/docs'; import {ActivatedRoute, RouterLink} from '@angular/router'; +import {from} from 'rxjs'; import {filter} from 'rxjs/operators'; + import {PagePrefix} from '../../core/enums/pages'; -import {injectAsync} from '../../core/services/inject-async'; import { EmbeddedTutorialManager, LoadingStep, NodeRuntimeState, EmbeddedEditor, + injectNodeRuntimeSandbox, } from '../../editor/index'; import {SplitResizerHandler} from './split-resizer-handler.service'; @@ -68,7 +71,7 @@ const INTRODUCTION_LABEL = 'Introduction'; changeDetection: ChangeDetectionStrategy.OnPush, providers: [SplitResizerHandler], }) -export default class Tutorial implements AfterViewInit { +export default class Tutorial { @ViewChild('content') content!: ElementRef; @ViewChild('editor') editor: ElementRef | undefined; @ViewChild('resizer') resizer!: ElementRef; @@ -80,9 +83,9 @@ export default class Tutorial implements AfterViewInit { private readonly elementRef = inject(ElementRef); private readonly embeddedTutorialManager = inject(EmbeddedTutorialManager); private readonly nodeRuntimeState = inject(NodeRuntimeState); - private readonly platformId = inject(PLATFORM_ID); private readonly route = inject(ActivatedRoute); private readonly splitResizerHandler = inject(SplitResizerHandler); + private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); readonly documentContent = signal(null); readonly localTutorialZipUrl = signal(undefined); @@ -118,17 +121,18 @@ export default class Tutorial implements AfterViewInit { this.documentContent.set(docContent); this.setTutorialData(data as TutorialNavigationItem); }); - } - async ngAfterViewInit(): Promise { - if (isPlatformBrowser(this.platformId)) { + const destroyRef = inject(DestroyRef); + afterNextRender(() => { this.splitResizerHandler.init(this.elementRef, this.content, this.resizer, this.editor); - this.loadEmbeddedEditorComponent().then((editorComponent) => { - this.embeddedEditorComponent = editorComponent; - this.changeDetectorRef.markForCheck(); - }); - } + from(this.loadEmbeddedEditorComponent()) + .pipe(takeUntilDestroyed(destroyRef)) + .subscribe((editorComponent) => { + this.embeddedEditorComponent = editorComponent; + this.changeDetectorRef.markForCheck(); + }); + }); } toggleNavigationDropdown($event: MouseEvent): void { @@ -147,9 +151,7 @@ export default class Tutorial implements AfterViewInit { this.embeddedTutorialManager.revealAnswer(); - const nodeRuntimeSandbox = await injectAsync(this.environmentInjector, () => - import('../../editor/index').then((s) => s.NodeRuntimeSandbox), - ); + const nodeRuntimeSandbox = await injectNodeRuntimeSandbox(this.environmentInjector); await Promise.all( Object.entries(this.embeddedTutorialManager.answerFiles()).map(([path, contents]) => @@ -165,9 +167,7 @@ export default class Tutorial implements AfterViewInit { this.embeddedTutorialManager.resetRevealAnswer(); - const nodeRuntimeSandbox = await injectAsync(this.environmentInjector, () => - import('../../editor/index').then((s) => s.NodeRuntimeSandbox), - ); + const nodeRuntimeSandbox = await injectNodeRuntimeSandbox(this.environmentInjector); await Promise.all( Object.entries(this.embeddedTutorialManager.tutorialFiles()).map(([path, contents]) => @@ -191,7 +191,7 @@ export default class Tutorial implements AfterViewInit { if (routeData.type === TutorialType.LOCAL) { this.setLocalTutorialData(routeData); - } else if (routeData.type === TutorialType.EDITOR && isPlatformBrowser(this.platformId)) { + } else if (routeData.type === TutorialType.EDITOR && this.isBrowser) { await this.setEditorTutorialData( tutorialNavigationItem.path.replace(`${PagePrefix.TUTORIALS}/`, ''), ); @@ -254,9 +254,7 @@ export default class Tutorial implements AfterViewInit { } private async loadEmbeddedEditor() { - const nodeRuntimeSandbox = await injectAsync(this.environmentInjector, () => - import('../../editor/index').then((s) => s.NodeRuntimeSandbox), - ); + const nodeRuntimeSandbox = await injectNodeRuntimeSandbox(this.environmentInjector); this.canRevealAnswer = computed(() => this.nodeRuntimeState.loadingStep() > LoadingStep.BOOT); diff --git a/adev/src/app/sub-navigation-data.ts b/adev/src/app/sub-navigation-data.ts index dcaa29f1f761..ca6e8873af61 100644 --- a/adev/src/app/sub-navigation-data.ts +++ b/adev/src/app/sub-navigation-data.ts @@ -12,6 +12,8 @@ import {NavigationItem} from '@angular/docs'; import FIRST_APP_TUTORIAL_NAV_DATA from '../../src/assets/tutorials/first-app/routes.json'; import LEARN_ANGULAR_TUTORIAL_NAV_DATA from '../../src/assets/tutorials/learn-angular/routes.json'; import DEFERRABLE_VIEWS_TUTORIAL_NAV_DATA from '../../src/assets/tutorials/deferrable-views/routes.json'; +import ERRORS_NAV_DATA from '../../src/assets/content/reference/errors/routes.json'; +import EXT_DIAGNOSTICS_NAV_DATA from '../../src/assets/content/reference/extended-diagnostics/routes.json'; import {DefaultPage} from './core/enums/pages'; import {getApiNavigationItems} from './features/references/helpers/manifest.helper'; @@ -499,6 +501,26 @@ const DOCS_SUB_NAVIGATION_DATA: NavigationItem[] = [ path: 'guide/testing/utility-apis', contentPath: 'guide/testing/utility-apis', }, + { + label: 'Component harnesses overview', + path: 'guide/testing/component-harnesses-overview', + contentPath: 'guide/testing/component-harnesses-overview', + }, + { + label: 'Using component harnesses in tests', + path: 'guide/testing/using-component-harnesses', + contentPath: 'guide/testing/using-component-harnesses', + }, + { + label: 'Creating harnesses for your components', + path: 'guide/testing/creating-component-harnesses', + contentPath: 'guide/testing/creating-component-harnesses', + }, + { + label: 'Adding harness support for additional testing environments', + path: 'guide/testing/component-harnesses-testing-environments', + contentPath: 'guide/testing/component-harnesses-testing-environments', + }, ], }, { @@ -837,6 +859,11 @@ const DOCS_SUB_NAVIGATION_DATA: NavigationItem[] = [ path: 'ecosystem/web-workers', contentPath: 'ecosystem/web-workers', }, + { + label: 'Custom build pipeline', + path: 'ecosystem/custom-build-pipeline', + contentPath: 'ecosystem/custom-build-pipeline', + }, { label: 'Angular Fire', path: 'https://github.com/angular/angularfire#readme', @@ -1110,206 +1137,7 @@ const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [ path: 'errors', contentPath: 'reference/errors/overview', }, - { - label: 'NG0100: Expression Changed After Checked', - path: 'errors/NG0100', - contentPath: 'reference/errors/NG0100', - }, - { - label: 'NG01101: Wrong Async Validator Return Type', - path: 'errors/NG01101', - contentPath: 'reference/errors/NG01101', - }, - { - label: 'NG01203: Missing value accessor', - path: 'errors/NG01203', - contentPath: 'reference/errors/NG01203', - }, - { - label: 'NG0200: Circular Dependency in DI', - path: 'errors/NG0200', - contentPath: 'reference/errors/NG0200', - }, - { - label: 'NG0201: No Provider Found', - path: 'errors/NG0201', - contentPath: 'reference/errors/NG0201', - }, - { - label: 'NG0203: `inject()` must be called from an injection context', - path: 'errors/NG0203', - contentPath: 'reference/errors/NG0203', - }, - { - label: 'NG0209: Invalid multi provider', - path: 'errors/NG0209', - contentPath: 'reference/errors/NG0209', - }, - { - label: 'NG02200: Missing Iterable Differ', - path: 'errors/NG02200', - contentPath: 'reference/errors/NG02200', - }, - { - label: 'NG02800: JSONP support in HttpClient configuration', - path: 'errors/NG02800', - contentPath: 'reference/errors/NG02800', - }, - { - label: 'NG0300: Selector Collision', - path: 'errors/NG0300', - contentPath: 'reference/errors/NG0300', - }, - { - label: 'NG0301: Export Not Found', - path: 'errors/NG0301', - contentPath: 'reference/errors/NG0301', - }, - { - label: 'NG0302: Pipe Not Found', - path: 'errors/NG0302', - contentPath: 'reference/errors/NG0302', - }, - { - label: `NG0403: Bootstrapped NgModule doesn't specify which component to initialize`, - path: 'errors/NG0403', - contentPath: 'reference/errors/NG0403', - }, - { - label: 'NG0500: Hydration Node Mismatch', - path: 'errors/NG0500', - contentPath: 'reference/errors/NG0500', - }, - { - label: 'NG0501: Hydration Missing Siblings', - path: 'errors/NG0501', - contentPath: 'reference/errors/NG0501', - }, - { - label: 'NG0502: Hydration Missing Node', - path: 'errors/NG0502', - contentPath: 'reference/errors/NG0502', - }, - { - label: 'NG0503: Hydration Unsupported Projection of DOM Nodes', - path: 'errors/NG0503', - contentPath: 'reference/errors/NG0503', - }, - { - label: 'NG0504: Skip hydration flag is applied to an invalid node', - path: 'errors/NG0504', - contentPath: 'reference/errors/NG0504', - }, - { - label: 'NG0505: No hydration info in server response', - path: 'errors/NG0505', - contentPath: 'reference/errors/NG0505', - }, - { - label: 'NG0506: NgZone remains unstable', - path: 'errors/NG0506', - contentPath: 'reference/errors/NG0506', - }, - { - label: 'NG0507: HTML content was altered after server-side rendering', - path: 'errors/NG0507', - contentPath: 'reference/errors/NG0507', - }, - { - label: 'NG0602: Disallowed function call inside reactive context', - path: 'errors/NG0602', - contentPath: 'reference/errors/NG0602', - }, - { - label: 'NG05104: Root element was not found', - path: 'errors/NG05104', - contentPath: 'reference/errors/NG05104', - }, - { - label: 'NG0910: Unsafe bindings on an iframe element', - path: 'errors/NG0910', - contentPath: 'reference/errors/NG0910', - }, - { - label: 'NG0912: Component ID generation collision', - path: 'errors/NG0912', - contentPath: 'reference/errors/NG0912', - }, - { - label: 'NG0913: Runtime Performance Warnings', - path: 'errors/NG0913', - contentPath: 'reference/errors/NG0913', - }, - { - label: 'NG0950: Required input is accessed before a value is set.', - path: 'errors/NG0950', - contentPath: 'reference/errors/NG0950', - }, - { - label: 'NG0951: Child query result is required but no value is available.', - path: 'errors/NG0951', - contentPath: 'reference/errors/NG0951', - }, - { - label: 'NG0955: Track expression resulted in duplicated keys for a given collection', - path: 'errors/NG0955', - contentPath: 'reference/errors/NG0955', - }, - { - label: 'NG0956: Tracking expression caused re-creation of the DOM structure', - path: 'errors/NG0956', - contentPath: 'reference/errors/NG0956', - }, - { - label: 'NG1001: Argument Not Literal', - path: 'errors/NG1001', - contentPath: 'reference/errors/NG1001', - }, - { - label: 'NG2003: Missing Token', - path: 'errors/NG2003', - contentPath: 'reference/errors/NG2003', - }, - { - label: 'NG2009: Invalid Shadow DOM selector', - path: 'errors/NG2009', - contentPath: 'reference/errors/NG2009', - }, - { - label: 'NG3003: Import Cycle Detected', - path: 'errors/NG3003', - contentPath: 'reference/errors/NG3003', - }, - { - label: 'NG05000: Hydration with unsupported Zone.js instance.', - path: 'errors/NG05000', - contentPath: 'reference/errors/NG05000', - }, - { - label: 'NG0750: @defer dependencies failed to load', - path: 'errors/NG0750', - contentPath: 'reference/errors/NG0750', - }, - { - label: 'NG6100: NgModule.id Set to module.id anti-pattern', - path: 'errors/NG6100', - contentPath: 'reference/errors/NG6100', - }, - { - label: 'NG8001: Invalid Element', - path: 'errors/NG8001', - contentPath: 'reference/errors/NG8001', - }, - { - label: 'NG8002: Invalid Attribute', - path: 'errors/NG8002', - contentPath: 'reference/errors/NG8002', - }, - { - label: 'NG8003: Missing Reference Target', - path: 'errors/NG8003', - contentPath: 'reference/errors/NG8003', - }, + ...ERRORS_NAV_DATA, ], }, { @@ -1320,61 +1148,7 @@ const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [ path: 'extended-diagnostics', contentPath: 'reference/extended-diagnostics/overview', }, - { - label: 'NG8101: Invalid Banana-in-Box', - path: 'extended-diagnostics/NG8101', - contentPath: 'reference/extended-diagnostics/NG8101', - }, - { - label: 'NG8102: Nullish coalescing not nullable', - path: 'extended-diagnostics/NG8102', - contentPath: 'reference/extended-diagnostics/NG8102', - }, - { - label: 'NG8103: Missing control flow directive', - path: 'extended-diagnostics/NG8103', - contentPath: 'reference/extended-diagnostics/NG8103', - }, - { - label: 'NG8104: Text attribute not binding', - path: 'extended-diagnostics/NG8104', - contentPath: 'reference/extended-diagnostics/NG8104', - }, - { - label: 'NG8105: Missing `let` keyword in an *ngFor expression', - path: 'extended-diagnostics/NG8105', - contentPath: 'reference/extended-diagnostics/NG8105', - }, - { - label: 'NG8106: Suffix not supported', - path: 'extended-diagnostics/NG8106', - contentPath: 'reference/extended-diagnostics/NG8106', - }, - { - label: 'NG8107: Optional chain not nullable', - path: 'extended-diagnostics/NG8107', - contentPath: 'reference/extended-diagnostics/NG8107', - }, - { - label: 'NG8108: ngSkipHydration should be a static attribute', - path: 'extended-diagnostics/NG8108', - contentPath: 'reference/extended-diagnostics/NG8108', - }, - { - label: 'NG8109: Signals must be invoked in template interpolations', - path: 'extended-diagnostics/NG8109', - contentPath: 'reference/extended-diagnostics/NG8109', - }, - { - label: 'NG8111: Functions must be invoked in event bindings', - path: 'extended-diagnostics/NG8111', - contentPath: 'reference/extended-diagnostics/NG8111', - }, - { - label: 'NG8113: Unused Standalone Imports', - path: 'extended-diagnostics/NG8113', - contentPath: 'reference/extended-diagnostics/NG8113', - }, + ...EXT_DIAGNOSTICS_NAV_DATA, ], }, { @@ -1459,6 +1233,16 @@ const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [ path: 'reference/migrations/signal-queries', contentPath: 'reference/migrations/signal-queries', }, + { + label: 'Clean up unused imports', + path: 'reference/migrations/cleanup-unused-imports', + contentPath: 'reference/migrations/cleanup-unused-imports', + }, + { + label: 'Self-closing tags', + path: 'reference/migrations/self-closing-tags', + contentPath: 'reference/migrations/self-closing-tags', + }, ], }, ]; diff --git a/adev/src/assets/BUILD.bazel b/adev/src/assets/BUILD.bazel index 99599093c287..9b64479b2659 100644 --- a/adev/src/assets/BUILD.bazel +++ b/adev/src/assets/BUILD.bazel @@ -32,7 +32,9 @@ copy_to_directory( "//adev/src/content/reference/concepts", "//adev/src/content/reference/configs", "//adev/src/content/reference/errors", + "//adev/src/content/reference/errors:route-nav-items", "//adev/src/content/reference/extended-diagnostics", + "//adev/src/content/reference/extended-diagnostics:route-nav-items", "//adev/src/content/reference/migrations", "//adev/src/content/tools", "//adev/src/content/tools/cli", diff --git a/adev/src/assets/textures/BUILD.bazel b/adev/src/assets/textures/BUILD.bazel deleted file mode 100644 index 1b3bdd019281..000000000000 --- a/adev/src/assets/textures/BUILD.bazel +++ /dev/null @@ -1,13 +0,0 @@ -load("@build_bazel_rules_nodejs//:index.bzl", "copy_to_bin") - -exports_files( - glob(["*"]), -) - -copy_to_bin( - name = "textures", - srcs = glob(["*"]), - visibility = [ - "//visibility:public", - ], -) diff --git a/adev/src/assets/textures/build-for-everyone.svg b/adev/src/assets/textures/build-for-everyone.svg deleted file mode 100644 index f2e4213355f7..000000000000 --- a/adev/src/assets/textures/build-for-everyone.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/adev/src/assets/textures/build-msdf.png b/adev/src/assets/textures/build-msdf.png deleted file mode 100644 index 0cebbf8b5937..000000000000 Binary files a/adev/src/assets/textures/build-msdf.png and /dev/null differ diff --git a/adev/src/assets/textures/build-render.png b/adev/src/assets/textures/build-render.png deleted file mode 100644 index 96a799fe8f72..000000000000 Binary files a/adev/src/assets/textures/build-render.png and /dev/null differ diff --git a/adev/src/assets/textures/gradient.jpg b/adev/src/assets/textures/gradient.jpg deleted file mode 100644 index 38ea1297269e..000000000000 Binary files a/adev/src/assets/textures/gradient.jpg and /dev/null differ diff --git a/adev/src/assets/textures/line-msdf.png b/adev/src/assets/textures/line-msdf.png deleted file mode 100644 index 1cb3e33cf8cf..000000000000 Binary files a/adev/src/assets/textures/line-msdf.png and /dev/null differ diff --git a/adev/src/assets/textures/line-render.png b/adev/src/assets/textures/line-render.png deleted file mode 100644 index 78e110030014..000000000000 Binary files a/adev/src/assets/textures/line-render.png and /dev/null differ diff --git a/adev/src/assets/textures/line.svg b/adev/src/assets/textures/line.svg deleted file mode 100644 index 81aa69de69aa..000000000000 --- a/adev/src/assets/textures/line.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/adev/src/assets/textures/logo-1-msdf.png b/adev/src/assets/textures/logo-1-msdf.png deleted file mode 100644 index fc5ea556f355..000000000000 Binary files a/adev/src/assets/textures/logo-1-msdf.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-1-render.png b/adev/src/assets/textures/logo-1-render.png deleted file mode 100644 index 69e88ac78ff2..000000000000 Binary files a/adev/src/assets/textures/logo-1-render.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-2-msdf.png b/adev/src/assets/textures/logo-2-msdf.png deleted file mode 100644 index 7b8c190f5d01..000000000000 Binary files a/adev/src/assets/textures/logo-2-msdf.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-2-render.png b/adev/src/assets/textures/logo-2-render.png deleted file mode 100644 index c905529a5bf3..000000000000 Binary files a/adev/src/assets/textures/logo-2-render.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-3-msdf.png b/adev/src/assets/textures/logo-3-msdf.png deleted file mode 100644 index 146492432e1e..000000000000 Binary files a/adev/src/assets/textures/logo-3-msdf.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-3-render.png b/adev/src/assets/textures/logo-3-render.png deleted file mode 100644 index 3fbb04d05165..000000000000 Binary files a/adev/src/assets/textures/logo-3-render.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-4-msdf.png b/adev/src/assets/textures/logo-4-msdf.png deleted file mode 100644 index f04335d74f99..000000000000 Binary files a/adev/src/assets/textures/logo-4-msdf.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-4-render.png b/adev/src/assets/textures/logo-4-render.png deleted file mode 100644 index b4fbf2d937b2..000000000000 Binary files a/adev/src/assets/textures/logo-4-render.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-5-msdf.png b/adev/src/assets/textures/logo-5-msdf.png deleted file mode 100644 index 96f16e4ec1c0..000000000000 Binary files a/adev/src/assets/textures/logo-5-msdf.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-5-render.png b/adev/src/assets/textures/logo-5-render.png deleted file mode 100644 index 5b42af6fa4c4..000000000000 Binary files a/adev/src/assets/textures/logo-5-render.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-6-msdf.png b/adev/src/assets/textures/logo-6-msdf.png deleted file mode 100644 index d93941e08424..000000000000 Binary files a/adev/src/assets/textures/logo-6-msdf.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-6-render.png b/adev/src/assets/textures/logo-6-render.png deleted file mode 100644 index 4ff91787f546..000000000000 Binary files a/adev/src/assets/textures/logo-6-render.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-7-msdf.png b/adev/src/assets/textures/logo-7-msdf.png deleted file mode 100644 index ef3f2b6a6d62..000000000000 Binary files a/adev/src/assets/textures/logo-7-msdf.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-7-render.png b/adev/src/assets/textures/logo-7-render.png deleted file mode 100644 index c02dfcdda751..000000000000 Binary files a/adev/src/assets/textures/logo-7-render.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-8-msdf.png b/adev/src/assets/textures/logo-8-msdf.png deleted file mode 100644 index cc3254460782..000000000000 Binary files a/adev/src/assets/textures/logo-8-msdf.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-8-render.png b/adev/src/assets/textures/logo-8-render.png deleted file mode 100644 index 3ee06d72cace..000000000000 Binary files a/adev/src/assets/textures/logo-8-render.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-9-msdf.png b/adev/src/assets/textures/logo-9-msdf.png deleted file mode 100644 index 473b3f6bf6d7..000000000000 Binary files a/adev/src/assets/textures/logo-9-msdf.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-9-render.png b/adev/src/assets/textures/logo-9-render.png deleted file mode 100644 index 434cbebf630f..000000000000 Binary files a/adev/src/assets/textures/logo-9-render.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-lockup-msdf.png b/adev/src/assets/textures/logo-lockup-msdf.png deleted file mode 100644 index 30ee184d16bc..000000000000 Binary files a/adev/src/assets/textures/logo-lockup-msdf.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-lockup-render.png b/adev/src/assets/textures/logo-lockup-render.png deleted file mode 100644 index 170d23b8b659..000000000000 Binary files a/adev/src/assets/textures/logo-lockup-render.png and /dev/null differ diff --git a/adev/src/assets/textures/logo-lockup.svg b/adev/src/assets/textures/logo-lockup.svg deleted file mode 100644 index 654d44698fda..000000000000 --- a/adev/src/assets/textures/logo-lockup.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/adev/src/content/best-practices/runtime-performance/zone-pollution.md b/adev/src/content/best-practices/runtime-performance/zone-pollution.md index 8c0adf32a844..bf8ceb13d32e 100644 --- a/adev/src/content/best-practices/runtime-performance/zone-pollution.md +++ b/adev/src/content/best-practices/runtime-performance/zone-pollution.md @@ -35,7 +35,7 @@ class AppComponent implements OnInit { The preceding snippet instructs Angular to call `setInterval` outside the Angular Zone and skip running change detection after `pollForUpdates` runs. -Third-party libraries commonly trigger unnecessary change detection cycles when their APIs are invoked within the Angular zone. This phenomenon particularly affects libraries that setup event listeners or initiate other tasks (such as timers, XHR requests, etc.). Avoid these extra cycles by calling library APIs outside the Angular zone: +Third-party libraries commonly trigger unnecessary change detection cycles when their APIs are invoked within the Angular zone. This phenomenon particularly affects libraries that set up event listeners or initiate other tasks (such as timers, XHR requests, etc.). Avoid these extra cycles by calling library APIs outside the Angular zone: import { Component, NgZone, OnInit } from '@angular/core'; diff --git a/adev/src/content/cli/help/build-info.json b/adev/src/content/cli/help/build-info.json index 51ca1f2b7903..40937d6a6db6 100644 --- a/adev/src/content/cli/help/build-info.json +++ b/adev/src/content/cli/help/build-info.json @@ -1,4 +1,4 @@ { "branchName": "refs/heads/main", - "sha": "535acd73cae44750e5618de545a94ce2b2cd22b9" + "sha": "4e45bc8fc2704830d6e4099f2455d0135278b002" } \ No newline at end of file diff --git a/adev/src/content/cli/help/generate.json b/adev/src/content/cli/help/generate.json index afcd227fa3dd..127c04a74d7f 100644 --- a/adev/src/content/cli/help/generate.json +++ b/adev/src/content/cli/help/generate.json @@ -50,18 +50,18 @@ { "name": "app-shell", "command": "app-shell", - "shortDescription": "Generates an application shell for running a server-side version of an app.", + "shortDescription": "Configures your project to generate an app-shell during build time.", "options": [ { "name": "project", "type": "string", - "description": "The name of the related client app." + "description": "The name of the project where the app-shell should be generated." }, { "name": "server-routing", "type": "boolean", "default": false, - "description": "Creates a server application using the Server Routing API (Developer Preview)." + "description": "Set up a server application using the Server Routing and App Engine APIs (Developer Preview)." } ], "aliases": [], @@ -70,13 +70,13 @@ { "name": "application", "command": "application [name]", - "shortDescription": "Generates a new basic application definition in the \"projects\" subfolder of the workspace.", + "shortDescription": "Generates a new Angular application within your workspace. This schematic sets up the foundational structure of your project, including the root component, module, and configuration files. You can customize various aspects of the application, such as routing, styling, and testing.", "options": [ { "name": "experimental-zoneless", "type": "boolean", "default": false, - "description": "Create an application that does not utilize zone.js." + "description": "Generate an application that does not use `zone.js`." }, { "name": "inline-style", @@ -84,7 +84,7 @@ "aliases": [ "s" ], - "description": "Include styles inline in the root component.ts file. Only CSS styles can be included inline. Default is false, meaning that an external styles file is created and referenced in the root component.ts file." + "description": "Include the styles for the root component directly within the `app.component.ts` file. Only CSS styles can be included inline. By default, a separate stylesheet file (e.g., `app.component.css`) is created." }, { "name": "inline-template", @@ -92,18 +92,18 @@ "aliases": [ "t" ], - "description": "Include template inline in the root component.ts file. Default is false, meaning that an external template file is created and referenced in the root component.ts file. " + "description": "Include the HTML template for the root component directly within the `app.component.ts` file. By default, a separate template file (e.g., `app.component.html`) is created." }, { "name": "minimal", "type": "boolean", "default": false, - "description": "Create a bare-bones project without any testing frameworks. (Use for learning purposes only.)" + "description": "Generate a minimal project without any testing frameworks. This is intended for learning purposes and simple experimentation, not for production applications." }, { "name": "name", "type": "string", - "description": "The name of the new application.", + "description": "The name for the new application. This name will be used for the project directory and various identifiers throughout the application's code.", "positional": 0 }, { @@ -113,35 +113,35 @@ "p" ], "default": "app", - "description": "A prefix to apply to generated selectors." + "description": "A prefix to be added to the selectors of components generated within this application. For example, if the prefix is `my-app` and you generate a component named `my-component`, the selector will be `my-app-my-component`." }, { "name": "project-root", "type": "string", - "description": "The root directory of the new application." + "description": "The directory where the new application's files will be created, relative to the workspace root. If not specified, the application will be created in a subfolder within the `projects` directory, using the application's name." }, { "name": "routing", "type": "boolean", "default": true, - "description": "Creates an application with routing enabled." + "description": "Generate an application with routing already configured. This sets up the necessary files and modules for managing navigation between different views in your application." }, { "name": "server-routing", "type": "boolean", - "description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview)." + "description": "Set up a server application using the Server Routing and App Engine APIs (Developer Preview)." }, { "name": "skip-install", "type": "boolean", "default": false, - "description": "Skip installing dependency packages." + "description": "Skip the automatic installation of packages. You will need to manually install the dependencies later." }, { "name": "skip-package-json", "type": "boolean", "default": false, - "description": "Do not add dependencies to the \"package.json\" file." + "description": "Do not add dependencies to the `package.json` file." }, { "name": "skip-tests", @@ -150,25 +150,25 @@ "S" ], "default": false, - "description": "Do not create \"spec.ts\" test files for the application." + "description": "Skip the generation of a unit test files `spec.ts`." }, { "name": "ssr", "type": "boolean", "default": false, - "description": "Creates an application with Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering) enabled." + "description": "Configure the application for Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering)." }, { "name": "standalone", "type": "boolean", "default": true, - "description": "Creates an application based upon the standalone API, without NgModules." + "description": "Create an application that utilizes the standalone API, eliminating the need for NgModules. This can simplify the structure of your application." }, { "name": "strict", "type": "boolean", "default": true, - "description": "Creates an application with stricter bundle budgets settings." + "description": "Enable stricter bundle budget settings for the application. This helps to keep your application's bundle size small and improve performance. For more information, see https://angular.dev/tools/cli/template-typecheck#strict-mode" }, { "name": "style", @@ -180,7 +180,7 @@ "sass", "less" ], - "description": "The file extension or preprocessor to use for style files." + "description": "The type of stylesheet files to be created for components in the application." }, { "name": "view-encapsulation", @@ -190,7 +190,7 @@ "None", "ShadowDom" ], - "description": "The view encapsulation strategy to use in the new application." + "description": "Sets the view encapsulation mode for the application's components. This determines how component styles are scoped and applied." } ], "aliases": [ @@ -201,29 +201,29 @@ { "name": "class", "command": "class [name]", - "shortDescription": "Creates a new, generic class definition in the given project.", + "shortDescription": "Creates a new class in your project. Classes are the fundamental building blocks for object-oriented programming in TypeScript. They provide a blueprint for creating objects with properties and methods. This schematic helps you generate a new class with the basic structure and optional test files.", "options": [ { "name": "name", "type": "string", - "description": "The name of the new class.", + "description": "The name for the new class. This will be used to create the class file (e.g., `my-class.ts`) and, if enabled, the corresponding test file `my-class.spec.ts`.", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the class should be added. If not specified, the CLI will determine the project from the current directory." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new class." + "description": "Skip the generation of a unit test file `spec.ts` for the new class." }, { "name": "type", "type": "string", - "description": "Adds a developer-defined type to the filename, in the format \"name.type.ts\"." + "description": "Adds a custom type to the filename, allowing you to create more descriptive class names. For example, if you set the type to `helper`, the filename will be `my-class.helper.ts`." } ], "aliases": [ @@ -234,7 +234,7 @@ { "name": "component", "command": "component [name]", - "shortDescription": "Creates a new, generic component definition in the given project.", + "shortDescription": "Creates a new Angular component. Components are the basic building blocks of Angular applications. Each component consists of a TypeScript class, an HTML template, and an optional CSS stylesheet. Use this schematic to generate a new component in your project.", "options": [ { "name": "change-detection", @@ -247,7 +247,7 @@ "Default", "OnPush" ], - "description": "The change detection strategy to use in the new component." + "description": "Configures the change detection strategy for the component." }, { "name": "display-block", @@ -256,25 +256,25 @@ "b" ], "default": false, - "description": "Specifies if the style will contain `:host { display: block; }`." + "description": "Adds `:host { display: block; }` to the component's stylesheet, ensuring the component renders as a block-level element. This is useful for layout purposes." }, { "name": "export", "type": "boolean", "default": false, - "description": "The declaring NgModule exports this component." + "description": "Automatically export the component from the specified NgModule, making it accessible to other modules in the application." }, { "name": "export-default", "type": "boolean", "default": false, - "description": "Use default export for the component instead of a named export." + "description": "Use a default export for the component in its TypeScript file instead of a named export." }, { "name": "flat", "type": "boolean", "default": false, - "description": "Create the new files at the top level of the current project." + "description": "Create the component files directly in the project's `src/app` directory instead of creating a new folder for them." }, { "name": "inline-style", @@ -283,7 +283,7 @@ "s" ], "default": false, - "description": "Include styles inline in the component.ts file. Only CSS styles can be included inline. By default, an external styles file is created and referenced in the component.ts file." + "description": "Include the component's styles directly in the `component.ts` file. By default, a separate stylesheet file (e.g., `my-component.component.css`) is created." }, { "name": "inline-template", @@ -292,7 +292,7 @@ "t" ], "default": false, - "description": "Include template inline in the component.ts file. By default, an external template file is created and referenced in the component.ts file." + "description": "Include the component's HTML template directly in the `component.ts` file. By default, a separate template file (e.g., `my-component.component.html`) is created." }, { "name": "module", @@ -300,12 +300,12 @@ "aliases": [ "m" ], - "description": "The declaring NgModule." + "description": "Specify the NgModule where the component should be declared. If not provided, the CLI will attempt to find the closest NgModule in the component's path." }, { "name": "name", "type": "string", - "description": "The name of the component.", + "description": "The name for the new component. This will be used to create the component's class, template, and stylesheet files. For example, if you provide `my-component`, the files will be named `my-component.component.ts`, `my-component.component.html`, and `my-component.component.css`.", "positional": 0 }, { @@ -314,41 +314,41 @@ "aliases": [ "p" ], - "description": "The prefix to apply to the generated component selector." + "description": "A prefix to be added to the component's selector. For example, if the prefix is `app` and the component name is `my-component`, the selector will be `app-my-component`." }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the component should be added. If not specified, the CLI will determine the project from the current directory." }, { "name": "selector", "type": "string", - "description": "The HTML selector to use for this component." + "description": "The HTML selector to use for this component. If not provided, a selector will be generated based on the component name (e.g., `app-my-component`)." }, { "name": "skip-import", "type": "boolean", "default": false, - "description": "Do not import this component into the owning NgModule." + "description": "Do not automatically import the new component into its closest NgModule." }, { "name": "skip-selector", "type": "boolean", "default": false, - "description": "Specifies if the component should have a selector or not." + "description": "Skip the generation of an HTML selector for the component." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new component." + "description": "Skip the generation of unit test files `spec.ts`." }, { "name": "standalone", "type": "boolean", "default": true, - "description": "Whether the generated component is standalone." + "description": "Generate a standalone component. Standalone components are self-contained and don't need to be declared in an NgModule. They can be used independently or imported directly into other standalone components." }, { "name": "style", @@ -361,13 +361,13 @@ "less", "none" ], - "description": "The file extension or preprocessor to use for style files, or 'none' to skip generating the style file." + "description": "Specify the type of stylesheet to be created for the component, or `none` to skip creating a stylesheet." }, { "name": "type", "type": "string", "default": "Component", - "description": "Adds a developer-defined type to the filename, in the format \"name.type.ts\"." + "description": "Append a custom type to the component's filename. For example, if you set the type to `container`, the file will be named `my-component.container.ts`." }, { "name": "view-encapsulation", @@ -380,7 +380,7 @@ "None", "ShadowDom" ], - "description": "The view encapsulation strategy to use in the new component." + "description": "Sets the view encapsulation mode for the component. This determines how the component's styles are scoped and applied." } ], "aliases": [ @@ -391,12 +391,12 @@ { "name": "config", "command": "config [type]", - "shortDescription": "Generates a configuration file in the given project.", + "shortDescription": "Generates configuration files for your project. These files control various aspects of your project's build process, testing, and browser compatibility. This schematic helps you create or update essential configuration files with ease.", "options": [ { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the configuration file should be created or updated." }, { "name": "type", @@ -405,7 +405,7 @@ "karma", "browserslist" ], - "description": "Specifies which type of configuration file to create.", + "description": "Specifies the type of configuration file to generate.", "positional": 0 } ], @@ -415,19 +415,19 @@ { "name": "directive", "command": "directive [name]", - "shortDescription": "Creates a new, generic directive definition in the given project.", + "shortDescription": "Creates a new directive in your project. Directives are used to extend the behavior or appearance of HTML elements and components. They allow you to manipulate the DOM, add custom attributes, and respond to events. This schematic generates the necessary files and boilerplate code for a new directive.", "options": [ { "name": "export", "type": "boolean", "default": false, - "description": "The declaring NgModule exports this directive." + "description": "Automatically export the directive from the specified NgModule, making it accessible to other modules in the application." }, { "name": "flat", "type": "boolean", "default": true, - "description": "When true (the default), creates the new files at the top level of the current project." + "description": "Creates the new directive files at the top level of the current project. If set to false, a new folder with the directive's name will be created to contain the files." }, { "name": "module", @@ -435,12 +435,12 @@ "aliases": [ "m" ], - "description": "The declaring NgModule." + "description": "Specify the NgModule where the directive should be declared. If not provided, the CLI will attempt to find the closest NgModule in the directive's path." }, { "name": "name", "type": "string", - "description": "The name of the new directive.", + "description": "The name for the new directive. This will be used to create the directive's class and spec files (e.g., `my-directive.directive.ts` and `my-directive.directive.spec.ts`).", "positional": 0 }, { @@ -449,35 +449,35 @@ "aliases": [ "p" ], - "description": "A prefix to apply to generated selectors." + "description": "A prefix to be added to the directive's selector. For example, if the prefix is `app` and the directive name is `highlight`, the selector will be `appHighlight`." }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the directive should be added. If not specified, the CLI will determine the project from the current directory." }, { "name": "selector", "type": "string", - "description": "The HTML selector to use for this directive." + "description": "The HTML selector to use for this directive. If not provided, a selector will be generated based on the directive's name (e.g., `appHighlight`)." }, { "name": "skip-import", "type": "boolean", "default": false, - "description": "Do not import this directive into the owning NgModule." + "description": "Do not automatically import the new directive into its closest NgModule." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new class." + "description": "Skip the generation of a unit test file `spec.ts` for the new directive." }, { "name": "standalone", "type": "boolean", "default": true, - "description": "Whether the generated directive is standalone." + "description": "Generate a standalone directive. Standalone directives are self-contained and don't need to be declared in an NgModule. They can be used independently or imported directly into other standalone components or directives." } ], "aliases": [ @@ -488,23 +488,23 @@ { "name": "enum", "command": "enum [name]", - "shortDescription": "Generates a new, generic enum definition in the given project.", + "shortDescription": "Creates a new enum in your project. Enums (enumerations) are a way to define a set of named constants, making your code more readable and maintainable. This schematic generates a new enum with the specified name and type.", "options": [ { "name": "name", "type": "string", - "description": "The name of the enum.", + "description": "The name for the new enum. This will be used to create the enum file (e.g., `my-enum.enum.ts`).", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project in which to create the enum. Default is the configured default project for the workspace." + "description": "The name of the project where the enum should be created. If not specified, the CLI will determine the project from the current directory." }, { "name": "type", "type": "string", - "description": "Adds a developer-defined type to the filename, in the format \"name.type.ts\"." + "description": "Adds a custom type to the filename, allowing you to create more descriptive enum names. For example, if you set the type to `status`, the filename will be `my-enum.status.ts`." } ], "aliases": [ @@ -515,12 +515,12 @@ { "name": "environments", "command": "environments", - "shortDescription": "Generates and configures environment files for a project.", + "shortDescription": "Generates and configures environment files for your project. Environment files allow you to define different settings and configurations for various environments, such as development, testing, and production. This schematic helps you create and manage these files, making it easier to customize your application's behavior for each environment.", "options": [ { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the environment files should be created or updated." } ], "aliases": [], @@ -529,19 +529,19 @@ { "name": "guard", "command": "guard [name]", - "shortDescription": "Generates a new, generic route guard definition in the given project.", + "shortDescription": "Creates a new route guard in your project. Route guards are used to control access to parts of your application by checking certain conditions before a route is activated. This schematic generates a new guard with the specified name, type, and options.", "options": [ { "name": "flat", "type": "boolean", "default": true, - "description": "When true (the default), creates the new files at the top level of the current project." + "description": "Creates the new guard files at the top level of the current project. If set to false, a new folder with the guard's name will be created to contain the files." }, { "name": "functional", "type": "boolean", "default": true, - "description": "Specifies whether to generate a guard as a function." + "description": "Generate the guard as a function instead of a class. Functional guards can be simpler for basic scenarios." }, { "name": "implements", @@ -549,24 +549,24 @@ "aliases": [ "guardType" ], - "description": "Specifies which type of guard to create." + "description": "Specifies the type(s) of guard to create. You can choose one or more of the following: `CanActivate` (controls access to a route), `CanActivateChild` (controls access to child routes), `CanDeactivate` (asks for confirmation before leaving a route), `CanMatch` (determines if a route can be matched)." }, { "name": "name", "type": "string", - "description": "The name of the new route guard.", + "description": "The name for the new route guard. This will be used to create the guard's class and spec files (e.g., `my-guard.guard.ts` and `my-guard.guard.spec.ts`).", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the guard should be created. If not specified, the CLI will determine the project from the current directory." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new guard." + "description": "Skip the generation of a unit test file `spec.ts` for the new guard." } ], "aliases": [ @@ -577,36 +577,36 @@ { "name": "interceptor", "command": "interceptor [name]", - "shortDescription": "Creates a new, generic interceptor definition in the given project.", + "shortDescription": "Creates a new interceptor in your project. Interceptors are used to intercept and modify HTTP requests and responses before they reach their destination. This allows you to perform tasks like adding authentication headers, handling errors, or logging requests. This schematic generates the necessary files and boilerplate code for a new interceptor.", "options": [ { "name": "flat", "type": "boolean", "default": true, - "description": "When true (the default), creates files at the top level of the project." + "description": "Creates the new interceptor files at the top level of the current project. If set to false, a new folder with the interceptor's name will be created to contain the files." }, { "name": "functional", "type": "boolean", "default": true, - "description": "Creates the interceptor as a `HttpInterceptorFn`." + "description": "Creates the interceptor as a function `HttpInterceptorFn` instead of a class. Functional interceptors can be simpler for basic scenarios." }, { "name": "name", "type": "string", - "description": "The name of the interceptor.", + "description": "The name for the new interceptor. This will be used to create the interceptor's class and spec files (e.g., `my-interceptor.interceptor.ts` and `my-interceptor.interceptor.spec.ts`).", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the interceptor should be created. If not specified, the CLI will determine the project from the current directory." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new interceptor." + "description": "Skip the generation of a unit test file `spec.ts` for the new interceptor." } ], "aliases": [], @@ -615,28 +615,28 @@ { "name": "interface", "command": "interface [name] [type]", - "shortDescription": "Creates a new, generic interface definition in the given project.", + "shortDescription": "Creates a new interface in your project. Interfaces define the structure of objects in TypeScript, ensuring type safety and code clarity. This schematic generates a new interface with the specified name and type.", "options": [ { "name": "name", "type": "string", - "description": "The name of the interface.", + "description": "The name for the new interface. This will be used to create the interface file (e.g., `my-interface.interface.ts`).", "positional": 0 }, { "name": "prefix", "type": "string", - "description": "A prefix to apply to generated selectors." + "description": "A prefix to be added to the interface name. This is typically not used for interfaces, as they don't have selectors like components or directives." }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the interface should be created. If not specified, the CLI will determine the project from the current directory." }, { "name": "type", "type": "string", - "description": "Adds a developer-defined type to the filename, in the format \"name.type.ts\".", + "description": "Adds a custom type to the filename, allowing you to create more descriptive interface names. For example, if you set the type to `data`, the filename will be `my-interface.data.ts`.", "positional": 1 } ], @@ -648,18 +648,18 @@ { "name": "library", "command": "library [name]", - "shortDescription": "Creates a new, generic library project in the current workspace.", + "shortDescription": "Creates a new library project in your Angular workspace. Libraries are reusable collections of components, services, and other Angular artifacts that can be shared across multiple applications. This schematic simplifies the process of generating a new library with the necessary files and configurations.", "options": [ { "name": "entry-file", "type": "string", "default": "public-api", - "description": "The path at which to create the library's public API file, relative to the workspace root." + "description": "The path to the library's public API file, relative to the workspace root. This file defines what parts of the library are accessible to applications that import it." }, { "name": "name", "type": "string", - "description": "The name of the library.", + "description": "The name for the new library. This name will be used for the project directory and various identifiers within the library's code.", "positional": 0 }, { @@ -669,36 +669,36 @@ "p" ], "default": "lib", - "description": "A prefix to apply to generated selectors." + "description": "A prefix to be added to the selectors of components generated within this library. For example, if the prefix is `my-lib` and you generate a component named `my-component`, the selector will be `my-lib-my-component`." }, { "name": "project-root", "type": "string", - "description": "The root directory of the new library." + "description": "The root directory for the new library, relative to the workspace root. If not specified, the library will be created in a subfolder within the `projects` directory, using the library's name." }, { "name": "skip-install", "type": "boolean", "default": false, - "description": "Do not install dependency packages." + "description": "Skip the automatic installation of packages. You will need to manually install the dependencies later." }, { "name": "skip-package-json", "type": "boolean", "default": false, - "description": "Do not add dependencies to the \"package.json\" file. " + "description": "Do not automatically add dependencies to the `package.json` file." }, { "name": "skip-ts-config", "type": "boolean", "default": false, - "description": "Do not update \"tsconfig.json\" to add a path mapping for the new library. The path mapping is needed to use the library in an app, but can be disabled here to simplify development." + "description": "Do not update the workspace `tsconfig.json` file to add a path mapping for the new library. The path mapping is needed to use the library in an application, but can be disabled here to simplify development." }, { "name": "standalone", "type": "boolean", "default": true, - "description": "Creates a library based upon the standalone API, without NgModules." + "description": "Create a library that utilizes the standalone API, eliminating the need for NgModules. This can simplify the structure of your library and its usage in applications." } ], "aliases": [ @@ -766,19 +766,19 @@ { "name": "pipe", "command": "pipe [name]", - "shortDescription": "Creates a new, generic pipe definition in the given project.", + "shortDescription": "Creates a new pipe in your project. Pipes are used to transform data for display in templates. They take input values and apply a specific transformation, such as formatting dates, currency, or filtering arrays. This schematic generates the necessary files and boilerplate code for a new pipe.", "options": [ { "name": "export", "type": "boolean", "default": false, - "description": "The declaring NgModule exports this pipe." + "description": "Automatically export the pipe from the specified NgModule, making it accessible to other modules in the application." }, { "name": "flat", "type": "boolean", "default": true, - "description": "When true (the default) creates files at the top level of the project." + "description": "Creates the new pipe files at the top level of the current project. If set to false, a new folder with the pipe's name will be created to contain the files." }, { "name": "module", @@ -786,36 +786,36 @@ "aliases": [ "m" ], - "description": "The declaring NgModule." + "description": "Specify the NgModule where the pipe should be declared. If not provided, the CLI will attempt to find the closest NgModule in the pipe's path." }, { "name": "name", "type": "string", - "description": "The name of the pipe.", + "description": "The name for the new pipe. This will be used to create the pipe's class and spec files (e.g., `my-pipe.pipe.ts` and `my-pipe.pipe.spec.ts`).", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the pipe should be created. If not specified, the CLI will determine the project from the current directory." }, { "name": "skip-import", "type": "boolean", "default": false, - "description": "Do not import this pipe into the owning NgModule." + "description": "Do not automatically import the new pipe into its closest NgModule." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new pipe." + "description": "Prevent the generation of a unit test file `spec.ts` for the new pipe." }, { "name": "standalone", "type": "boolean", "default": true, - "description": "Whether the generated pipe is standalone." + "description": "Generate a standalone pipe. Standalone pipes are self-contained and don't need to be declared in an NgModule. They can be used independently or imported directly into other standalone components, directives, or pipes." } ], "aliases": [ @@ -826,36 +826,36 @@ { "name": "resolver", "command": "resolver [name]", - "shortDescription": "Generates a new, generic resolver definition in the given project.", + "shortDescription": "Creates a new resolver in your project. Resolvers are used to pre-fetch data before a route is activated, ensuring that the necessary data is available before the component is displayed. This can improve the user experience by preventing delays and loading states. This schematic generates a new resolver with the specified name and options.", "options": [ { "name": "flat", "type": "boolean", "default": true, - "description": "When true (the default), creates the new files at the top level of the current project." + "description": "Creates the new resolver files at the top level of the current project. If set to false, a new folder with the resolver's name will be created to contain the files." }, { "name": "functional", "type": "boolean", "default": true, - "description": "Creates the resolver as a `ResolveFn`." + "description": "Creates the resolver as a function `ResolveFn` instead of a class. Functional resolvers can be simpler for basic scenarios." }, { "name": "name", "type": "string", - "description": "The name of the new resolver.", + "description": "The name for the new resolver. This will be used to create the resolver's class and spec files (e.g., `my-resolver.resolver.ts` and `my-resolver.resolver.spec.ts`).", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the resolver should be created. If not specified, the CLI will determine the project from the current directory." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new resolver." + "description": "Skip the generation of a unit test file `spec.ts` for the new resolver." } ], "aliases": [ @@ -866,30 +866,30 @@ { "name": "service", "command": "service [name]", - "shortDescription": "Creates a new, generic service definition in the given project.", + "shortDescription": "Creates a new service in your project. Services are used to encapsulate reusable logic, such as data access, API calls, or utility functions. This schematic simplifies the process of generating a new service with the necessary files and boilerplate code.", "options": [ { "name": "flat", "type": "boolean", "default": true, - "description": "When true (the default), creates files at the top level of the project." + "description": "Creates files at the top level of the project or the given path. If set to false, a new folder with the service's name will be created to contain the files." }, { "name": "name", "type": "string", - "description": "The name of the service.", + "description": "The name for the new service. This will be used to create the service's class and spec files (e.g., `my-service.service.ts` and `my-service.service.spec.ts`).", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the service should be added. If not specified, the CLI will determine the project from the current directory." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new service." + "description": "Skip the generation of a unit test file `spec.ts` for the service." } ], "aliases": [ @@ -900,18 +900,18 @@ { "name": "service-worker", "command": "service-worker", - "shortDescription": "Pass this schematic to the \"run\" command to create a service worker", + "shortDescription": "Adds a service worker to your project. Service workers enable your application to work offline or on low-quality networks by caching assets and intercepting network requests. This schematic configures your project to use a service worker.", "options": [ { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project to add the service worker to. If not specified, the CLI will determine the project from the current directory." }, { "name": "target", "type": "string", "default": "build", - "description": "The target to apply service worker to." + "description": "The build target to apply the service worker to. This is typically `build`, indicating that the service worker should be generated during the standard build process." } ], "aliases": [], @@ -920,24 +920,24 @@ { "name": "web-worker", "command": "web-worker [name]", - "shortDescription": "Creates a new, generic web worker definition in the given project.", + "shortDescription": "Creates a new web worker in your project. Web workers allow you to run JavaScript code in the background, improving the performance and responsiveness of your application by offloading computationally intensive tasks. This schematic generates the necessary files for a new web worker and provides an optional code snippet to demonstrate its usage.", "options": [ { "name": "name", "type": "string", - "description": "The name of the worker.", + "description": "The name for the new web worker. This will be used to create the worker file (e.g., `my-worker.worker.ts`).", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the web worker should be created. If not specified, the CLI will determine the project from the current directory." }, { "name": "snippet", "type": "boolean", "default": true, - "description": "Add a worker creation snippet in a sibling file of the same name." + "description": "Generate a code snippet that demonstrates how to create and use the new web worker." } ], "aliases": [], diff --git a/adev/src/content/cli/help/new.json b/adev/src/content/cli/help/new.json index 1f51828be7c4..6a856a2289e3 100644 --- a/adev/src/content/cli/help/new.json +++ b/adev/src/content/cli/help/new.json @@ -21,13 +21,13 @@ "name": "commit", "type": "boolean", "default": true, - "description": "Initial git repository commit information." + "description": "Configure the initial Git commit for the new repository." }, { "name": "create-application", "type": "boolean", "default": true, - "description": "Create a new initial application project in the 'src' folder of the new workspace. When false, creates an empty workspace with no initial application. You can then use the generate application command so that all applications are created in the projects folder." + "description": "Create a new initial application project in the new workspace. When false, creates an empty workspace with no initial application. You can then use the `ng generate application` command to create applications in the `projects` directory." }, { "name": "defaults", @@ -38,7 +38,7 @@ { "name": "directory", "type": "string", - "description": "The directory name to create the workspace in." + "description": "The directory where the new workspace and project should be created. If not specified, the workspace will be created in the current directory." }, { "name": "dry-run", @@ -53,7 +53,7 @@ "name": "experimental-zoneless", "type": "boolean", "default": false, - "description": "Create an application that does not utilize zone.js." + "description": "Create an initial application that does not utilize `zone.js`." }, { "name": "force", @@ -72,7 +72,7 @@ "aliases": [ "s" ], - "description": "Include styles inline in the component TS file. By default, an external styles file is created and referenced in the component TypeScript file." + "description": "Include the styles for the initial application's root component directly within the `app.component.ts` file. By default, a separate stylesheet file (e.g., `app.component.css`) is created." }, { "name": "inline-template", @@ -80,7 +80,7 @@ "aliases": [ "t" ], - "description": "Include template inline in the component TS file. By default, an external template file is created and referenced in the component TypeScript file." + "description": "Include the HTML template for the initial application's root component directly within the `app.component.ts` file. By default, a separate template file (e.g., `app.component.html`) is created." }, { "name": "interactive", @@ -92,19 +92,19 @@ "name": "minimal", "type": "boolean", "default": false, - "description": "Create a workspace without any testing frameworks. (Use for learning purposes only.)" + "description": "Generate a minimal Angular workspace without any testing frameworks. This is intended for learning purposes and simple experimentation, not for production applications." }, { "name": "name", "type": "string", - "description": "The name of the new workspace and initial project.", + "description": "The name for the new workspace and the initial project. This name will be used for the root directory and various identifiers throughout the project.", "positional": 0 }, { "name": "new-project-root", "type": "string", "default": "projects", - "description": "The path where new projects will be created, relative to the new workspace root." + "description": "The path where new projects will be created within the workspace, relative to the workspace root. By default, new projects are created in the `projects` directory." }, { "name": "package-manager", @@ -125,17 +125,17 @@ "p" ], "default": "app", - "description": "The prefix to apply to generated selectors for the initial project." + "description": "The prefix to apply to generated selectors for the initial project. For example, if the prefix is `my-app` and you generate a component named `my-component`, the selector will be `my-app-my-component`." }, { "name": "routing", "type": "boolean", - "description": "Enable routing in the initial project." + "description": "Enable routing in the initial application project. This sets up the necessary files and modules for managing navigation between different views in your application." }, { "name": "server-routing", "type": "boolean", - "description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview)." + "description": "Create a server application in the initial project using the Server Routing and App Engine APIs (Developer Preview)." }, { "name": "skip-git", @@ -144,13 +144,13 @@ "g" ], "default": false, - "description": "Do not initialize a git repository." + "description": "Do not initialize a Git repository in the new workspace. By default, a Git repository is initialized to help you track changes to your project." }, { "name": "skip-install", "type": "boolean", "default": false, - "description": "Do not install dependency packages." + "description": "Skip the automatic installation of packages. You will need to manually install the dependencies later." }, { "name": "skip-tests", @@ -159,12 +159,12 @@ "S" ], "default": false, - "description": "Do not generate \"spec.ts\" test files for the new project." + "description": "Skip the generation of unit test files `spec.ts`." }, { "name": "ssr", "type": "boolean", - "description": "Creates an application with Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering) enabled." + "description": "Configure the initial application for Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering)." }, { "name": "standalone", @@ -176,7 +176,7 @@ "name": "strict", "type": "boolean", "default": true, - "description": "Creates a workspace with stricter type checking and stricter bundle budgets settings. This setting helps improve maintainability and catch bugs ahead of time. For more information, see https://angular.dev/tools/cli/template-typecheck#strict-mode" + "description": "Enable stricter type checking and stricter bundle budgets settings. This setting helps improve maintainability and catch bugs ahead of time. For more information, see https://angular.dev/tools/cli/template-typecheck#strict-mode" }, { "name": "style", @@ -187,7 +187,7 @@ "sass", "less" ], - "description": "The file extension or preprocessor to use for style files." + "description": "The type of stylesheet files to be created for components in the initial project." }, { "name": "view-encapsulation", @@ -197,7 +197,7 @@ "None", "ShadowDom" ], - "description": "The view encapsulation strategy to use in the initial project." + "description": "Sets the view encapsulation mode for components in the initial project. This determines how component styles are scoped and applied. Options include: `Emulated` (default, styles are scoped to the component), `None` (styles are global), and `ShadowDom` (styles are encapsulated using Shadow DOM)." } ] } \ No newline at end of file diff --git a/adev/src/content/cli/help/serve.json b/adev/src/content/cli/help/serve.json index 0cf82f713239..20882c5cf73f 100644 --- a/adev/src/content/cli/help/serve.json +++ b/adev/src/content/cli/help/serve.json @@ -11,7 +11,7 @@ { "name": "allowed-hosts", "type": "array", - "description": "List of hosts that are allowed to access the dev server. This option has no effect when using the 'application' or other esbuild-based builders." + "description": "List of hosts that are allowed to access the dev server." }, { "name": "build-target", @@ -30,7 +30,7 @@ "name": "disable-host-check", "type": "boolean", "default": false, - "description": "Don't verify connected clients are part of allowed hosts. This option has no effect when using the 'application' or other esbuild-based builders." + "description": "Don't verify connected clients are part of allowed hosts." }, { "name": "force-esbuild", @@ -98,7 +98,7 @@ { "name": "prebundle", "type": "boolean", - "description": "Enable and control the Vite-based development server's prebundling capabilities. To enable prebundling, the Angular CLI cache must also be enabled. This option has no effect when using the 'browser' or other webpack-based builders." + "description": "Enable and control the Vite-based development server's prebundling capabilities. To enable prebundling, the Angular CLI cache must also be enabled. This option has no effect when using the 'browser' or other Webpack-based builders." }, { "name": "project", @@ -149,4 +149,4 @@ "description": "Rebuild on change." } ] -} +} \ No newline at end of file diff --git a/adev/src/content/cli/help/test.json b/adev/src/content/cli/help/test.json index daf02e9ff6a0..2ac675458fde 100644 --- a/adev/src/content/cli/help/test.json +++ b/adev/src/content/cli/help/test.json @@ -9,6 +9,12 @@ ], "deprecated": false, "options": [ + { + "name": "aot", + "type": "boolean", + "default": false, + "description": "Run tests using Ahead of Time compilation." + }, { "name": "browsers", "type": "string", diff --git a/adev/src/content/ecosystem/custom-build-pipeline.md b/adev/src/content/ecosystem/custom-build-pipeline.md new file mode 100644 index 000000000000..71fdaa24a2b4 --- /dev/null +++ b/adev/src/content/ecosystem/custom-build-pipeline.md @@ -0,0 +1,33 @@ +# Custom build pipeline + +When building an Angular app we strongly recommend you to use the Angular CLI to leverage its structure-dependent update functionality and build system abstraction. This way your projects benefit from the latest security, performance, and API improvements and transparent build improvements. + +This page explores the **rare use cases** when you need a custom build pipeline that does not use the Angular CLI. All listed tools below are open source build plugins that are maintained by members of the Angular community. To learn more about their support model and maintenance status look at their documentation and GitHub repository URLs. + +## When should you use a custom build pipeline? + +There are some niche use cases when you may want to maintain a custom build pipeline. For example: + +* You have an existing app using a different toolchain and you’d like to add Angular to it +* You’re strongly coupled to [module federation](https://module-federation.io/) and unable to adopt bundler-agnostic [native federation](https://www.npmjs.com/package/@angular-architects/native-federation) +* You’d like to create an short-lived experiment using your favorite build tool + +## What are the options? + +Currently, there are two well supported community tools that enable you to create a custom build pipeline with a [Vite plugin](https://www.npmjs.com/package/@analogjs/vite-plugin-angular) and [Rspack plugin](https://www.npmjs.com/package/@ng-rspack/build). Both of them use underlying abstractions that power the Angular CLI. They allow you to create a flexible build pipeline and require manual maintenance and no automated update experience. + +### Rspack + +Rspack is a Rust-based bundler that aims to provide compatibility with the webpack plugin ecosystem. + +If your project is tightly coupled to the webpack ecosystem, heavily relying on a custom webpack configuration you can leverage Rspack to improve your build times. + +You can find more about Angular Rspack on the project’s [documentation website](https://angular-rspack.dev/guide/migration/from-webpack). + +### Vite + +Vite is a frontend build tool that aims to provide a faster and leaner development experience for modern web projects. Vite is also extensible through its plugin system that allows ecosystems to build integrations with Vite, such as Vitest for unit and browser testing, Storybook for authoring components in isolation, and more. The Angular CLI also uses Vite as its development server. + +The [AnalogJS Vite plugin for Angular](https://www.npmjs.com/package/@analogjs/vite-plugin-angular) enables the adoption of Angular with a project or framework that uses or is built on top of Vite. This can consist of developing and building an Angular project with Vite directly, or adding Angular to an existing project or pipeline. One example is integrating Angular UI components into a documentation website using [Astro and Starlight](https://analogjs.org/docs/packages/astro-angular/overview). + +You can learn more about AnalogJS and how to use the plugin through its [documentation page](https://analogjs.org/docs/packages/vite-plugin-angular/overview). diff --git a/adev/src/content/ecosystem/rxjs-interop/signals-interop.md b/adev/src/content/ecosystem/rxjs-interop/signals-interop.md index 69c3533ba6f8..1eccfccc2a56 100644 --- a/adev/src/content/ecosystem/rxjs-interop/signals-interop.md +++ b/adev/src/content/ecosystem/rxjs-interop/signals-interop.md @@ -63,7 +63,7 @@ If an Observable used in `toSignal` produces an error, that error is thrown when If an Observable used in `toSignal` completes, the signal continues to return the most recently emitted value before completion. -## Create an RxJS Observale from a signal with `toObservable` +## Create an RxJS Observable from a signal with `toObservable` Use the `toObservable` utility to create an `Observable` which tracks the value of a signal. The signal's value is monitored with an `effect` which emits the value to the Observable when it changes. diff --git a/adev/src/content/ecosystem/service-workers/config.md b/adev/src/content/ecosystem/service-workers/config.md index a4d16eea2985..1cdf056d346c 100644 --- a/adev/src/content/ecosystem/service-workers/config.md +++ b/adev/src/content/ecosystem/service-workers/config.md @@ -318,7 +318,7 @@ If not specified, the default value depends on the data group's configured strat | Groups with the `performance` strategy | The default value is `false` and the service worker doesn't cache opaque responses. These groups would continue to return a cached response until `maxAge` expires, even if the error was due to a temporary network or server issue. Therefore, it would be problematic for the service worker to cache an error response. | - + In case you are not familiar, an [opaque response](https://fetch.spec.whatwg.org#concept-filtered-response-opaque) is a special type of response returned when requesting a resource that is on a different origin which doesn't return CORS headers. One of the characteristics of an opaque response is that the service worker is not allowed to read its status, meaning it can't check if the request was successful or not. See [Introduction to `fetch()`](https://developers.google.com/web/updates/2015/03/introduction-to-fetch#response_types) for more details. @@ -366,9 +366,9 @@ If the field is omitted, it defaults to: [ '/**', // Include all URLs. - '!/**/*.*', // Exclude URLs to files. - '!/**/****', // Exclude URLs containing `**` in the last segment. - '!/**/****/**', // Exclude URLs containing `**` in any other segment. + '!/**/*.*', // Exclude URLs to files (containing a file extension in the last segment). + '!/**/*__*', // Exclude URLs containing `__` in the last segment. + '!/**/*__*/**', // Exclude URLs containing `__` in any other segment. ] diff --git a/adev/src/content/ecosystem/service-workers/getting-started.md b/adev/src/content/ecosystem/service-workers/getting-started.md index bd8394928677..ec89a81aae2e 100644 --- a/adev/src/content/ecosystem/service-workers/getting-started.md +++ b/adev/src/content/ecosystem/service-workers/getting-started.md @@ -37,7 +37,24 @@ The CLI project is now set up to use the Angular service worker. ## Service worker in action: a tour This section demonstrates a service worker in action, -using an example application. +using an example application. To enable service worker support during local development, use the production configuration with the following command: + + + +ng serve --prod + + + +Alternatively, you can use the [`http-server package`](https://www.npmjs.com/package/http-server) from +npm, which supports service worker applications. Run it without installation using: + + + +npx http-server -p 8080 -c-1 dist/<project-name>/browser + + + +This will serve your application with service worker support at http://localhost:8080. ### Initial load diff --git a/adev/src/content/examples/router/e2e/src/app.e2e-spec.ts b/adev/src/content/examples/router/e2e/src/app.e2e-spec.ts deleted file mode 100644 index ee6f1f8003ab..000000000000 --- a/adev/src/content/examples/router/e2e/src/app.e2e-spec.ts +++ /dev/null @@ -1,191 +0,0 @@ -import {browser, element, by, ExpectedConditions as EC} from 'protractor'; - -const numDashboardTabs = 5; -const numCrises = 4; -const numHeroes = 9; - -describe('Router', () => { - beforeAll(() => browser.get('')); - - function getPageStruct() { - const hrefEles = element.all(by.css('nav a')); - const crisisDetail = element - .all(by.css('app-crisis-center > app-crisis-list > app-crisis-detail > div')) - .first(); - const heroDetail = element(by.css('app-hero-detail')); - - return { - hrefs: hrefEles, - activeHref: element(by.css('nav a.active')), - - crisisHref: hrefEles.get(0), - crisisList: element.all(by.css('app-crisis-center app-crisis-list li')), - crisisDetail, - crisisDetailTitle: crisisDetail.element(by.xpath('*[1]')), - - heroesHref: hrefEles.get(1), - heroesList: element.all(by.css('app-hero-list li')), - heroDetail, - heroDetailTitle: heroDetail.element(by.xpath('*[2]')), - - adminHref: hrefEles.get(2), - adminPage: element(by.css('app-admin')), - adminPreloadList: element.all(by.css('app-admin > app-admin-dashboard > ul > li')), - - loginHref: hrefEles.get(3), - loginButton: element.all(by.css('app-login > p > button')), - - contactHref: hrefEles.get(4), - contactCancelButton: element.all(by.buttonText('Cancel')), - - primaryOutlet: element.all(by.css('app-hero-list')), - secondaryOutlet: element.all(by.css('app-compose-message')), - }; - } - - it('has expected dashboard tabs', async () => { - const page = getPageStruct(); - expect(await page.hrefs.count()).toEqual(numDashboardTabs, 'dashboard tab count'); - expect(await page.crisisHref.getText()).toEqual('Crisis Center'); - expect(await page.heroesHref.getText()).toEqual('Heroes'); - expect(await page.adminHref.getText()).toEqual('Admin'); - expect(await page.loginHref.getText()).toEqual('Login'); - expect(await page.contactHref.getText()).toEqual('Contact'); - }); - - it('has heroes selected as opening tab', async () => { - const page = getPageStruct(); - expect(await page.activeHref.getText()).toEqual('Heroes'); - }); - - it('has crises center items', async () => { - const page = getPageStruct(); - await page.crisisHref.click(); - expect(await page.activeHref.getText()).toEqual('Crisis Center'); - expect(await page.crisisList.count()).toBe(numCrises, 'crisis list count'); - }); - - it('has hero items', async () => { - const page = getPageStruct(); - await page.heroesHref.click(); - expect(await page.activeHref.getText()).toEqual('Heroes'); - expect(await page.heroesList.count()).toBe(numHeroes, 'hero list count'); - }); - - it('toggles views', async () => { - const page = getPageStruct(); - await page.crisisHref.click(); - expect(await page.activeHref.getText()).toEqual('Crisis Center'); - expect(await page.crisisList.count()).toBe(numCrises, 'crisis list count'); - await page.heroesHref.click(); - expect(await page.activeHref.getText()).toEqual('Heroes'); - expect(await page.heroesList.count()).toBe(numHeroes, 'hero list count'); - }); - - it('saves changed crisis details', async () => { - const page = getPageStruct(); - await page.crisisHref.click(); - await crisisCenterEdit(2, true); - }); - - // TODO: Figure out why this test is failing now - xit('can cancel changed crisis details', async () => { - const page = getPageStruct(); - await page.crisisHref.click(); - await crisisCenterEdit(3, false); - }); - - it('saves changed hero details', async () => { - const page = getPageStruct(); - await page.heroesHref.click(); - await browser.sleep(600); - const heroEle = page.heroesList.get(4); - const text = await heroEle.getText(); - expect(text.length).toBeGreaterThan(0, 'hero item text length'); - // remove leading id from text - const heroText = text.slice(text.indexOf(' ')).trim(); - - await heroEle.click(); - await browser.sleep(600); - expect(await page.heroesList.count()).toBe(0, 'hero list count'); - expect(await page.heroDetail.isPresent()).toBe(true, 'hero detail'); - expect(await page.heroDetailTitle.getText()).toContain(heroText); - const inputEle = page.heroDetail.element(by.css('input')); - await inputEle.sendKeys('-foo'); - expect(await page.heroDetailTitle.getText()).toContain(heroText + '-foo'); - - const buttonEle = page.heroDetail.element(by.css('button')); - await buttonEle.click(); - await browser.sleep(600); - expect(await heroEle.getText()).toContain(heroText + '-foo'); - }); - - it('sees preloaded modules', async () => { - const page = getPageStruct(); - await page.loginHref.click(); - await page.loginButton.click(); - const list = page.adminPreloadList; - expect(await list.count()).toBe(1, 'preloaded module'); - expect(await list.first().getText()).toBe('crisis-center', 'first preloaded module'); - }); - - it('sees the secondary route', async () => { - const page = getPageStruct(); - await page.heroesHref.click(); - await page.contactHref.click(); - expect(await page.primaryOutlet.count()).toBe(1, 'primary outlet'); - expect(await page.secondaryOutlet.count()).toBe(1, 'secondary outlet'); - }); - - it('should redirect with secondary route', async () => { - const page = getPageStruct(); - - // go to login page and login - await browser.get(''); - await page.loginHref.click(); - await page.loginButton.click(); - - // open secondary outlet - await page.contactHref.click(); - - // go to login page and logout - await page.loginHref.click(); - await page.loginButton.click(); - - // attempt to go to admin page, redirects to login with secondary outlet open - await page.adminHref.click(); - - // login, get redirected back to admin with outlet still open - await page.loginButton.click(); - - expect(await page.adminPage.isDisplayed()).toBeTruthy(); - expect(await page.secondaryOutlet.count()).toBeTruthy(); - }); - - async function crisisCenterEdit(index: number, save: boolean) { - const page = getPageStruct(); - await page.crisisHref.click(); - let crisisEle = page.crisisList.get(index); - const text = await crisisEle.getText(); - expect(text.length).toBeGreaterThan(0, 'crisis item text length'); - // remove leading id from text - const crisisText = text.slice(text.indexOf(' ')).trim(); - - await crisisEle.click(); - expect(await page.crisisDetail.isPresent()).toBe(true, 'crisis detail present'); - expect(await page.crisisDetailTitle.getText()).toContain(crisisText); - const inputEle = page.crisisDetail.element(by.css('input')); - await inputEle.sendKeys('-foo'); - - const buttonEle = page.crisisDetail.element(by.buttonText(save ? 'Save' : 'Cancel')); - await buttonEle.click(); - crisisEle = page.crisisList.get(index); - if (save) { - expect(await crisisEle.getText()).toContain(crisisText + '-foo'); - } else { - await browser.wait(EC.alertIsPresent(), 4000); - await browser.switchTo().alert().accept(); - expect(await crisisEle.getText()).toContain(crisisText); - } - } -}); diff --git a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.1.html b/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.1.html deleted file mode 100644 index 02a0be66a646..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.1.html +++ /dev/null @@ -1 +0,0 @@ -

    Dashboard

    diff --git a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.1.ts b/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.1.ts deleted file mode 100644 index 86b8f7a61640..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.1.ts +++ /dev/null @@ -1,28 +0,0 @@ -// #docregion -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute} from '@angular/router'; -import {Observable} from 'rxjs'; -import {map} from 'rxjs/operators'; - -@Component({ - selector: 'app-admin-dashboard', - templateUrl: './admin-dashboard.component.html', - styleUrls: ['./admin-dashboard.component.css'], - standalone: false, -}) -export class AdminDashboardComponent implements OnInit { - sessionId!: Observable; - token!: Observable; - - constructor(private route: ActivatedRoute) {} - - ngOnInit() { - // Capture the session ID if available - this.sessionId = this.route.queryParamMap.pipe( - map((params) => params.get('session_id') || 'None'), - ); - - // Capture the fragment if available - this.token = this.route.fragment.pipe(map((fragment) => fragment || 'None')); - } -} diff --git a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.css b/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.html b/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.html deleted file mode 100644 index 04ff184a5f4e..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.html +++ /dev/null @@ -1,10 +0,0 @@ -

    Dashboard

    - -

    Session ID: {{ sessionId | async }}

    -
    -

    Token: {{ token | async }}

    - -Preloaded Modules -
      -
    • {{ module }}
    • -
    diff --git a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.ts b/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.ts deleted file mode 100644 index e40c8aa15b45..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.ts +++ /dev/null @@ -1,36 +0,0 @@ -// #docregion -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute} from '@angular/router'; -import {Observable} from 'rxjs'; -import {map} from 'rxjs/operators'; - -import {SelectivePreloadingStrategyService} from '../../selective-preloading-strategy.service'; - -@Component({ - selector: 'app-admin-dashboard', - templateUrl: './admin-dashboard.component.html', - styleUrls: ['./admin-dashboard.component.css'], - standalone: false, -}) -export class AdminDashboardComponent implements OnInit { - sessionId!: Observable; - token!: Observable; - modules: string[] = []; - - constructor( - private route: ActivatedRoute, - preloadStrategy: SelectivePreloadingStrategyService, - ) { - this.modules = preloadStrategy.preloadedModules; - } - - ngOnInit() { - // Capture the session ID if available - this.sessionId = this.route.queryParamMap.pipe( - map((params) => params.get('session_id') || 'None'), - ); - - // Capture the fragment if available - this.token = this.route.fragment.pipe(map((fragment) => fragment || 'None')); - } -} diff --git a/adev/src/content/examples/router/src/app/admin/admin-routing.module.1.ts b/adev/src/content/examples/router/src/app/admin/admin-routing.module.1.ts deleted file mode 100644 index b7435f613adc..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-routing.module.1.ts +++ /dev/null @@ -1,35 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {AdminComponent} from './admin/admin.component'; -import {AdminDashboardComponent} from './admin-dashboard/admin-dashboard.component'; -import {ManageCrisesComponent} from './manage-crises/manage-crises.component'; -import {ManageHeroesComponent} from './manage-heroes/manage-heroes.component'; - -// #docregion admin-routes -const adminRoutes: Routes = [ - { - path: 'admin', - component: AdminComponent, - children: [ - { - path: '', - children: [ - {path: 'crises', component: ManageCrisesComponent}, - {path: 'heroes', component: ManageHeroesComponent}, - {path: '', component: AdminDashboardComponent}, - ], - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(adminRoutes)], - exports: [RouterModule], -}) -export class AdminRoutingModule {} -// #enddocregion admin-routes -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/admin/admin-routing.module.2.ts b/adev/src/content/examples/router/src/app/admin/admin-routing.module.2.ts deleted file mode 100644 index 00e10d1057da..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-routing.module.2.ts +++ /dev/null @@ -1,40 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -// #docregion admin-route -import {authGuard} from '../auth/auth.guard'; - -import {AdminDashboardComponent} from './admin-dashboard/admin-dashboard.component'; -import {AdminComponent} from './admin/admin.component'; -import {ManageCrisesComponent} from './manage-crises/manage-crises.component'; -import {ManageHeroesComponent} from './manage-heroes/manage-heroes.component'; - -const adminRoutes: Routes = [ - { - path: 'admin', - component: AdminComponent, - canActivate: [authGuard], - - // #enddocregion admin-route - // #docregion admin-route - children: [ - { - path: '', - children: [ - {path: 'crises', component: ManageCrisesComponent}, - {path: 'heroes', component: ManageHeroesComponent}, - {path: '', component: AdminDashboardComponent}, - ], - // #enddocregion admin-route - canActivateChild: [authGuard], - // #docregion admin-route - }, - ], - }, -]; - -@NgModule({imports: [RouterModule.forChild(adminRoutes)], exports: [RouterModule]}) -export class AdminRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/admin/admin-routing.module.3.ts b/adev/src/content/examples/router/src/app/admin/admin-routing.module.3.ts deleted file mode 100644 index c0ec61f09b44..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-routing.module.3.ts +++ /dev/null @@ -1,38 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {AdminComponent} from './admin/admin.component'; -import {AdminDashboardComponent} from './admin-dashboard/admin-dashboard.component'; -import {ManageCrisesComponent} from './manage-crises/manage-crises.component'; -import {ManageHeroesComponent} from './manage-heroes/manage-heroes.component'; - -import {authGuard} from '../auth/auth.guard'; - -// #docregion can-activate-child -const adminRoutes: Routes = [ - { - path: 'admin', - component: AdminComponent, - canActivate: [authGuard], - children: [ - { - path: '', - canActivateChild: [authGuard], - children: [ - {path: 'crises', component: ManageCrisesComponent}, - {path: 'heroes', component: ManageHeroesComponent}, - {path: '', component: AdminDashboardComponent}, - ], - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(adminRoutes)], - exports: [RouterModule], -}) -export class AdminRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/admin/admin-routing.module.ts b/adev/src/content/examples/router/src/app/admin/admin-routing.module.ts deleted file mode 100644 index 244d09bab4c7..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-routing.module.ts +++ /dev/null @@ -1,37 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {AdminComponent} from './admin/admin.component'; -import {AdminDashboardComponent} from './admin-dashboard/admin-dashboard.component'; -import {ManageCrisesComponent} from './manage-crises/manage-crises.component'; -import {ManageHeroesComponent} from './manage-heroes/manage-heroes.component'; - -import {authGuard} from '../auth/auth.guard'; - -const adminRoutes: Routes = [ - { - path: '', - component: AdminComponent, - canActivate: [authGuard], - children: [ - { - path: '', - canActivateChild: [authGuard], - children: [ - {path: 'crises', component: ManageCrisesComponent}, - {path: 'heroes', component: ManageHeroesComponent}, - {path: '', component: AdminDashboardComponent}, - ], - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(adminRoutes)], - exports: [RouterModule], -}) -export class AdminRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/admin/admin.module.ts b/adev/src/content/examples/router/src/app/admin/admin.module.ts deleted file mode 100644 index bab83e6e7962..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin.module.ts +++ /dev/null @@ -1,21 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {CommonModule} from '@angular/common'; - -import {AdminComponent} from './admin/admin.component'; -import {AdminDashboardComponent} from './admin-dashboard/admin-dashboard.component'; -import {ManageCrisesComponent} from './manage-crises/manage-crises.component'; -import {ManageHeroesComponent} from './manage-heroes/manage-heroes.component'; - -import {AdminRoutingModule} from './admin-routing.module'; - -@NgModule({ - imports: [CommonModule, AdminRoutingModule], - declarations: [ - AdminComponent, - AdminDashboardComponent, - ManageCrisesComponent, - ManageHeroesComponent, - ], -}) -export class AdminModule {} diff --git a/adev/src/content/examples/router/src/app/admin/admin/admin.component.css b/adev/src/content/examples/router/src/app/admin/admin/admin.component.css deleted file mode 100644 index dadbe07a579b..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin/admin.component.css +++ /dev/null @@ -1,22 +0,0 @@ -nav a { - padding: 1rem; - font-size: 1rem; - background-color: #e8e8e8; - color: #3d3d3d; -} - -@media (min-width: 400px) { - nav a { - font-size: 1.2rem; - } -} - -nav a:hover { - color: white; - background-color: #42545C; - } - -nav a.active { - background-color: black; - color: white; -} diff --git a/adev/src/content/examples/router/src/app/admin/admin/admin.component.html b/adev/src/content/examples/router/src/app/admin/admin/admin.component.html deleted file mode 100644 index a04a451ad0ec..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin/admin.component.html +++ /dev/null @@ -1,8 +0,0 @@ -

    Admin

    - - diff --git a/adev/src/content/examples/router/src/app/admin/admin/admin.component.ts b/adev/src/content/examples/router/src/app/admin/admin/admin.component.ts deleted file mode 100644 index 786cb396a308..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin/admin.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-admin', - templateUrl: './admin.component.html', - styleUrls: ['./admin.component.css'], - standalone: false, -}) -export class AdminComponent {} diff --git a/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.css b/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.html b/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.html deleted file mode 100644 index 4edfa721335a..000000000000 --- a/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.html +++ /dev/null @@ -1 +0,0 @@ -

    Manage your crises here

    \ No newline at end of file diff --git a/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.ts b/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.ts deleted file mode 100644 index cbd11a05f141..000000000000 --- a/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-manage-crises', - templateUrl: './manage-crises.component.html', - styleUrls: ['./manage-crises.component.css'], - standalone: false, -}) -export class ManageCrisesComponent {} diff --git a/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.css b/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.html b/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.html deleted file mode 100644 index 3e5256527d8d..000000000000 --- a/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.html +++ /dev/null @@ -1 +0,0 @@ -

    Manage your heroes here

    \ No newline at end of file diff --git a/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.ts b/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.ts deleted file mode 100644 index 0ec9a34f9984..000000000000 --- a/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-manage-heroes', - templateUrl: './manage-heroes.component.html', - styleUrls: ['./manage-heroes.component.css'], - standalone: false, -}) -export class ManageHeroesComponent {} diff --git a/adev/src/content/examples/router/src/app/animations.ts b/adev/src/content/examples/router/src/app/animations.ts deleted file mode 100644 index 35c068e420c3..000000000000 --- a/adev/src/content/examples/router/src/app/animations.ts +++ /dev/null @@ -1,24 +0,0 @@ -// #docregion -import {trigger, animateChild, group, transition, animate, style, query} from '@angular/animations'; - -// Routable animations -export const slideInAnimation = trigger('routeAnimation', [ - transition('heroes <=> hero', [ - style({position: 'relative'}), - query(':enter, :leave', [ - style({ - position: 'absolute', - top: 0, - left: 0, - width: '100%', - }), - ]), - query(':enter', [style({left: '-100%'})]), - query(':leave', animateChild()), - group([ - query(':leave', [animate('300ms ease-out', style({left: '100%'}))]), - query(':enter', [animate('300ms ease-out', style({left: '0%'}))]), - ]), - query(':enter', animateChild()), - ]), -]); diff --git a/adev/src/content/examples/router/src/app/app-routing.module.1.ts b/adev/src/content/examples/router/src/app/app-routing.module.1.ts deleted file mode 100644 index 6640b785d0c3..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.1.ts +++ /dev/null @@ -1,27 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {HeroListComponent} from './hero-list/hero-list.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -// #docregion appRoutes -const appRoutes: Routes = [ - {path: 'crisis-center', component: CrisisListComponent}, - {path: 'heroes', component: HeroListComponent}, - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; -// #enddocregion appRoutes - -@NgModule({ - imports: [ - RouterModule.forRoot( - appRoutes, - {enableTracing: true}, // <-- debugging purposes only - ), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.10.ts b/adev/src/content/examples/router/src/app/app-routing.module.10.ts deleted file mode 100644 index a30bfc8517c3..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.10.ts +++ /dev/null @@ -1,51 +0,0 @@ -// #docplaster -import {Injectable, NgModule} from '@angular/core'; -import {Title} from '@angular/platform-browser'; -import {ResolveFn, RouterModule, RouterStateSnapshot, Routes, TitleStrategy} from '@angular/router'; // CLI imports router - -// #docregion page-title -const routes: Routes = [ - { - path: 'first-component', - title: 'First component', - component: FirstComponent, // this is the component with the in the template - children: [ - { - path: 'child-a', // child route path - title: resolvedChildATitle, - component: ChildAComponent, // child route component that the router renders - }, - { - path: 'child-b', - title: 'child b', - component: ChildBComponent, // another child route component that the router renders - }, - ], - }, -]; - -const resolvedChildATitle: ResolveFn = () => Promise.resolve('child a'); -// #enddocregion page-title - -// #docregion custom-page-title -@Injectable({providedIn: 'root'}) -export class TemplatePageTitleStrategy extends TitleStrategy { - constructor(private readonly title: Title) { - super(); - } - - override updateTitle(routerState: RouterStateSnapshot) { - const title = this.buildTitle(routerState); - if (title !== undefined) { - this.title.setTitle(`My Application | ${title}`); - } - } -} - -@NgModule({ - imports: [RouterModule.forRoot(routes)], - exports: [RouterModule], - providers: [{provide: TitleStrategy, useClass: TemplatePageTitleStrategy}], -}) -export class AppRoutingModule {} -// #enddocregion custom-page-title diff --git a/adev/src/content/examples/router/src/app/app-routing.module.11.ts b/adev/src/content/examples/router/src/app/app-routing.module.11.ts deleted file mode 100644 index 6db507a863e1..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.11.ts +++ /dev/null @@ -1,30 +0,0 @@ -import {NgModule} from '@angular/core'; -import {provideRouter, Routes, withComponentInputBinding} from '@angular/router'; - -import {authGuard} from './auth/auth.guard'; -import {ComposeMessageComponent} from './compose-message/compose-message.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -const appRoutes: Routes = [ - {path: 'compose', component: ComposeMessageComponent, outlet: 'popup'}, - { - path: 'admin', - loadChildren: () => import('./admin/admin.module').then((m) => m.AdminModule), - canMatch: [authGuard], - }, - { - path: 'crisis-center', - loadChildren: () => - import('./crisis-center/crisis-center.module').then((m) => m.CrisisCenterModule), - data: {preload: true}, - }, - {path: '', redirectTo: '/superheroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - // #docregion withComponentInputBinding - providers: [provideRouter(appRoutes, withComponentInputBinding())], - // #enddocregion withComponentInputBinding -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.2.ts b/adev/src/content/examples/router/src/app/app-routing.module.2.ts deleted file mode 100644 index e3856e22df26..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.2.ts +++ /dev/null @@ -1,31 +0,0 @@ -// #docregion -// #docregion milestone3 -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -// #enddocregion milestone3 -// import { HeroListComponent } from './hero-list/hero-list.component'; // <-- delete this line -// #docregion milestone3 -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -const appRoutes: Routes = [ - {path: 'crisis-center', component: CrisisListComponent}, - // #enddocregion milestone3 - // { path: 'heroes', component: HeroListComponent }, // <-- delete this line - // #docregion milestone3 - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - imports: [ - RouterModule.forRoot( - appRoutes, - {enableTracing: true}, // <-- debugging purposes only - ), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} -// #enddocregion milestone3 diff --git a/adev/src/content/examples/router/src/app/app-routing.module.3.ts b/adev/src/content/examples/router/src/app/app-routing.module.3.ts deleted file mode 100644 index 2d72c6a0c8c6..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.3.ts +++ /dev/null @@ -1,34 +0,0 @@ -// #docplaster -// #docregion , v3 -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -// #enddocregion v3 -import {ComposeMessageComponent} from './compose-message/compose-message.component'; -// #docregion v3 -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -const appRoutes: Routes = [ - // #enddocregion v3 - // #docregion compose - { - path: 'compose', - component: ComposeMessageComponent, - outlet: 'popup', - }, - // #enddocregion compose - // #docregion v3 - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - imports: [ - RouterModule.forRoot( - appRoutes, - {enableTracing: true}, // <-- debugging purposes only - ), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.4.ts b/adev/src/content/examples/router/src/app/app-routing.module.4.ts deleted file mode 100644 index 80fed6a59357..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.4.ts +++ /dev/null @@ -1,28 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {ComposeMessageComponent} from './compose-message/compose-message.component'; -import {CanDeactivateGuard} from './can-deactivate.guard'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -const appRoutes: Routes = [ - { - path: 'compose', - component: ComposeMessageComponent, - outlet: 'popup', - }, - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - imports: [ - RouterModule.forRoot( - appRoutes, - {enableTracing: true}, // <-- debugging purposes only - ), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.5.ts b/adev/src/content/examples/router/src/app/app-routing.module.5.ts deleted file mode 100644 index 1e8d81c9ac6c..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.5.ts +++ /dev/null @@ -1,39 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {ComposeMessageComponent} from './compose-message/compose-message.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -import {authGuard} from './auth/auth.guard'; - -const appRoutes: Routes = [ - { - path: 'compose', - component: ComposeMessageComponent, - outlet: 'popup', - }, - // #docregion admin, admin-1 - { - path: 'admin', - loadChildren: () => import('./admin/admin.module').then((m) => m.AdminModule), - // #enddocregion admin-1 - canMatch: [authGuard], - // #docregion admin-1 - }, - // #enddocregion admin, admin-1 - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - imports: [ - RouterModule.forRoot( - appRoutes, - {enableTracing: true}, // <-- debugging purposes only - ), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.6.ts b/adev/src/content/examples/router/src/app/app-routing.module.6.ts deleted file mode 100644 index b8a383e32cef..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.6.ts +++ /dev/null @@ -1,53 +0,0 @@ -// #docplaster -// #docregion, preload-v1 -import {NgModule} from '@angular/core'; -import { - RouterModule, - Routes, - // #enddocregion preload-v1 - PreloadAllModules, - // #docregion preload-v1 -} from '@angular/router'; - -import {ComposeMessageComponent} from './compose-message/compose-message.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -import {authGuard} from './auth/auth.guard'; - -const appRoutes: Routes = [ - { - path: 'compose', - component: ComposeMessageComponent, - outlet: 'popup', - }, - { - path: 'admin', - loadChildren: () => import('./admin/admin.module').then((m) => m.AdminModule), - canMatch: [authGuard], - }, - { - path: 'crisis-center', - loadChildren: () => - import('./crisis-center/crisis-center.module').then((m) => m.CrisisCenterModule), - }, - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - imports: [ - // #docregion forRoot - RouterModule.forRoot( - appRoutes, - // #enddocregion preload-v1 - { - enableTracing: true, // <-- debugging purposes only - preloadingStrategy: PreloadAllModules, - }, - // #docregion preload-v1 - ), - // #enddocregion forRoot - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.7.ts b/adev/src/content/examples/router/src/app/app-routing.module.7.ts deleted file mode 100644 index 6e67de845b97..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.7.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {NgModule} from '@angular/core'; -import {Routes, RouterModule} from '@angular/router'; // CLI imports router - -const routes: Routes = []; // sets up routes constant where you define your routes - -// configures NgModule imports and exports -@NgModule({ - imports: [RouterModule.forRoot(routes)], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.8.ts b/adev/src/content/examples/router/src/app/app-routing.module.8.ts deleted file mode 100644 index 5cfc2c020faa..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.8.ts +++ /dev/null @@ -1,21 +0,0 @@ -// #docplaster -import {NgModule} from '@angular/core'; -import {Routes, RouterModule} from '@angular/router'; // CLI imports router - -// #docregion routes, routes-with-wildcard, redirect -const routes: Routes = [ - {path: 'first-component', component: FirstComponent}, - {path: 'second-component', component: SecondComponent}, - // #enddocregion routes, routes-with-wildcard - {path: '', redirectTo: '/first-component', pathMatch: 'full'}, // redirect to `first-component` - // #docregion routes-with-wildcard - {path: '**', component: PageNotFoundComponent}, // Wildcard route for a 404 page - // #docregion routes -]; -// #enddocregion routes, routes-with-wildcard, redirect - -@NgModule({ - imports: [RouterModule.forRoot(routes)], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.9.ts b/adev/src/content/examples/router/src/app/app-routing.module.9.ts deleted file mode 100644 index 37a7106e59a0..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.9.ts +++ /dev/null @@ -1,28 +0,0 @@ -// #docplaster -import {NgModule} from '@angular/core'; -import {Routes, RouterModule} from '@angular/router'; // CLI imports router - -// #docregion child-routes -const routes: Routes = [ - { - path: 'first-component', - component: FirstComponent, // this is the component with the in the template - children: [ - { - path: 'child-a', // child route path - component: ChildAComponent, // child route component that the router renders - }, - { - path: 'child-b', - component: ChildBComponent, // another child route component that the router renders - }, - ], - }, -]; -// #enddocregion child-routes - -@NgModule({ - imports: [RouterModule.forRoot(routes)], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.ts b/adev/src/content/examples/router/src/app/app-routing.module.ts deleted file mode 100644 index b50dae98f6aa..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.ts +++ /dev/null @@ -1,44 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {ComposeMessageComponent} from './compose-message/compose-message.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -import {authGuard} from './auth/auth.guard'; -import {SelectivePreloadingStrategyService} from './selective-preloading-strategy.service'; - -const appRoutes: Routes = [ - { - path: 'compose', - component: ComposeMessageComponent, - outlet: 'popup', - }, - { - path: 'admin', - loadChildren: () => import('./admin/admin.module').then((m) => m.AdminModule), - canMatch: [authGuard], - }, - // #docregion preload-v2 - { - path: 'crisis-center', - loadChildren: () => - import('./crisis-center/crisis-center.module').then((m) => m.CrisisCenterModule), - data: {preload: true}, - }, - // #enddocregion preload-v2 - {path: '', redirectTo: '/superheroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - imports: [ - RouterModule.forRoot(appRoutes, { - enableTracing: false, // <-- debugging purposes only - preloadingStrategy: SelectivePreloadingStrategyService, - }), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app.component.1.ts b/adev/src/content/examples/router/src/app/app.component.1.ts deleted file mode 100644 index d804af7704ea..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.1.ts +++ /dev/null @@ -1,10 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-root', - templateUrl: 'app.component.html', - styleUrls: ['app.component.css'], - standalone: false, -}) -export class AppComponent {} diff --git a/adev/src/content/examples/router/src/app/app.component.2.html b/adev/src/content/examples/router/src/app/app.component.2.html deleted file mode 100644 index eb6c268e146b..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.2.html +++ /dev/null @@ -1,9 +0,0 @@ - -

    Angular Router

    - -
    - -
    \ No newline at end of file diff --git a/adev/src/content/examples/router/src/app/app.component.2.ts b/adev/src/content/examples/router/src/app/app.component.2.ts deleted file mode 100644 index fb62c585e923..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.2.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* Second Heroes version */ -// #docregion -import {Component} from '@angular/core'; -// #docregion animation-imports -import {ChildrenOutletContexts} from '@angular/router'; -import {slideInAnimation} from './animations'; - -@Component({ - selector: 'app-root', - templateUrl: 'app.component.html', - styleUrls: ['app.component.css'], - animations: [slideInAnimation], - standalone: false, -}) -// #enddocregion animation-imports -// #docregion function-binding -export class AppComponent { - constructor(private contexts: ChildrenOutletContexts) {} - - getAnimationData() { - return this.contexts.getContext('primary')?.route?.snapshot?.data?.['animation']; - } -} -// #enddocregion function-binding diff --git a/adev/src/content/examples/router/src/app/app.component.3.ts b/adev/src/content/examples/router/src/app/app.component.3.ts deleted file mode 100644 index b9264329a957..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.3.ts +++ /dev/null @@ -1,43 +0,0 @@ -// #docplaster -import {Component} from '@angular/core'; -import {Router} from '@angular/router'; - -@Component({ - selector: 'app-root', - /* Typical link - // #docregion h-anchor - Heroes - // #enddocregion h-anchor - */ - /* Incomplete Crisis Center link when CC lacks a default - // The link now fails with a "non-terminal link" error - // #docregion cc-anchor-w-default - Crisis Center - // #enddocregion cc-anchor-w-default - */ - /* Crisis Center link when CC lacks a default - Crisis Center - */ - /* Crisis Center Detail link - // #docregion Dragon-anchor - Dragon Crisis - // #enddocregion Dragon-anchor - */ - /* Crisis Center link with optional query params - // #docregion cc-query-params - Crisis Center - // #enddocregion cc-query-params - */ - // #docregion template - template: ` -

    Angular Router

    - - - `, - standalone: false, -}) -export class AppComponent {} diff --git a/adev/src/content/examples/router/src/app/app.component.4.html b/adev/src/content/examples/router/src/app/app.component.4.html deleted file mode 100644 index 77cd0fd3faa1..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.4.html +++ /dev/null @@ -1,15 +0,0 @@ - -

    Angular Router

    - - -
    - -
    - - \ No newline at end of file diff --git a/adev/src/content/examples/router/src/app/app.component.4.ts b/adev/src/content/examples/router/src/app/app.component.4.ts deleted file mode 100644 index 2aea69f352ea..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.4.ts +++ /dev/null @@ -1,15 +0,0 @@ -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-root', - templateUrl: 'app.component.html', - styleUrls: ['app.component.css'], - standalone: false, -}) -export class AppComponent { - // #docregion relative-to - goToItems() { - this.router.navigate(['items'], {relativeTo: this.route}); - } - // #enddocregion relative-to -} diff --git a/adev/src/content/examples/router/src/app/app.component.5.html b/adev/src/content/examples/router/src/app/app.component.5.html deleted file mode 100644 index 36019eb639ba..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.5.html +++ /dev/null @@ -1,12 +0,0 @@ - -

    Angular Router

    - -
    - -
    - \ No newline at end of file diff --git a/adev/src/content/examples/router/src/app/app.component.6.html b/adev/src/content/examples/router/src/app/app.component.6.html deleted file mode 100644 index 9ff4b20c9f58..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.6.html +++ /dev/null @@ -1,13 +0,0 @@ - -

    Angular Router

    - -
    - -
    - \ No newline at end of file diff --git a/adev/src/content/examples/router/src/app/app.component.7.html b/adev/src/content/examples/router/src/app/app.component.7.html deleted file mode 100644 index 7ba23f652a90..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.7.html +++ /dev/null @@ -1,10 +0,0 @@ -

    Angular Router App

    - - - - diff --git a/adev/src/content/examples/router/src/app/app.component.8.html b/adev/src/content/examples/router/src/app/app.component.8.html deleted file mode 100644 index 74791aa9cd58..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.8.html +++ /dev/null @@ -1,26 +0,0 @@ - -

    First Component

    - - - - - - - - - -

    First Component

    - - - - - diff --git a/adev/src/content/examples/router/src/app/app.component.css b/adev/src/content/examples/router/src/app/app.component.css deleted file mode 100644 index 0befc361b918..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.css +++ /dev/null @@ -1,3 +0,0 @@ -nav a { - padding: 1rem; -} diff --git a/adev/src/content/examples/router/src/app/app.component.html b/adev/src/content/examples/router/src/app/app.component.html deleted file mode 100644 index 2183b0fb0beb..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.html +++ /dev/null @@ -1,15 +0,0 @@ - -
    -

    Angular Router

    - -
    - -
    - -
    diff --git a/adev/src/content/examples/router/src/app/app.component.ts b/adev/src/content/examples/router/src/app/app.component.ts deleted file mode 100644 index c22cc108fa63..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.ts +++ /dev/null @@ -1,20 +0,0 @@ -// #docplaster -// #docregion -import {Component} from '@angular/core'; -import {ChildrenOutletContexts} from '@angular/router'; -import {slideInAnimation} from './animations'; - -@Component({ - selector: 'app-root', - templateUrl: 'app.component.html', - styleUrls: ['app.component.css'], - animations: [slideInAnimation], - standalone: false, -}) -export class AppComponent { - constructor(private contexts: ChildrenOutletContexts) {} - - getRouteAnimationData() { - return this.contexts.getContext('primary')?.route?.snapshot?.data?.['animation']; - } -} diff --git a/adev/src/content/examples/router/src/app/app.module.0.ts b/adev/src/content/examples/router/src/app/app.module.0.ts deleted file mode 100644 index a814ba49ed5d..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.0.ts +++ /dev/null @@ -1,41 +0,0 @@ -// NEVER USED. For docs only. Should compile though -// #docplaster -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {HeroListComponent} from './hero-list/hero-list.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; -import {PageNotFoundComponent as HeroDetailComponent} from './page-not-found/page-not-found.component'; - -// #docregion -const appRoutes: Routes = [ - {path: 'crisis-center', component: CrisisListComponent}, - {path: 'hero/:id', component: HeroDetailComponent}, - { - path: 'heroes', - component: HeroListComponent, - data: {title: 'Heroes List'}, - }, - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - imports: [ - RouterModule.forRoot( - appRoutes, - {enableTracing: true}, // <-- debugging purposes only - ), - // other imports here - ], - // #enddocregion - /* -// #docregion - ... -}) -export class AppModule { } -// #enddocregion -*/ -}) -export class AppModule0 {} diff --git a/adev/src/content/examples/router/src/app/app.module.1.ts b/adev/src/content/examples/router/src/app/app.module.1.ts deleted file mode 100644 index 5a4c46d4a7e9..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.1.ts +++ /dev/null @@ -1,48 +0,0 @@ -// #docplaster -// #docregion -// #docregion first-config -import {NgModule} from '@angular/core'; -import {FormsModule} from '@angular/forms'; -import {BrowserModule} from '@angular/platform-browser'; -import {RouterModule, Routes} from '@angular/router'; - -import {AppComponent} from './app.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {HeroListComponent} from './hero-list/hero-list.component'; -// #enddocregion first-config -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -// #docregion first-config - -const appRoutes: Routes = [ - {path: 'crisis-center', component: CrisisListComponent}, - {path: 'heroes', component: HeroListComponent}, - // #enddocregion first-config - - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - // #docregion wildcard - {path: '**', component: PageNotFoundComponent}, // #enddocregion wildcard - // #docregion first-config -]; - -@NgModule({ - imports: [ - BrowserModule, - FormsModule, - RouterModule.forRoot( - appRoutes, - {enableTracing: true}, // <-- debugging purposes only - ), - ], - declarations: [ - AppComponent, - HeroListComponent, - CrisisListComponent, - // #enddocregion first-config - PageNotFoundComponent, - // #docregion first-config - ], - bootstrap: [AppComponent], -}) -export class AppModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/app.module.2.ts b/adev/src/content/examples/router/src/app/app.module.2.ts deleted file mode 100644 index 4a529679e6b7..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.2.ts +++ /dev/null @@ -1,17 +0,0 @@ -import {NgModule} from '@angular/core'; -import {BrowserModule} from '@angular/platform-browser'; -import {FormsModule} from '@angular/forms'; - -import {AppComponent} from './app.component'; -import {AppRoutingModule} from './app-routing.module'; - -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {HeroListComponent} from './hero-list/hero-list.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -@NgModule({ - imports: [BrowserModule, FormsModule, AppRoutingModule], - declarations: [AppComponent, HeroListComponent, CrisisListComponent, PageNotFoundComponent], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/adev/src/content/examples/router/src/app/app.module.3.ts b/adev/src/content/examples/router/src/app/app.module.3.ts deleted file mode 100644 index 2bb3f1bb141c..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.3.ts +++ /dev/null @@ -1,37 +0,0 @@ -// #docplaster -// #docregion -// #docregion remove-heroes -import {NgModule} from '@angular/core'; -import {BrowserModule} from '@angular/platform-browser'; -import {FormsModule} from '@angular/forms'; -// #enddocregion remove-heroes -import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; - -// #docregion remove-heroes -import {AppComponent} from './app.component'; -import {AppRoutingModule} from './app-routing.module'; -import {HeroesModule} from './heroes/heroes.module'; - -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -@NgModule({ - // #docregion module-imports - imports: [ - BrowserModule, - // #enddocregion module-imports - // #enddocregion remove-heroes - BrowserAnimationsModule, - // #docregion remove-heroes - // #docregion module-imports - FormsModule, - HeroesModule, - AppRoutingModule, - ], - // #enddocregion module-imports - declarations: [AppComponent, CrisisListComponent, PageNotFoundComponent], - bootstrap: [AppComponent], -}) -export class AppModule {} -// #enddocregion remove-heroes -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/app.module.4.ts b/adev/src/content/examples/router/src/app/app.module.4.ts deleted file mode 100644 index 4dc6c547da84..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.4.ts +++ /dev/null @@ -1,41 +0,0 @@ -// #docplaster -// #docregion -// #docregion crisis-center-module, admin-module -import {NgModule} from '@angular/core'; -import {CommonModule} from '@angular/common'; -import {FormsModule} from '@angular/forms'; - -import {AppComponent} from './app.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; -import {ComposeMessageComponent} from './compose-message/compose-message.component'; - -import {AppRoutingModule} from './app-routing.module'; -import {HeroesModule} from './heroes/heroes.module'; -import {CrisisCenterModule} from './crisis-center/crisis-center.module'; -// #enddocregion crisis-center-module - -import {AdminModule} from './admin/admin.module'; -// #docregion crisis-center-module - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - HeroesModule, - CrisisCenterModule, - // #enddocregion crisis-center-module - AdminModule, - // #docregion crisis-center-module - AppRoutingModule, - ], - declarations: [ - AppComponent, - // #enddocregion crisis-center-module - ComposeMessageComponent, - // #docregion crisis-center-module - PageNotFoundComponent, - ], - bootstrap: [AppComponent], -}) -export class AppModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/app.module.5.ts b/adev/src/content/examples/router/src/app/app.module.5.ts deleted file mode 100644 index dc9d82c3220b..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.5.ts +++ /dev/null @@ -1,30 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {CommonModule} from '@angular/common'; -import {FormsModule} from '@angular/forms'; - -import {AppComponent} from './app.component'; -import {AppRoutingModule} from './app-routing.module'; - -import {HeroesModule} from './heroes/heroes.module'; -import {CrisisCenterModule} from './crisis-center/crisis-center.module'; - -import {ComposeMessageComponent} from './compose-message/compose-message.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -import {AdminModule} from './admin/admin.module'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - HeroesModule, - CrisisCenterModule, - AdminModule, - AppRoutingModule, - ], - declarations: [AppComponent, ComposeMessageComponent, PageNotFoundComponent], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/adev/src/content/examples/router/src/app/app.module.6.ts b/adev/src/content/examples/router/src/app/app.module.6.ts deleted file mode 100644 index fd80e1100d2b..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.6.ts +++ /dev/null @@ -1,22 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {BrowserModule} from '@angular/platform-browser'; -import {FormsModule} from '@angular/forms'; -import {Routes, RouterModule} from '@angular/router'; - -import {AppComponent} from './app.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -const routes: Routes = []; - -@NgModule({ - imports: [ - BrowserModule, - FormsModule, - RouterModule.forRoot(routes, {useHash: true}), // .../#/crisis-center/ - ], - declarations: [AppComponent, PageNotFoundComponent], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/adev/src/content/examples/router/src/app/app.module.7.ts b/adev/src/content/examples/router/src/app/app.module.7.ts deleted file mode 100644 index e7bdcdbc2fc5..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.7.ts +++ /dev/null @@ -1,38 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {BrowserModule} from '@angular/platform-browser'; -import {FormsModule} from '@angular/forms'; -import {Router} from '@angular/router'; - -import {AppComponent} from './app.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; -import {ComposeMessageComponent} from './compose-message/compose-message.component'; - -import {AppRoutingModule} from './app-routing.module'; -import {HeroesModule} from './heroes/heroes.module'; -import {CrisisCenterModule} from './crisis-center/crisis-center.module'; -import {AuthModule} from './auth/auth.module'; - -@NgModule({ - imports: [ - BrowserModule, - FormsModule, - HeroesModule, - CrisisCenterModule, - AuthModule, - AppRoutingModule, - ], - declarations: [AppComponent, ComposeMessageComponent, PageNotFoundComponent], - bootstrap: [AppComponent], -}) -// #docregion inspect-config -export class AppModule { - // Diagnostic only: inspect router configuration - constructor(router: Router) { - // Use a custom replacer to display function names in the route configs - const replacer = (key, value) => (typeof value === 'function' ? value.name : value); - - console.log('Routes: ', JSON.stringify(router.config, replacer, 2)); - } -} -// #enddocregion inspect-config diff --git a/adev/src/content/examples/router/src/app/app.module.8.ts b/adev/src/content/examples/router/src/app/app.module.8.ts deleted file mode 100644 index 22e79fc69e4e..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.8.ts +++ /dev/null @@ -1,15 +0,0 @@ -import {BrowserModule} from '@angular/platform-browser'; -import {NgModule} from '@angular/core'; -import {AppRoutingModule} from './app-routing.module'; // CLI imports AppRoutingModule -import {AppComponent} from './app.component'; - -@NgModule({ - declarations: [AppComponent], - imports: [ - BrowserModule, - AppRoutingModule, // CLI adds AppRoutingModule to the AppModule's imports array - ], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/adev/src/content/examples/router/src/app/app.module.ts b/adev/src/content/examples/router/src/app/app.module.ts deleted file mode 100644 index 30c3f36f2adf..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.ts +++ /dev/null @@ -1,51 +0,0 @@ -// #docplaster -// #docregion auth, preload -import {NgModule} from '@angular/core'; -import {BrowserModule} from '@angular/platform-browser'; -import {FormsModule} from '@angular/forms'; -// #docregion animations-module -import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; - -// #enddocregion auth, animations-module -import {Router} from '@angular/router'; - -// #docregion auth -import {AppComponent} from './app.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; -import {ComposeMessageComponent} from './compose-message/compose-message.component'; - -import {AppRoutingModule} from './app-routing.module'; -import {HeroesModule} from './heroes/heroes.module'; -import {AuthModule} from './auth/auth.module'; - -// #docregion animations-module -@NgModule({ - imports: [ - // #enddocregion animations-module - BrowserModule, - // #docregion animations-module - BrowserAnimationsModule, - // #enddocregion animations-module - FormsModule, - HeroesModule, - AuthModule, - AppRoutingModule, - // #docregion animations-module - ], - // #enddocregion animations-module - declarations: [AppComponent, ComposeMessageComponent, PageNotFoundComponent], - bootstrap: [AppComponent], - // #docregion animations-module -}) -// #enddocregion animations-module -export class AppModule { - // #enddocregion preload, auth - // Diagnostic only: inspect router configuration - constructor(router: Router) { - // Use a custom replacer to display function names in the route configs - // const replacer = (key, value) => (typeof value === 'function') ? value.name : value; - // console.log('Routes: ', JSON.stringify(router.config, replacer, 2)); - } - // #docregion preload, auth -} -// #enddocregion preload, auth diff --git a/adev/src/content/examples/router/src/app/auth/auth-routing.module.ts b/adev/src/content/examples/router/src/app/auth/auth-routing.module.ts deleted file mode 100644 index d7d960da5140..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth-routing.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; -import {authGuard} from './auth.guard'; -import {AuthService} from './auth.service'; -import {LoginComponent} from './login/login.component'; - -const authRoutes: Routes = [{path: 'login', component: LoginComponent}]; - -@NgModule({ - imports: [RouterModule.forChild(authRoutes)], - exports: [RouterModule], -}) -export class AuthRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/auth/auth.guard.1.ts b/adev/src/content/examples/router/src/app/auth/auth.guard.1.ts deleted file mode 100644 index f8385d42d1e9..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth.guard.1.ts +++ /dev/null @@ -1,7 +0,0 @@ -// #docregion - -export const authGuard = () => { - console.log('authGuard#canActivate called'); - return true; -}; -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/auth/auth.guard.2.ts b/adev/src/content/examples/router/src/app/auth/auth.guard.2.ts deleted file mode 100644 index 124a66f4e380..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth.guard.2.ts +++ /dev/null @@ -1,19 +0,0 @@ -// #docregion -import {inject} from '@angular/core'; -import {Router} from '@angular/router'; - -import {AuthService} from './auth.service'; - -export const authGuard = () => { - const authService = inject(AuthService); - const router = inject(Router); - - if (authService.isLoggedIn) { - return true; - } - - // Redirect to the login page - return router.parseUrl('/login'); -}; - -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/auth/auth.guard.3.ts b/adev/src/content/examples/router/src/app/auth/auth.guard.3.ts deleted file mode 100644 index 981738d3d850..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth.guard.3.ts +++ /dev/null @@ -1,15 +0,0 @@ -import {inject} from '@angular/core'; -import {Router} from '@angular/router'; -import {AuthService} from './auth.service'; - -export const authGuard = () => { - const authService = inject(AuthService); - const router = inject(Router); - - if (authService.isLoggedIn) { - return true; - } - - // Redirect to the login page - return router.parseUrl('/login'); -}; diff --git a/adev/src/content/examples/router/src/app/auth/auth.guard.4.ts b/adev/src/content/examples/router/src/app/auth/auth.guard.4.ts deleted file mode 100644 index 6ad729821bda..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth.guard.4.ts +++ /dev/null @@ -1,27 +0,0 @@ -// #docplaster -// #docregion -import {inject} from '@angular/core'; -import {Router, NavigationExtras} from '@angular/router'; -import {AuthService} from './auth.service'; - -export const authGuard = () => { - const authService = inject(AuthService); - const router = inject(Router); - - if (authService.isLoggedIn) { - return true; - } - - // Create a dummy session id - const sessionId = 123456789; - - // Set our navigation extras object - // that contains our global query params and fragment - const navigationExtras: NavigationExtras = { - queryParams: {session_id: sessionId}, - fragment: 'anchor', - }; - - // Redirect to the login page with extras - return router.createUrlTree(['/login'], navigationExtras); -}; diff --git a/adev/src/content/examples/router/src/app/auth/auth.guard.ts b/adev/src/content/examples/router/src/app/auth/auth.guard.ts deleted file mode 100644 index 6e0bc6dfd1e0..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth.guard.ts +++ /dev/null @@ -1,26 +0,0 @@ -// #docplaster -import {inject} from '@angular/core'; -import {Router, NavigationExtras} from '@angular/router'; -import {AuthService} from './auth.service'; - -export const authGuard = () => { - const router = inject(Router); - const authService = inject(AuthService); - - if (authService.isLoggedIn) { - return true; - } - - // Create a dummy session id - const sessionId = 123456789; - - // Set our navigation extras object - // that contains our global query params and fragment - const navigationExtras: NavigationExtras = { - queryParams: {session_id: sessionId}, - fragment: 'anchor', - }; - - // Navigate to the login page with extras - return router.createUrlTree(['/login'], navigationExtras); -}; diff --git a/adev/src/content/examples/router/src/app/auth/auth.module.ts b/adev/src/content/examples/router/src/app/auth/auth.module.ts deleted file mode 100644 index b1ca22a44e4f..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import {NgModule} from '@angular/core'; -import {CommonModule} from '@angular/common'; -import {FormsModule} from '@angular/forms'; - -import {LoginComponent} from './login/login.component'; -import {AuthRoutingModule} from './auth-routing.module'; - -@NgModule({ - imports: [CommonModule, FormsModule, AuthRoutingModule], - declarations: [LoginComponent], -}) -export class AuthModule {} diff --git a/adev/src/content/examples/router/src/app/auth/auth.service.ts b/adev/src/content/examples/router/src/app/auth/auth.service.ts deleted file mode 100644 index 812cfc1ce260..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth.service.ts +++ /dev/null @@ -1,26 +0,0 @@ -// #docregion -import {Injectable} from '@angular/core'; - -import {Observable, of} from 'rxjs'; -import {tap, delay} from 'rxjs/operators'; - -@Injectable({ - providedIn: 'root', -}) -export class AuthService { - isLoggedIn = false; - - // store the URL so we can redirect after logging in - redirectUrl: string | null = null; - - login(): Observable { - return of(true).pipe( - delay(1000), - tap(() => (this.isLoggedIn = true)), - ); - } - - logout(): void { - this.isLoggedIn = false; - } -} diff --git a/adev/src/content/examples/router/src/app/auth/login/login.component.1.ts b/adev/src/content/examples/router/src/app/auth/login/login.component.1.ts deleted file mode 100644 index cc903e7cb173..000000000000 --- a/adev/src/content/examples/router/src/app/auth/login/login.component.1.ts +++ /dev/null @@ -1,46 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; -import {Router} from '@angular/router'; -import {AuthService} from '../auth.service'; - -@Component({ - selector: 'app-login', - templateUrl: './login.component.html', - styleUrls: ['./login.component.css'], - standalone: false, -}) -export class LoginComponent { - message: string; - - constructor( - public authService: AuthService, - public router: Router, - ) { - this.message = this.getMessage(); - } - - getMessage() { - return 'Logged ' + (this.authService.isLoggedIn ? 'in' : 'out'); - } - - login() { - this.message = 'Trying to log in ...'; - - this.authService.login().subscribe(() => { - this.message = this.getMessage(); - if (this.authService.isLoggedIn) { - // Usually you would use the redirect URL from the auth service. - // However to keep the example simple, we will always redirect to `/admin`. - const redirectUrl = '/admin'; - - // Redirect the user - this.router.navigate([redirectUrl]); - } - }); - } - - logout() { - this.authService.logout(); - this.message = this.getMessage(); - } -} diff --git a/adev/src/content/examples/router/src/app/auth/login/login.component.css b/adev/src/content/examples/router/src/app/auth/login/login.component.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/auth/login/login.component.html b/adev/src/content/examples/router/src/app/auth/login/login.component.html deleted file mode 100644 index e6de16fbf025..000000000000 --- a/adev/src/content/examples/router/src/app/auth/login/login.component.html +++ /dev/null @@ -1,6 +0,0 @@ -

    Login

    -

    {{ message }}

    -

    - - -

    diff --git a/adev/src/content/examples/router/src/app/auth/login/login.component.ts b/adev/src/content/examples/router/src/app/auth/login/login.component.ts deleted file mode 100644 index b6e2568054fc..000000000000 --- a/adev/src/content/examples/router/src/app/auth/login/login.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; -import {NavigationExtras, Router} from '@angular/router'; -import {AuthService} from '../auth.service'; - -@Component({ - selector: 'app-login', - templateUrl: './login.component.html', - styleUrls: ['./login.component.css'], - standalone: false, -}) -export class LoginComponent { - message: string; - - constructor( - public authService: AuthService, - public router: Router, - ) { - this.message = this.getMessage(); - } - - getMessage() { - return 'Logged ' + (this.authService.isLoggedIn ? 'in' : 'out'); - } - - login() { - this.message = 'Trying to log in ...'; - - this.authService.login().subscribe(() => { - this.message = this.getMessage(); - if (this.authService.isLoggedIn) { - // Usually you would use the redirect URL from the auth service. - // However to keep the example simple, we will always redirect to `/admin`. - const redirectUrl = '/admin'; - - // #docregion preserve - // Set our navigation extras object - // that passes on our global query params and fragment - const navigationExtras: NavigationExtras = { - queryParamsHandling: 'preserve', - preserveFragment: true, - }; - - // Redirect the user - this.router.navigate([redirectUrl], navigationExtras); - // #enddocregion preserve - } - }); - } - - logout() { - this.authService.logout(); - this.message = this.getMessage(); - } -} diff --git a/adev/src/content/examples/router/src/app/can-deactivate.guard.1.ts b/adev/src/content/examples/router/src/app/can-deactivate.guard.1.ts deleted file mode 100644 index bda85bfa8f3b..000000000000 --- a/adev/src/content/examples/router/src/app/can-deactivate.guard.1.ts +++ /dev/null @@ -1,25 +0,0 @@ -// #docregion -import {Observable} from 'rxjs'; -import {CanDeactivateFn, ActivatedRouteSnapshot, RouterStateSnapshot} from '@angular/router'; - -import {CrisisDetailComponent} from './crisis-center/crisis-detail/crisis-detail.component'; - -export const canDeactivateGuard: CanDeactivateFn = ( - component: CrisisDetailComponent, - route: ActivatedRouteSnapshot, - state: RouterStateSnapshot, -): Observable | boolean => { - // Get the Crisis Center ID - console.log(route.paramMap.get('id')); - - // Get the current URL - console.log(state.url); - - // Allow synchronous navigation (`true`) if no crisis or the crisis is unchanged - if (!component.crisis || component.crisis.name === component.editName) { - return true; - } - // Otherwise ask the user with the dialog service and return its - // observable which resolves to true or false when the user decides - return component.dialogService.confirm('Discard changes?'); -}; diff --git a/adev/src/content/examples/router/src/app/can-deactivate.guard.ts b/adev/src/content/examples/router/src/app/can-deactivate.guard.ts deleted file mode 100644 index 44cd7c3b78df..000000000000 --- a/adev/src/content/examples/router/src/app/can-deactivate.guard.ts +++ /dev/null @@ -1,11 +0,0 @@ -// #docregion -import {CanDeactivateFn} from '@angular/router'; -import {Observable} from 'rxjs'; - -export interface CanComponentDeactivate { - canDeactivate?: () => Observable | Promise | boolean; -} - -export const canDeactivateGuard: CanDeactivateFn = ( - component: CanComponentDeactivate, -) => (component.canDeactivate ? component.canDeactivate() : true); diff --git a/adev/src/content/examples/router/src/app/compose-message/compose-message.component.css b/adev/src/content/examples/router/src/app/compose-message/compose-message.component.css deleted file mode 100644 index c7db9a077e1e..000000000000 --- a/adev/src/content/examples/router/src/app/compose-message/compose-message.component.css +++ /dev/null @@ -1,6 +0,0 @@ -textarea { - width: 100%; - margin-top: 1rem; - font-size: 1.2rem; - box-sizing: border-box; -} diff --git a/adev/src/content/examples/router/src/app/compose-message/compose-message.component.html b/adev/src/content/examples/router/src/app/compose-message/compose-message.component.html deleted file mode 100644 index cf8e9fdd8d09..000000000000 --- a/adev/src/content/examples/router/src/app/compose-message/compose-message.component.html +++ /dev/null @@ -1,17 +0,0 @@ - -

    Contact Crisis Center

    -
    - {{ details }} -
    -
    -
    - -
    -
    - -
    -
    -

    - - -

    diff --git a/adev/src/content/examples/router/src/app/compose-message/compose-message.component.ts b/adev/src/content/examples/router/src/app/compose-message/compose-message.component.ts deleted file mode 100644 index 5de0eb73a7bd..000000000000 --- a/adev/src/content/examples/router/src/app/compose-message/compose-message.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; -import {ActivatedRoute, Router} from '@angular/router'; - -@Component({ - selector: 'app-compose-message', - templateUrl: './compose-message.component.html', - styleUrls: ['./compose-message.component.css'], - standalone: false, -}) -export class ComposeMessageComponent { - details = ''; - message = ''; - sending = false; - - constructor( - private router: Router, - private route: ActivatedRoute, - ) {} - - send() { - this.sending = true; - this.details = 'Sending Message...'; - - setTimeout(() => { - this.sending = false; - this.closePopup(); - }, 1000); - } - - cancel() { - this.closePopup(); - } - - // #docregion closePopup - closePopup() { - // Providing a `null` value to the named outlet - // clears the contents of the named outlet - this.router.navigate([{outlets: {popup: null}}], {relativeTo: this.route.parent}); - } - // #enddocregion closePopup -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.css b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.html b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.html deleted file mode 100644 index 430dd849421b..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.html +++ /dev/null @@ -1 +0,0 @@ -

    Welcome to the Crisis Center

    diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.ts deleted file mode 100644 index a16093be3bff..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-crisis-center-home', - templateUrl: './crisis-center-home.component.html', - styleUrls: ['./crisis-center-home.component.css'], - standalone: false, -}) -export class CrisisCenterHomeComponent {} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.1.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.1.ts deleted file mode 100644 index 3f95c482395f..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.1.ts +++ /dev/null @@ -1,41 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {CrisisCenterHomeComponent} from './crisis-center-home/crisis-center-home.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {CrisisCenterComponent} from './crisis-center/crisis-center.component'; -import {CrisisDetailComponent} from './crisis-detail/crisis-detail.component'; - -// #docregion routes -const crisisCenterRoutes: Routes = [ - { - path: 'crisis-center', - component: CrisisCenterComponent, - children: [ - { - path: '', - component: CrisisListComponent, - children: [ - { - path: ':id', - component: CrisisDetailComponent, - }, - { - path: '', - component: CrisisCenterHomeComponent, - }, - ], - }, - ], - }, -]; -// #enddocregion routes - -@NgModule({ - imports: [RouterModule.forChild(crisisCenterRoutes)], - exports: [RouterModule], -}) -export class CrisisCenterRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.2.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.2.ts deleted file mode 100644 index a3e798fe058b..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.2.ts +++ /dev/null @@ -1,43 +0,0 @@ -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {CrisisCenterHomeComponent} from './crisis-center-home/crisis-center-home.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {CrisisCenterComponent} from './crisis-center/crisis-center.component'; -import {CrisisDetailComponent} from './crisis-detail/crisis-detail.component'; - -import {canDeactivateGuard} from '../can-deactivate.guard'; -import {crisisDetailResolver} from './crisis-detail-resolver'; - -const crisisCenterRoutes: Routes = [ - { - path: 'crisis-center', - component: CrisisCenterComponent, - children: [ - { - path: '', - component: CrisisListComponent, - children: [ - { - path: ':id', - component: CrisisDetailComponent, - canDeactivate: [canDeactivateGuard], - resolve: { - crisis: crisisDetailResolver, - }, - }, - { - path: '', - component: CrisisCenterHomeComponent, - }, - ], - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(crisisCenterRoutes)], - exports: [RouterModule], -}) -export class CrisisCenterRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.3.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.3.ts deleted file mode 100644 index 330fe90524f7..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.3.ts +++ /dev/null @@ -1,39 +0,0 @@ -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {CrisisCenterHomeComponent} from './crisis-center-home/crisis-center-home.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {CrisisCenterComponent} from './crisis-center/crisis-center.component'; -import {CrisisDetailComponent} from './crisis-detail/crisis-detail.component'; - -import {canDeactivateGuard} from '../can-deactivate.guard'; - -const crisisCenterRoutes: Routes = [ - { - path: 'crisis-center', - component: CrisisCenterComponent, - children: [ - { - path: '', - component: CrisisListComponent, - children: [ - { - path: ':id', - component: CrisisDetailComponent, - canDeactivate: [canDeactivateGuard], - }, - { - path: '', - component: CrisisCenterHomeComponent, - }, - ], - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(crisisCenterRoutes)], - exports: [RouterModule], -}) -export class CrisisCenterRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.4.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.4.ts deleted file mode 100644 index 659238786a71..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.4.ts +++ /dev/null @@ -1,46 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {CrisisCenterHomeComponent} from './crisis-center-home/crisis-center-home.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {CrisisCenterComponent} from './crisis-center/crisis-center.component'; -import {CrisisDetailComponent} from './crisis-detail/crisis-detail.component'; - -import {canDeactivateGuard} from '../can-deactivate.guard'; -import {crisisDetailResolver} from './crisis-detail-resolver'; - -const crisisCenterRoutes: Routes = [ - { - path: 'crisis-center', - component: CrisisCenterComponent, - children: [ - { - path: '', - component: CrisisListComponent, - children: [ - { - path: ':id', - component: CrisisDetailComponent, - canDeactivate: [canDeactivateGuard], - resolve: { - crisis: crisisDetailResolver, - }, - }, - { - path: '', - component: CrisisCenterHomeComponent, - }, - ], - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(crisisCenterRoutes)], - exports: [RouterModule], -}) -export class CrisisCenterRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.ts deleted file mode 100644 index 4012954c594a..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.ts +++ /dev/null @@ -1,46 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {CrisisCenterHomeComponent} from './crisis-center-home/crisis-center-home.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {CrisisCenterComponent} from './crisis-center/crisis-center.component'; -import {CrisisDetailComponent} from './crisis-detail/crisis-detail.component'; - -import {canDeactivateGuard} from '../can-deactivate.guard'; -import {crisisDetailResolver} from './crisis-detail-resolver'; - -const crisisCenterRoutes: Routes = [ - { - path: '', - component: CrisisCenterComponent, - children: [ - { - path: '', - component: CrisisListComponent, - children: [ - { - path: ':id', - component: CrisisDetailComponent, - canDeactivate: [canDeactivateGuard], - resolve: { - crisis: crisisDetailResolver, - }, - }, - { - path: '', - component: CrisisCenterHomeComponent, - }, - ], - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(crisisCenterRoutes)], - exports: [RouterModule], -}) -export class CrisisCenterRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center.module.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center.module.ts deleted file mode 100644 index ec2ce678f890..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {FormsModule} from '@angular/forms'; -import {CommonModule} from '@angular/common'; - -import {CrisisCenterHomeComponent} from './crisis-center-home/crisis-center-home.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {CrisisCenterComponent} from './crisis-center/crisis-center.component'; -import {CrisisDetailComponent} from './crisis-detail/crisis-detail.component'; - -import {CrisisCenterRoutingModule} from './crisis-center-routing.module'; - -@NgModule({ - imports: [CommonModule, FormsModule, CrisisCenterRoutingModule], - declarations: [ - CrisisCenterComponent, - CrisisListComponent, - CrisisCenterHomeComponent, - CrisisDetailComponent, - ], -}) -export class CrisisCenterModule {} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.css b/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.html b/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.html deleted file mode 100644 index 5aace465b544..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.html +++ /dev/null @@ -1,2 +0,0 @@ -

    Crisis Center

    - diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.ts deleted file mode 100644 index 6986363d5b49..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-crisis-center', - templateUrl: './crisis-center.component.html', - styleUrls: ['./crisis-center.component.css'], - standalone: false, -}) -export class CrisisCenterComponent {} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail-resolver.1.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-detail-resolver.1.ts deleted file mode 100644 index 9d4fe02e319b..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail-resolver.1.ts +++ /dev/null @@ -1,3 +0,0 @@ -// #docregion - -export function crisisDetailResolver() {} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail-resolver.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-detail-resolver.ts deleted file mode 100644 index cc505380f414..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail-resolver.ts +++ /dev/null @@ -1,26 +0,0 @@ -// #docregion -import {inject} from '@angular/core'; -import {ActivatedRouteSnapshot, ResolveFn, Router} from '@angular/router'; -import {EMPTY, of} from 'rxjs'; -import {mergeMap} from 'rxjs/operators'; - -import {Crisis} from './crisis'; -import {CrisisService} from './crisis.service'; - -export const crisisDetailResolver: ResolveFn = (route: ActivatedRouteSnapshot) => { - const router = inject(Router); - const cs = inject(CrisisService); - const id = route.paramMap.get('id')!; - - return cs.getCrisis(id).pipe( - mergeMap((crisis) => { - if (crisis) { - return of(crisis); - } else { - // id not found - router.navigate(['/crisis-center']); - return EMPTY; - } - }), - ); -}; diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.1.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.1.ts deleted file mode 100644 index d33a043848bf..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.1.ts +++ /dev/null @@ -1,68 +0,0 @@ -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute, Router, ParamMap} from '@angular/router'; -import {Observable} from 'rxjs'; -import {switchMap} from 'rxjs/operators'; - -import {CrisisService} from '../crisis.service'; -import {Crisis} from '../crisis'; -import {DialogService} from '../../dialog.service'; - -@Component({ - selector: 'app-crisis-detail', - templateUrl: './crisis-detail.component.html', - styleUrls: ['./crisis-detail.component.css'], - standalone: false, -}) -export class CrisisDetailComponent implements OnInit { - crisis!: Crisis; - editName = ''; - - constructor( - private service: CrisisService, - private router: Router, - private route: ActivatedRoute, - public dialogService: DialogService, - ) {} - - ngOnInit() { - this.route.paramMap - .pipe(switchMap((params: ParamMap) => this.service.getCrisis(params.get('id')!))) - .subscribe((crisis: Crisis) => { - if (crisis) { - this.editName = crisis.name; - this.crisis = crisis; - } else { - // id not found - this.gotoCrises(); - } - }); - } - - cancel() { - this.gotoCrises(); - } - - save() { - this.crisis.name = this.editName; - this.gotoCrises(); - } - - canDeactivate(): Observable | boolean { - // Allow synchronous navigation (`true`) if no crisis or the crisis is unchanged - if (!this.crisis || this.crisis.name === this.editName) { - return true; - } - // Otherwise ask the user with the dialog service and return its - // observable which resolves to true or false when the user decides - return this.dialogService.confirm('Discard changes?'); - } - - gotoCrises() { - const crisisId = this.crisis ? this.crisis.id : null; - // Pass along the crisis id if available - // so that the CrisisListComponent can select that crisis. - // Add a totally useless `foo` parameter for kicks. - // Relative navigation back to the crises - this.router.navigate(['../', {id: crisisId, foo: 'foo'}], {relativeTo: this.route}); - } -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.css b/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.css deleted file mode 100644 index 226dbc122391..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.css +++ /dev/null @@ -1,8 +0,0 @@ -h2 { - font-size: 1.5rem; -} - -input { - font-size: 1rem; - margin-top: 1rem; -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.html b/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.html deleted file mode 100644 index fdf83841d579..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.html +++ /dev/null @@ -1,10 +0,0 @@ -
    -

    {{ editName }}

    -

    Id: {{ crisis.id }}

    - - -
    - - -
    -
    diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.ts deleted file mode 100644 index a1d99871873c..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.ts +++ /dev/null @@ -1,69 +0,0 @@ -// #docplaster -// #docregion -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute, Router} from '@angular/router'; -import {Observable} from 'rxjs'; - -import {Crisis} from '../crisis'; -import {DialogService} from '../../dialog.service'; - -@Component({ - selector: 'app-crisis-detail', - templateUrl: './crisis-detail.component.html', - styleUrls: ['./crisis-detail.component.css'], - standalone: false, -}) -export class CrisisDetailComponent implements OnInit { - crisis!: Crisis; - editName = ''; - - constructor( - private route: ActivatedRoute, - private router: Router, - public dialogService: DialogService, - ) {} - - // #docregion ngOnInit - ngOnInit() { - this.route.data.subscribe((data) => { - const crisis: Crisis = data['crisis']; - this.editName = crisis.name; - this.crisis = crisis; - }); - } - // #enddocregion ngOnInit - - // #docregion cancel-save - cancel() { - this.gotoCrises(); - } - - save() { - this.crisis.name = this.editName; - this.gotoCrises(); - } - // #enddocregion cancel-save - - // #docregion canDeactivate - canDeactivate(): Observable | boolean { - // Allow synchronous navigation (`true`) if no crisis or the crisis is unchanged - if (!this.crisis || this.crisis.name === this.editName) { - return true; - } - // Otherwise ask the user with the dialog service and return its - // observable which resolves to true or false when the user decides - return this.dialogService.confirm('Discard changes?'); - } - // #enddocregion canDeactivate - - gotoCrises() { - const crisisId = this.crisis ? this.crisis.id : null; - // Pass along the crisis id if available - // so that the CrisisListComponent can select that crisis. - // Add a totally useless `foo` parameter for kicks. - // #docregion gotoCrises-navigate - // Relative navigation back to the crises - this.router.navigate(['../', {id: crisisId, foo: 'foo'}], {relativeTo: this.route}); - // #enddocregion gotoCrises-navigate - } -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.1.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.1.ts deleted file mode 100644 index ae1f54e5ea9e..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.1.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute, ParamMap} from '@angular/router'; - -import {CrisisService} from '../crisis.service'; -import {Crisis} from '../crisis'; -import {Observable} from 'rxjs'; -import {switchMap} from 'rxjs/operators'; - -@Component({ - selector: 'app-crisis-list', - templateUrl: './crisis-list.component.html', - styleUrls: ['./crisis-list.component.css'], - standalone: false, -}) -export class CrisisListComponent implements OnInit { - crises$!: Observable; - selectedId = 0; - - constructor( - private service: CrisisService, - private route: ActivatedRoute, - ) {} - - ngOnInit() { - this.crises$ = this.route.paramMap.pipe( - switchMap((params: ParamMap) => { - this.selectedId = parseInt(params.get('id')!, 10); - return this.service.getCrises(); - }), - ); - } -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.css b/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.css deleted file mode 100644 index ac8af4cf1485..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.css +++ /dev/null @@ -1,64 +0,0 @@ -/* CrisisListComponent's private CSS styles */ -.crises { - margin: 0 0 2em 0; - list-style-type: none; - padding: 0; -} - -.crises li { - position: relative; - cursor: pointer; -} - -.crises li:hover { - left: 0.1em; -} - -.crises a { - color: black; - text-decoration: none; - display: block; - background-color: #eee; - margin: 0.5em 0; - border-radius: 4px; - line-height: 2rem; -} - -@media (min-width: 600px) { - .crises a { - font-size: 1.2rem; - padding: 0.5em 0; - line-height: 1.4rem; - } -} - -.crises a:hover { - color: #2c3a41; - background-color: #e6e6e6; - left: 0.1em; -} - -.crises .selected a { - background: #d6e6f7; -} - -.crises .selected a:hover { - background-color: #bdd7f5; -} - -.heroes .selected a { - background-color: #d6e6f7; -} - -.heroes .selected a:hover { - background-color: #bdd7f5; -} - -.crises .badge { - padding: 0.5em 0.6em; - color: white; - background-color: #435b60; - min-width: 16px; - margin-right: 0.8em; - border-radius: 4px 0 0 4px; -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.html b/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.html deleted file mode 100644 index 4a45de6b2e17..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.ts deleted file mode 100644 index 4ce0117e56a7..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute} from '@angular/router'; - -import {CrisisService} from '../crisis.service'; -import {Crisis} from '../crisis'; -import {Observable} from 'rxjs'; -import {switchMap} from 'rxjs/operators'; - -@Component({ - selector: 'app-crisis-list', - templateUrl: './crisis-list.component.html', - styleUrls: ['./crisis-list.component.css'], - standalone: false, -}) -export class CrisisListComponent implements OnInit { - crises$?: Observable; - selectedId = 0; - - constructor( - private service: CrisisService, - private route: ActivatedRoute, - ) {} - - ngOnInit() { - this.crises$ = this.route.firstChild?.paramMap.pipe( - switchMap((params) => { - this.selectedId = parseInt(params.get('id')!, 10); - return this.service.getCrises(); - }), - ); - } -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis.service.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis.service.ts deleted file mode 100644 index 27d1a20fb7c2..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis.service.ts +++ /dev/null @@ -1,38 +0,0 @@ -// #docplaster -// #docregion -import {BehaviorSubject} from 'rxjs'; -import {map} from 'rxjs/operators'; - -import {Injectable} from '@angular/core'; -import {MessageService} from '../message.service'; -import {Crisis} from './crisis'; -import {CRISES} from './mock-crises'; - -@Injectable({ - providedIn: 'root', -}) -export class CrisisService { - static nextCrisisId = 100; - private crises$: BehaviorSubject = new BehaviorSubject(CRISES); - - constructor(private messageService: MessageService) {} - - getCrises() { - return this.crises$; - } - - getCrisis(id: number | string) { - return this.getCrises().pipe(map((crises) => crises.find((crisis) => crisis.id === +id)!)); - } - - // #enddocregion - addCrisis(name: string) { - name = name.trim(); - if (name) { - const crisis = {id: CrisisService.nextCrisisId++, name}; - CRISES.push(crisis); - this.crises$.next(CRISES); - } - } - // #docregion -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis.ts deleted file mode 100644 index c7fc032be471..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface Crisis { - id: number; - name: string; -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/mock-crises.ts b/adev/src/content/examples/router/src/app/crisis-center/mock-crises.ts deleted file mode 100644 index 52c5574bc3b0..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/mock-crises.ts +++ /dev/null @@ -1,9 +0,0 @@ -// #docregion -import {Crisis} from './crisis'; - -export const CRISES: Crisis[] = [ - {id: 1, name: 'Dragon Burning Cities'}, - {id: 2, name: 'Sky Rains Great White Sharks'}, - {id: 3, name: 'Giant Asteroid Heading For Earth'}, - {id: 4, name: 'Procrastinators Meeting Delayed Again'}, -]; diff --git a/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.css b/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.html b/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.html deleted file mode 100644 index aabd2a641e79..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.html +++ /dev/null @@ -1,2 +0,0 @@ -

    CRISIS CENTER

    -

    Get your crisis here

    diff --git a/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.ts b/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.ts deleted file mode 100644 index b12ec3394932..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Initial empty version -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-crisis-list', - templateUrl: './crisis-list.component.1.html', - styleUrls: ['./crisis-list.component.1.css'], - standalone: false, -}) -export class CrisisListComponent {} diff --git a/adev/src/content/examples/router/src/app/dialog.service.ts b/adev/src/content/examples/router/src/app/dialog.service.ts deleted file mode 100644 index 9152f3ae419f..000000000000 --- a/adev/src/content/examples/router/src/app/dialog.service.ts +++ /dev/null @@ -1,23 +0,0 @@ -// #docregion -import {Injectable} from '@angular/core'; -import {Observable, of} from 'rxjs'; - -/** - * Async modal dialog service - * DialogService makes this app easier to test by faking this service. - * TODO: better modal implementation that doesn't use window.confirm - */ -@Injectable({ - providedIn: 'root', -}) -export class DialogService { - /** - * Ask user to confirm an action. `message` explains the action and choices. - * Returns observable resolving to `true`=confirm or `false`=cancel - */ - confirm(message?: string): Observable { - const confirmation = window.confirm(message || 'Is it OK?'); - - return of(confirmation); - } -} diff --git a/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.css b/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.html b/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.html deleted file mode 100644 index f1d912d5a945..000000000000 --- a/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.html +++ /dev/null @@ -1,6 +0,0 @@ - -

    HEROES

    -

    Get your heroes here

    - - - diff --git a/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.ts b/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.ts deleted file mode 100644 index cc9c678b54bc..000000000000 --- a/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.ts +++ /dev/null @@ -1,10 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-hero-list', - templateUrl: './hero-list.component.1.html', - styleUrls: ['./hero-list.component.1.css'], - standalone: false, -}) -export class HeroListComponent {} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.1.ts b/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.1.ts deleted file mode 100644 index 70540a02dd8f..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.1.ts +++ /dev/null @@ -1,39 +0,0 @@ -// #docplaster -// #docregion -import {switchMap} from 'rxjs/operators'; -import {Component, OnInit} from '@angular/core'; -import {Observable} from 'rxjs'; -// #docregion imports -import {Router, ActivatedRoute, ParamMap} from '@angular/router'; -// #enddocregion imports - -import {HeroService} from '../hero.service'; -import {Hero} from '../hero'; - -@Component({ - selector: 'app-hero-detail', - templateUrl: './hero-detail.component.html', - styleUrls: ['./hero-detail.component.css'], - standalone: false, -}) -export class HeroDetailComponent implements OnInit { - hero$!: Observable; - - constructor( - private route: ActivatedRoute, - private router: Router, - private service: HeroService, - ) {} - - ngOnInit() { - this.hero$ = this.route.paramMap.pipe( - switchMap((params: ParamMap) => this.service.getHero(params.get('id')!)), - ); - } - - // #docregion gotoHeroes - gotoHeroes() { - this.router.navigate(['/heroes']); - } - // #enddocregion gotoHeroes -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.2.ts b/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.2.ts deleted file mode 100644 index 86a844fb907c..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.2.ts +++ /dev/null @@ -1,36 +0,0 @@ -// Snapshot version -// #docregion -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute, Router} from '@angular/router'; -import {Observable} from 'rxjs'; - -import {HeroService} from '../hero.service'; -import {Hero} from '../hero'; - -@Component({ - selector: 'app-hero-detail', - templateUrl: './hero-detail.component.html', - styleUrls: ['./hero-detail.component.css'], - standalone: false, -}) -export class HeroDetailComponent implements OnInit { - hero$!: Observable; - - constructor( - private route: ActivatedRoute, - private router: Router, - private service: HeroService, - ) {} - - // #docregion snapshot - ngOnInit() { - const id = this.route.snapshot.paramMap.get('id')!; - - this.hero$ = this.service.getHero(id); - } - // #enddocregion snapshot - - gotoHeroes() { - this.router.navigate(['/heroes']); - } -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.3.ts b/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.3.ts deleted file mode 100644 index 20a40ec6318f..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.3.ts +++ /dev/null @@ -1,47 +0,0 @@ -// #docplaster -// #docregion -// #docregion rxjs-operator-import -import {switchMap} from 'rxjs/operators'; -// #enddocregion rxjs-operator-import -import {Component, OnInit} from '@angular/core'; -import {Router, ActivatedRoute, ParamMap} from '@angular/router'; -import {Observable} from 'rxjs'; - -import {HeroService} from '../hero.service'; -import {Hero} from '../hero'; - -@Component({ - selector: 'app-hero-detail', - templateUrl: './hero-detail.component.html', - styleUrls: ['./hero-detail.component.css'], - standalone: false, -}) -export class HeroDetailComponent implements OnInit { - hero$!: Observable; - - // #docregion ctor - constructor( - private route: ActivatedRoute, - private router: Router, - private service: HeroService, - ) {} - // #enddocregion ctor - - // #docregion ngOnInit - ngOnInit() { - this.hero$ = this.route.paramMap.pipe( - switchMap((params: ParamMap) => this.service.getHero(params.get('id')!)), - ); - } - // #enddocregion ngOnInit - - // #docregion gotoHeroes - gotoHeroes(hero: Hero) { - const heroId = hero ? hero.id : null; - // Pass along the hero id if available - // so that the HeroList component can select that hero. - // Include a junk 'foo' property for fun. - this.router.navigate(['/heroes', {id: heroId, foo: 'foo'}]); - } - // #enddocregion gotoHeroes -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.4.ts b/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.4.ts deleted file mode 100644 index b965f14a3c85..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.4.ts +++ /dev/null @@ -1,38 +0,0 @@ -// #docplaster -// #docregion -import {Component, Input, OnInit} from '@angular/core'; -import {Router} from '@angular/router'; -import {Observable} from 'rxjs'; - -import {Hero} from '../hero'; -import {HeroService} from '../hero.service'; - -@Component({ - selector: 'app-hero-detail', - templateUrl: './hero-detail.component.html', - styleUrls: ['./hero-detail.component.css'], - standalone: false, -}) -export class HeroDetailComponent { - hero$!: Observable; - - constructor( - private router: Router, - private service: HeroService, - ) {} - - // #docregion id-input - @Input() - set id(heroId: string) { - this.hero$ = this.service.getHero(heroId); - } - // #enddocregion id-input - - gotoHeroes(hero: Hero) { - const heroId = hero ? hero.id : null; - // Pass along the hero id if available - // so that the HeroList component can select that hero. - // Include a junk 'foo' property for fun. - this.router.navigate(['/superheroes', {id: heroId, foo: 'foo'}]); - } -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.css b/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.css deleted file mode 100644 index 8f1e21cbe3b7..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.css +++ /dev/null @@ -1,8 +0,0 @@ -button { - margin-top: 1rem; -} - -label { - display: block; - margin-bottom: .5rem; -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.html b/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.html deleted file mode 100644 index c57347518309..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.html +++ /dev/null @@ -1,8 +0,0 @@ -

    Heroes

    -
    -

    {{ hero.name }}

    -

    Id: {{ hero.id }}

    - - - -
    diff --git a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.ts b/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.ts deleted file mode 100644 index d9a33bde4164..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.ts +++ /dev/null @@ -1,41 +0,0 @@ -// #docplaster -// #docregion -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute, ParamMap, Router} from '@angular/router'; -import {Observable} from 'rxjs'; -import {switchMap} from 'rxjs/operators'; - -import {Hero} from '../hero'; -import {HeroService} from '../hero.service'; - -@Component({ - selector: 'app-hero-detail', - templateUrl: './hero-detail.component.html', - styleUrls: ['./hero-detail.component.css'], - standalone: false, -}) -export class HeroDetailComponent implements OnInit { - hero$!: Observable; - - constructor( - private route: ActivatedRoute, - private router: Router, - private service: HeroService, - ) {} - - ngOnInit() { - this.hero$ = this.route.paramMap.pipe( - switchMap((params: ParamMap) => this.service.getHero(params.get('id')!)), - ); - } - - // #docregion redirect - gotoHeroes(hero: Hero) { - const heroId = hero ? hero.id : null; - // Pass along the hero id if available - // so that the HeroList component can select that hero. - // Include a junk 'foo' property for fun. - this.router.navigate(['/superheroes', {id: heroId, foo: 'foo'}]); - } - // #enddocregion redirect -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.1.html b/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.1.html deleted file mode 100644 index afee4814ff65..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.1.html +++ /dev/null @@ -1,14 +0,0 @@ -

    Heroes

    - - - diff --git a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.1.ts b/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.1.ts deleted file mode 100644 index dd550a372821..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.1.ts +++ /dev/null @@ -1,22 +0,0 @@ -// TODO: Feature Componentized like HeroCenter -import {Component, OnInit} from '@angular/core'; -import {Observable} from 'rxjs'; - -import {HeroService} from '../hero.service'; -import {Hero} from '../hero'; - -@Component({ - selector: 'app-hero-list', - templateUrl: './hero-list.component.1.html', - styleUrls: ['./hero-list.component.css'], - standalone: false, -}) -export class HeroListComponent implements OnInit { - heroes$!: Observable; - - constructor(private service: HeroService) {} - - ngOnInit() { - this.heroes$ = this.service.getHeroes(); - } -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.css b/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.css deleted file mode 100644 index 606deceae537..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.css +++ /dev/null @@ -1,55 +0,0 @@ -/* HeroListComponent's private CSS styles */ -.heroes { - margin: 0 0 2em 0; - list-style-type: none; - padding: 0; - width: 100%; -} -.heroes li { - position: relative; - cursor: pointer; -} - -.heroes li:hover { - left: .1em; -} - -.heroes a { - color: black; - text-decoration: none; - display: block; - font-size: 1.2rem; - background-color: #eee; - margin: .5rem .5rem .5rem 0; - padding: .5rem 0; - border-radius: 4px; -} - -.heroes a:hover { - color: #2c3a41; - background-color: #e6e6e6; -} - -.heroes a:active { - background-color: #525252; - color: #fafafa; -} - -/* #docregion selected */ -.heroes .selected a { - background-color: #d6e6f7; -} - -.heroes .selected a:hover { - background-color: #bdd7f5; -} -/* #enddocregion selected */ - -.heroes .badge { - padding: .5em .6em; - color: white; - background-color: #435b60; - min-width: 16px; - margin-right: .8em; - border-radius: 4px 0 0 4px; -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.html b/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.html deleted file mode 100644 index ebaa0ef826d8..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.html +++ /dev/null @@ -1,10 +0,0 @@ -

    Heroes

    - - - diff --git a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.ts b/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.ts deleted file mode 100644 index 5efb2940b34d..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.ts +++ /dev/null @@ -1,43 +0,0 @@ -// #docplaster -// #docregion -// TODO: Feature Componentized like CrisisCenter -// #docregion rxjs-imports -import {Observable} from 'rxjs'; -import {switchMap} from 'rxjs/operators'; -// #enddocregion rxjs-imports -import {Component, OnInit} from '@angular/core'; -// #docregion import-router -import {ActivatedRoute} from '@angular/router'; -// #enddocregion import-router - -import {HeroService} from '../hero.service'; -import {Hero} from '../hero'; - -@Component({ - selector: 'app-hero-list', - templateUrl: './hero-list.component.html', - styleUrls: ['./hero-list.component.css'], - standalone: false, -}) -// #docregion ctor -export class HeroListComponent implements OnInit { - heroes$!: Observable; - selectedId = 0; - - constructor( - private service: HeroService, - private route: ActivatedRoute, - ) {} - - ngOnInit() { - this.heroes$ = this.route.paramMap.pipe( - switchMap((params) => { - this.selectedId = parseInt(params.get('id')!, 10); - return this.service.getHeroes(); - }), - ); - } - // #enddocregion ctor - // #docregion ctor -} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/heroes/hero.service.ts b/adev/src/content/examples/router/src/app/heroes/hero.service.ts deleted file mode 100644 index 42de800487d7..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero.service.ts +++ /dev/null @@ -1,29 +0,0 @@ -// #docregion -import {Injectable} from '@angular/core'; - -import {Observable, of} from 'rxjs'; -import {map} from 'rxjs/operators'; - -import {Hero} from './hero'; -import {HEROES} from './mock-heroes'; -import {MessageService} from '../message.service'; - -@Injectable({ - providedIn: 'root', -}) -export class HeroService { - constructor(private messageService: MessageService) {} - - getHeroes(): Observable { - // TODO: send the message _after_ fetching the heroes - this.messageService.add('HeroService: fetched heroes'); - return of(HEROES); - } - - getHero(id: number | string) { - return this.getHeroes().pipe( - // (+) before `id` turns the string into a number - map((heroes: Hero[]) => heroes.find((hero) => hero.id === +id)!), - ); - } -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero.ts b/adev/src/content/examples/router/src/app/heroes/hero.ts deleted file mode 100644 index a61b497759b7..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface Hero { - id: number; - name: string; -} diff --git a/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.1.ts b/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.1.ts deleted file mode 100644 index d461936f6480..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.1.ts +++ /dev/null @@ -1,20 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {HeroListComponent} from './hero-list/hero-list.component'; -import {HeroDetailComponent} from './hero-detail/hero-detail.component'; - -const heroesRoutes: Routes = [ - {path: 'heroes', component: HeroListComponent}, - // #docregion hero-detail-route - {path: 'hero/:id', component: HeroDetailComponent}, - // #enddocregion hero-detail-route -]; - -@NgModule({ - imports: [RouterModule.forChild(heroesRoutes)], - exports: [RouterModule], -}) -export class HeroesRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.2.ts b/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.2.ts deleted file mode 100644 index 48c2eba9a7d5..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.2.ts +++ /dev/null @@ -1,18 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {HeroListComponent} from './hero-list/hero-list.component'; -import {HeroDetailComponent} from './hero-detail/hero-detail.component'; - -const heroesRoutes: Routes = [ - {path: 'heroes', component: HeroListComponent, data: {animation: 'heroes'}}, - {path: 'hero/:id', component: HeroDetailComponent, data: {animation: 'hero'}}, -]; - -@NgModule({ - imports: [RouterModule.forChild(heroesRoutes)], - exports: [RouterModule], -}) -export class HeroesRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.ts b/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.ts deleted file mode 100644 index 98483828dd1a..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {HeroListComponent} from './hero-list/hero-list.component'; -import {HeroDetailComponent} from './hero-detail/hero-detail.component'; - -const heroesRoutes: Routes = [ - {path: 'heroes', redirectTo: '/superheroes'}, - {path: 'hero/:id', redirectTo: '/superhero/:id'}, - {path: 'superheroes', component: HeroListComponent, data: {animation: 'heroes'}}, - {path: 'superhero/:id', component: HeroDetailComponent, data: {animation: 'hero'}}, -]; - -@NgModule({ - imports: [RouterModule.forChild(heroesRoutes)], - exports: [RouterModule], -}) -export class HeroesRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/heroes/heroes.module.ts b/adev/src/content/examples/router/src/app/heroes/heroes.module.ts deleted file mode 100644 index 310a6f571615..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/heroes.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import {NgModule} from '@angular/core'; -import {CommonModule} from '@angular/common'; -import {FormsModule} from '@angular/forms'; - -import {HeroListComponent} from './hero-list/hero-list.component'; -import {HeroDetailComponent} from './hero-detail/hero-detail.component'; - -import {HeroesRoutingModule} from './heroes-routing.module'; - -@NgModule({ - imports: [CommonModule, FormsModule, HeroesRoutingModule], - declarations: [HeroListComponent, HeroDetailComponent], -}) -export class HeroesModule {} diff --git a/adev/src/content/examples/router/src/app/heroes/mock-heroes.ts b/adev/src/content/examples/router/src/app/heroes/mock-heroes.ts deleted file mode 100644 index 8761b672e728..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/mock-heroes.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {Hero} from './hero'; - -export const HEROES: Hero[] = [ - {id: 12, name: 'Dr. Nice'}, - {id: 13, name: 'Bombasto'}, - {id: 14, name: 'Celeritas'}, - {id: 15, name: 'Magneta'}, - {id: 16, name: 'RubberMan'}, - {id: 17, name: 'Dynama'}, - {id: 18, name: 'Dr. IQ'}, - {id: 19, name: 'Magma'}, - {id: 20, name: 'Tornado'}, -]; diff --git a/adev/src/content/examples/router/src/app/message.service.ts b/adev/src/content/examples/router/src/app/message.service.ts deleted file mode 100644 index 63f8dcfd8eb5..000000000000 --- a/adev/src/content/examples/router/src/app/message.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -import {Injectable} from '@angular/core'; - -@Injectable({ - providedIn: 'root', -}) -export class MessageService { - messages: string[] = []; - - add(message: string) { - this.messages.push(message); - } - - clear() { - this.messages = []; - } -} diff --git a/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.css b/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.html b/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.html deleted file mode 100644 index 6c581c4fc8ee..000000000000 --- a/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.html +++ /dev/null @@ -1 +0,0 @@ -

    Page not found

    \ No newline at end of file diff --git a/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.ts b/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.ts deleted file mode 100644 index 72bee1fb645e..000000000000 --- a/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-page-not-found', - templateUrl: './page-not-found.component.html', - styleUrls: ['./page-not-found.component.css'], - standalone: false, -}) -export class PageNotFoundComponent {} diff --git a/adev/src/content/examples/router/src/app/selective-preloading-strategy.service.ts b/adev/src/content/examples/router/src/app/selective-preloading-strategy.service.ts deleted file mode 100644 index 71c9254a0ae1..000000000000 --- a/adev/src/content/examples/router/src/app/selective-preloading-strategy.service.ts +++ /dev/null @@ -1,25 +0,0 @@ -// #docregion -import {Injectable} from '@angular/core'; -import {PreloadingStrategy, Route} from '@angular/router'; -import {Observable, of} from 'rxjs'; - -@Injectable({ - providedIn: 'root', -}) -export class SelectivePreloadingStrategyService implements PreloadingStrategy { - preloadedModules: string[] = []; - - preload(route: Route, load: () => Observable): Observable { - if (route.canMatch === undefined && route.data?.['preload'] && route.path != null) { - // add the route path to the preloaded module array - this.preloadedModules.push(route.path); - - // log the route path to the console - console.log('Preloaded: ' + route.path); - - return load(); - } else { - return of(null); - } - } -} diff --git a/adev/src/content/examples/schematics-for-libraries/projects/my-lib/schematics/my-service/schema.json b/adev/src/content/examples/schematics-for-libraries/projects/my-lib/schematics/my-service/schema.json index 672069b27fa8..5409153a867c 100644 --- a/adev/src/content/examples/schematics-for-libraries/projects/my-lib/schematics/my-service/schema.json +++ b/adev/src/content/examples/schematics-for-libraries/projects/my-lib/schematics/my-service/schema.json @@ -12,7 +12,10 @@ "type": "string", "format": "path", "description": "The path to create the service.", - "visible": false + "visible": false, + "$default": { + "$source": "workingDirectory" + } }, "project": { "type": "string", diff --git a/adev/src/content/examples/testing/src/app/banner/banner-initial.component.spec.ts b/adev/src/content/examples/testing/src/app/banner/banner-initial.component.spec.ts index b55febd2784c..1d9c687b8a62 100755 --- a/adev/src/content/examples/testing/src/app/banner/banner-initial.component.spec.ts +++ b/adev/src/content/examples/testing/src/app/banner/banner-initial.component.spec.ts @@ -90,7 +90,7 @@ describe('BannerComponent (with beforeEach)', () => { // #enddocregion v4-test-3 // #docregion v4-test-4 - it('should find the

    with fixture.debugElement.nativeElement)', () => { + it('should find the

    with fixture.debugElement.nativeElement', () => { // #docregion debugElement-nativeElement const bannerDe: DebugElement = fixture.debugElement; const bannerEl: HTMLElement = bannerDe.nativeElement; diff --git a/adev/src/content/guide/components/inputs.md b/adev/src/content/guide/components/inputs.md index 2716253cd481..9c4425fce07b 100644 --- a/adev/src/content/guide/components/inputs.md +++ b/adev/src/content/guide/components/inputs.md @@ -232,7 +232,7 @@ export class MediaControls { } ``` -In the example above, the `CustomSlider` can write values into its `value` model input, which then propagates those values back to the `volume` property in `MediaControls`. This binding keeps that values of `value` and `volume` in sync. +In the example above, the `CustomSlider` can write values into its `value` model input, which then propagates those values back to the `volume` property in `MediaControls`. This binding keeps the values of `value` and `volume` in sync. ### Implicit `change` events diff --git a/adev/src/content/guide/components/lifecycle.md b/adev/src/content/guide/components/lifecycle.md index e95fc7b9106d..c2285a425781 100644 --- a/adev/src/content/guide/components/lifecycle.md +++ b/adev/src/content/guide/components/lifecycle.md @@ -261,7 +261,7 @@ export class UserProfile { // Use the `Write` phase to write to a geometric property. write: () => { const padding = computePadding(); - const changed = padding !== prevPadding; + const changed = padding !== this.prevPadding; if (changed) { nativeElement.style.padding = padding; } diff --git a/adev/src/content/guide/components/programmatic-rendering.md b/adev/src/content/guide/components/programmatic-rendering.md index 52eb65267d5f..9975fae62f3a 100644 --- a/adev/src/content/guide/components/programmatic-rendering.md +++ b/adev/src/content/guide/components/programmatic-rendering.md @@ -117,10 +117,11 @@ JavaScript [dynamic import](https://developer.mozilla.org/docs/Web/JavaScript/Re ` }) export class AdminSettings { - advancedSettings: {new(): AdminSettings} | undefined; + advancedSettings: {new(): AdvancedSettings} | undefined; async loadAdvanced() { - this.advancedSettings = await import('path/to/advanced_settings.js'); + const { AdvancedSettings } = await import('path/to/advanced_settings.js'); + this.advancedSettings = AdvancedSettings; } } ``` diff --git a/adev/src/content/guide/di/creating-injectable-service.md b/adev/src/content/guide/di/creating-injectable-service.md index eaea5fc21fbc..0fbb6711d16a 100644 --- a/adev/src/content/guide/di/creating-injectable-service.md +++ b/adev/src/content/guide/di/creating-injectable-service.md @@ -33,14 +33,15 @@ Services can depend on other services. For example, here's a `HeroService` that depends on the `Logger` service, and also uses `BackendService` to get heroes. That service in turn might depend on the `HttpClient` service to fetch heroes asynchronously from a server: - + +import { inject } from "@angular/core"; + export class HeroService { private heroes: Hero[] = []; - constructor( - private backend: BackendService, - private logger: Logger) {} + private backend = inject(BackendService); + private logger = inject(Logger); async getHeroes() { // Fetch @@ -100,16 +101,28 @@ For clarity and maintainability, it is recommended that you define components an ## Injecting services -To inject a service as a dependency into a component, you can use the component's `constructor()` and supply a constructor argument with the dependency type. +To inject a service as a dependency into a component, you can declare a class field representing the dependency and use Angular's `inject` function to initialize it. -The following example specifies the `HeroService` in the `HeroListComponent` constructor. +The following example specifies the `HeroService` in the `HeroListComponent`. The type of `heroService` is `HeroService`. Angular recognizes the `HeroService` type as a dependency, since that class was previously annotated with the `@Injectable` decorator: - - constructor(heroService: HeroService) + +import { inject } from "@angular/core"; + +export class HeroListComponent { + private heroService = inject(HeroService); +} + + +It is also possible to inject a service into a component using the component's constructor: + + + constructor(private heroService: HeroService) +The `inject` method can be used in both classes and functions, while the constructor method can naturally only be used in a class constructor. However, in either case a dependency may only be injected in a valid [injection context](guide/di/dependency-injection-context), usually in the construction or initialization of a component. + ## Injecting services in other services When a service depends on another service, follow the same pattern as injecting into a component. @@ -117,7 +130,7 @@ In the following example, `HeroService` depends on a `Logger` service to report -import { Injectable } from '@angular/core'; +import { inject, Injectable } from '@angular/core'; import { HEROES } from './mock-heroes'; import { Logger } from '../logger.service'; @@ -125,7 +138,7 @@ import { Logger } from '../logger.service'; providedIn: 'root', }) export class HeroService { - constructor(private logger: Logger) {} + private logger = inject(Logger); getHeroes() { this.logger.log('Getting heroes.'); diff --git a/adev/src/content/guide/directives/overview.md b/adev/src/content/guide/directives/overview.md index 9c223f4858a1..5e59ce2ce6c2 100644 --- a/adev/src/content/guide/directives/overview.md +++ b/adev/src/content/guide/directives/overview.md @@ -69,6 +69,8 @@ These steps are not necessary to implement `ngClass`. ## Setting inline styles with `NgStyle` +HELPFUL: To add or remove a _single_ style, use [style bindings](guide/templates/binding#css-class-and-style-property-bindings) rather than `NgStyle`. + ### Import `NgStyle` in the component To use `NgStyle`, add it to the component's `imports` list. diff --git a/adev/src/content/guide/forms/overview.md b/adev/src/content/guide/forms/overview.md index 60a3ea327d3d..88d64454ddf8 100644 --- a/adev/src/content/guide/forms/overview.md +++ b/adev/src/content/guide/forms/overview.md @@ -110,7 +110,7 @@ The view-to-model diagram shows how data flows when an input field's value is ch ```mermaid flowchart TB U{User} - I("") + I("<input>") CVA(ControlValueAccessor) FC(FormControl) O(Observers) @@ -130,14 +130,14 @@ The model-to-view diagram shows how a programmatic change to the model is propag ```mermaid flowchart TB U{User} - I() + I("<input>") CVA(ControlValueAccessor) FC(FormControl) O(Observers) U-->|"Calls setValue() on the FormControl"|FC FC-->|Notifies the ControlValueAccessor|CVA FC-.->|Fires a 'valueChanges' event to observers|O - CVA-->|"Updates the value of the "|I + CVA-->|"Updates the value of the <input>"|I ``` ### Data flow in template-driven forms @@ -157,7 +157,7 @@ The view-to-model diagram shows how data flows when an input field's value is ch ```mermaid flowchart TB U{User} - I() + I("<input>") CVA(ControlValueAccessor) FC(FormControl) M(NgModel) @@ -207,7 +207,7 @@ flowchart TB FC2(FormControl) O(Observers) CVA(ControlValueAccessor) - I("") + I("<input>") FC2-.->|Fires a 'valueChanges' event to observers|O O-->|ControlValueAccessor receives valueChanges event|CVA CVA-->|Sets the value in the control|I diff --git a/adev/src/content/guide/hybrid-rendering.md b/adev/src/content/guide/hybrid-rendering.md index 38ce6643ae53..8db63ebf99c9 100644 --- a/adev/src/content/guide/hybrid-rendering.md +++ b/adev/src/content/guide/hybrid-rendering.md @@ -65,28 +65,31 @@ export const serverRoutes: ServerRoute[] = [ ]; ``` -You can add this config to your application using the [`provideServerRoutesConfig`](api/ssr/provideServerRoutesConfig 'API reference') function. +You can add this config to your application using the [`provideServerRouting`](api/ssr/provideServerRouting 'API reference') function. ```typescript -import { provideServerRoutesConfig } from '@angular/ssr'; +import { provideServerRouting } from '@angular/ssr'; import { serverRoutes } from './app.routes.server'; // app.config.server.ts const serverConfig: ApplicationConfig = { providers: [ provideServerRendering(), - provideServerRoutesConfig(serverRoutes), + provideServerRouting(serverRoutes), // ... other providers ... ] }; ``` -When using the [App shell pattern](ecosystem/service-workers/app-shell), you must specify the route to be used as the app shell for client-side rendered routes. To do this, provide an options object with the `appShellRoute` property to [`provideServerRoutesConfig`](api/ssr/provideServerRoutesConfig 'API reference'): +When using the [App shell pattern](ecosystem/service-workers/app-shell), you must specify the route to be used as the app shell for client-side rendered routes. To do this, provide an options object with the `appShellRoute` property to [`provideServerRouting`](api/ssr/provideServerRouting 'API reference'): ```typescript +import { provideServerRouting, withAppShell } from '@angular/ssr'; +import { AppShellComponent } from './app-shell/app-shell.component'; + const serverConfig: ApplicationConfig = { providers: [ - provideServerRoutesConfig(serverRoutes, { appShellRoute: 'shell' }), + provideServerRouting(serverRoutes, withAppShell(AppShellComponent)), // ... other providers ... ] }; diff --git a/adev/src/content/guide/i18n/add-package.md b/adev/src/content/guide/i18n/add-package.md index f26fffd6984b..325c565b4aa5 100644 --- a/adev/src/content/guide/i18n/add-package.md +++ b/adev/src/content/guide/i18n/add-package.md @@ -6,9 +6,10 @@ To add the `@angular/localize` package, use the following command to update the -It adds `types: ["@angular/localize"]` in the TypeScript configuration files as well as the reference to the type definition of `@angular/localize` at the top of the `main.ts` file. +It adds `types: ["@angular/localize"]` in the TypeScript configuration files. +It also adds line `/// ` at the top of the `main.ts` file which is the reference to the type definition. -HELPFUL: For more information about `package.json` and `tsconfig.json` files, see [Workspace npm dependencies][GuideNpmPackages] and [TypeScript Configuration][GuideTsConfig]. +HELPFUL: For more information about `package.json` and `tsconfig.json` files, see [Workspace npm dependencies][GuideNpmPackages] and [TypeScript Configuration][GuideTsConfig]. To learn about Triple-slash Directives visit [Typescript Handbook](https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html#-reference-types-). If `@angular/localize` is not installed and you try to build a localized version of your project (for example, while using the `i18n` attributes in templates), the [Angular CLI][CliMain] will generate an error, which would contain the steps that you can take to enable i18n for your project. diff --git a/adev/src/content/guide/i18n/locale-id.md b/adev/src/content/guide/i18n/locale-id.md index e298075a1682..949dd974596a 100644 --- a/adev/src/content/guide/i18n/locale-id.md +++ b/adev/src/content/guide/i18n/locale-id.md @@ -47,7 +47,18 @@ By default, Angular uses `en-US` as the source locale of your project. To change the source locale of your project for the build, complete the following actions. 1. Open the [`angular.json`][GuideWorkspaceConfig] workspace build configuration file. -1. Change the source locale in the `sourceLocale` field. +2. Add or modify the `sourceLocale` field inside the `i18n` section: +```json +{ + "projects": { + "your-project": { + "i18n": { + "sourceLocale": "ca" // Use your desired locale code + } + } + } +} +``` ## What's next diff --git a/adev/src/content/guide/incremental-hydration.md b/adev/src/content/guide/incremental-hydration.md index 6ba5a5534449..a11a7e638e25 100644 --- a/adev/src/content/guide/incremental-hydration.md +++ b/adev/src/content/guide/incremental-hydration.md @@ -6,7 +6,7 @@ Tip: Incremental hydration is currently in [developer preview](/reference/releas ## Why use incremental hydration? -Incremental hydration is a performance improvement that builds on top of full application hydration. It can produce smaller initial bundles while still providing an end-user experience that is comparable to a full application hydration experience. Smaller bundles improve initial load times, reducing [First Input Delay (FID)](<(https://web.dev/fid)>) and [Cumulative Layout Shift (CLS)](https://web.dev/cls). +Incremental hydration is a performance improvement that builds on top of full application hydration. It can produce smaller initial bundles while still providing an end-user experience that is comparable to a full application hydration experience. Smaller bundles improve initial load times, reducing [First Input Delay (FID)](https://web.dev/fid) and [Cumulative Layout Shift (CLS)](https://web.dev/cls). Incremental hydration also lets you use deferrable views (`@defer`) for content that may not have been deferrable before. Specifically, you can now use deferrable views for content that is above the fold. Prior to incremental hydration, putting a `@defer` block above the fold would result in placeholder content rendering and then being replaced by the `@defer` block's main template content. This would result in a layout shift. Incremental hydration means the main template of the `@defer` block will render with no layout shift on hydration. diff --git a/adev/src/content/guide/performance/overview.md b/adev/src/content/guide/performance/overview.md index 1c9488da3021..1f9fec2d327b 100644 --- a/adev/src/content/guide/performance/overview.md +++ b/adev/src/content/guide/performance/overview.md @@ -7,5 +7,5 @@ One of the top priorities of any developer is ensuring that their application is | Guides Types | Description | | :---------------------------------------- | :--------------------------------------------------------------------------------------------------------- | | [Server-side rendering](/guide/ssr) | Learn how to leverage rendering pages on the server to improve load times. | -| [Build-time prerendering](/guide/prerendering) | Also known as static-side generation (SSG), is an alternate rendering method to improve load times. | +| [Build-time prerendering](/guide/prerendering) | Also known as static-site generation (SSG), is an alternate rendering method to improve load times. | | [Hydration](/guide/hydration) | A process to improve application performance by restoring its state after server-side rendering and reusing existing DOM structure as much as possible. | diff --git a/adev/src/content/guide/security.md b/adev/src/content/guide/security.md index e49f904e147c..6ad5dffac345 100644 --- a/adev/src/content/guide/security.md +++ b/adev/src/content/guide/security.md @@ -1,6 +1,6 @@ # Security -This topic describes Angular's built-in protections against common web-application vulnerabilities and attacks such as cross-site scripting attacks. +This topic describes Angular's built-in protections against common web application vulnerabilities and attacks such as cross-site scripting attacks. It doesn't cover application-level security, such as authentication and authorization. For more information about the attacks and mitigations described below, see the [Open Web Application Security Project (OWASP) Guide](https://www.owasp.org/index.php/Category:OWASP_Guide_Project). @@ -9,7 +9,7 @@ For more information about the attacks and mitigations described below, see the -Angular is part of Google [Open Source Software Vulnerability Reward Program](https://bughunters.google.com/about/rules/6521337925468160/google-open-source-software-vulnerability-reward-program-rules). [For vulnerabilities in Angular, please submit your report at https://bughunters.google.com](https://bughunters.google.com/report). +Angular is part of Google [Open Source Software Vulnerability Reward Program](https://bughunters.google.com/about/rules/6521337925468160/google-open-source-software-vulnerability-reward-program-rules). For vulnerabilities in Angular, please submit your report at [https://bughunters.google.com](https://bughunters.google.com/report). For more information about how Google handles security issues, see [Google's security philosophy](https://www.google.com/about/appsecurity). @@ -53,8 +53,8 @@ For this reason, it is strongly encouraged to take advantage of these features. *Sanitization* is the inspection of an untrusted value, turning it into a value that's safe to insert into the DOM. In many cases, sanitization doesn't change a value at all. -Sanitization depends on context: -A value that's harmless in CSS is potentially dangerous in a URL. +Sanitization depends on a context. +For example, a value that's harmless in CSS is potentially dangerous in a URL. Angular defines the following security contexts: @@ -95,7 +95,7 @@ Avoid directly interacting with the DOM and instead use Angular templates where For cases where this is unavoidable, use the built-in Angular sanitization functions. Sanitize untrusted values with the [DomSanitizer.sanitize](api/platform-browser/DomSanitizer#sanitize) method and the appropriate `SecurityContext`. -That function also accepts values that were marked as trusted using the `bypassSecurityTrust` … functions, and does not sanitize them, as [described below](#trusting-safe-values). +That function also accepts values that were marked as trusted using the `bypassSecurityTrust` functions, and does not sanitize them, as [described below](#trusting-safe-values). ### Trusting safe values diff --git a/adev/src/content/guide/signals/linked-signal.md b/adev/src/content/guide/signals/linked-signal.md index d1ab6f18b05c..8a3c00e83cef 100644 --- a/adev/src/content/guide/signals/linked-signal.md +++ b/adev/src/content/guide/signals/linked-signal.md @@ -16,7 +16,7 @@ export class ShippingMethodPicker { this.selectedOption.set(this.shippingOptions()[newOptionIndex]); } } -``` +``` In this example, the `selectedOption` defaults to the first option, but changes if the user selects another option. But `shippingOptions` is a signal— its value may change! If `shippingOptions` changes, `selectedOption` may contain a value that is no longer a valid option. @@ -62,7 +62,7 @@ In the example above, `selectedOption` always updates back to the first option w @Component({/* ... */}) export class ShippingMethodPicker { shippingOptions: Signal = getShippingOptions(); - + selectedOption = linkedSignal({ // `selectedOption` is set to the `computation` result whenever this `source` changes. source: this.shippingOptions, @@ -70,7 +70,7 @@ export class ShippingMethodPicker { // If the newOptions contain the previously selected option, preserve that selection. // Otherwise, default to the first option. return newOptions.find(opt => opt.id === previous?.value?.id) ?? newOptions[0]; - } + } }); changeShipping(newOptionIndex: number) { @@ -87,23 +87,20 @@ The `computation` is a function that receives the new value of `source` and a `p ## Custom equality comparison -`linkedSignal` updates to the result of the computation every time its linked state changes. By default, Angular uses referential equality to determine if the linked state has changed. You can alternatively provide a custom equality function. +`linkedSignal`, as any other signal, can be configured with a custom equality function. This function is used by downstream dependencies to determine if that value of the `linkedSignal` (result of a computation) changed: ```typescript -const activeUser = signal({id: 123, name: 'Morgan'}); -const email = linkedSignal(() => `${activeUser().name}@example.com`, { +const activeUser = signal({id: 123, name: 'Morgan', isAdmin: true}); + +const activeUserEditCopy = linkedSignal(() => activeUser(), { // Consider the user as the same if it's the same `id`. equal: (a, b) => a.id === b.id, }); // Or, if separating `source` and `computation` -const alternateEmail = linkedSignal({ +const activeUserEditCopy = linkedSignal({ source: activeUser, - computation: user => `${user.name}@example.com`, + computation: user => user, equal: (a, b) => a.id === b.id, }); - -// This update to `activeUser` does not cause `email` or `alternateEmail` -// to update because the `id` is the same. -activeUser.set({id: 123, name: 'Morgan', isAdmin: false}); ``` diff --git a/adev/src/content/guide/ssr.md b/adev/src/content/guide/ssr.md index 9f2f711b0e4a..d093f0dded3a 100644 --- a/adev/src/content/guide/ssr.md +++ b/adev/src/content/guide/ssr.md @@ -45,7 +45,7 @@ Note: In Angular v17 and later, `server.ts` is no longer used by `ng serve`. The The `server.ts` file configures a Node.js Express server and Angular server-side rendering. `CommonEngine` is used to render an Angular application. - + Angular CLI will scaffold an initial server implementation focused on server-side rendering your Angular application. This server can be extended to support other features such as API routes, redirects, static assets, and more. See [Express documentation](https://expressjs.com/) for more details. diff --git a/adev/src/content/guide/templates/control-flow.md b/adev/src/content/guide/templates/control-flow.md index 861d9247abcd..735b8a31a64c 100644 --- a/adev/src/content/guide/templates/control-flow.md +++ b/adev/src/content/guide/templates/control-flow.md @@ -50,6 +50,8 @@ A typical `@for` loop looks like: } ``` +Angular's `@for` block does not support flow-modifying statements like JavaScript's `continue` or `break`. + ### Why is `track` in `@for` blocks important? The `track` expression allows Angular to maintain a relationship between your data and the DOM nodes on the page. This allows Angular to optimize performance by executing the minimum necessary DOM operations when the data changes. diff --git a/adev/src/content/guide/templates/expression-syntax.md b/adev/src/content/guide/templates/expression-syntax.md index 0091a4ca735a..03ae18b5db16 100644 --- a/adev/src/content/guide/templates/expression-syntax.md +++ b/adev/src/content/guide/templates/expression-syntax.md @@ -8,21 +8,22 @@ Angular supports a subset of [literal values](https://developer.mozilla.org/en-U ### Supported value literals -| Literal type | Example values | -| ------------ | ------------------------------- | -| String | `'Hello'`, `"World"` | -| Boolean | `true`, `false` | -| Number | `123`, `3.14` | -| Object | `{name: 'Alice'}` | -| Array | `['Onion', 'Cheese', 'Garlic']` | -| null | `null` | +| Literal type | Example values | +| ---------------- | ------------------------------- | +| String | `'Hello'`, `"World"` | +| Boolean | `true`, `false` | +| Number | `123`, `3.14` | +| Object | `{name: 'Alice'}` | +| Array | `['Onion', 'Cheese', 'Garlic']` | +| null | `null` | +| Template string | `` `Hello ${name}` `` | ### Unsupported literals -| Literal type | Example value | -| --------------- | --------------------- | -| Template string | `` `Hello ${name}` `` | -| RegExp | `/\d+/` | +| Literal type | Example value | +| ------------------------ | ------------------------- | +| RegExp | `/\d+/` | +| Tagged template string | `` tag`Hello ${name}` `` | ## Globals diff --git a/adev/src/content/guide/templates/pipes.md b/adev/src/content/guide/templates/pipes.md index 40cd296da2dd..0caaa06f7486 100644 --- a/adev/src/content/guide/templates/pipes.md +++ b/adev/src/content/guide/templates/pipes.md @@ -260,7 +260,7 @@ export class MyCustomTransformationPipe implements PipeTransform { if (format === 'uppercase') { return msg.toUpperCase() - else { + } else { return msg } } diff --git a/adev/src/content/guide/templates/two-way-binding.md b/adev/src/content/guide/templates/two-way-binding.md index 610b0911755e..c3380685614e 100644 --- a/adev/src/content/guide/templates/two-way-binding.md +++ b/adev/src/content/guide/templates/two-way-binding.md @@ -36,7 +36,7 @@ To use two-way binding with native form controls, you need to: 1. Use the `ngModel` directive with the two-way binding syntax (e.g., `[(ngModel)]`) 1. Assign it the state that you want it to update (e.g., `firstName`) -Once that is setup, Angular will ensure that any updates in the text input will reflect correctly inside of the component state! +Once that is set up, Angular will ensure that any updates in the text input will reflect correctly inside of the component state! Learn more about [`NgModel`](guide/directives#displaying-and-updating-properties-with-ngmodel) in the official docs. diff --git a/adev/src/content/guide/testing/component-harnesses-overview.md b/adev/src/content/guide/testing/component-harnesses-overview.md new file mode 100644 index 000000000000..0887ef536190 --- /dev/null +++ b/adev/src/content/guide/testing/component-harnesses-overview.md @@ -0,0 +1,30 @@ +# Component harnesses overview + +A component harness is a class that allows tests to interact with components the way an end user does via a supported API. You can create test harnesses for any component, ranging from small reusable widgets to full pages. + +Harnesses offer several benefits: +- They make tests less brittle by insulating themselves against implementation details of a component, such as its DOM structure +- They make tests become more readable and easier to maintain +- They can be used across multiple testing environments + + +// Example of test with a harness for a component called MyButtonComponent +it('should load button with exact text', async () => { + const button = await loader.getHarness(MyButtonComponentHarness); + expect(await button.getText()).toBe('Confirm'); +}); + + +Component harnesses are especially useful for shared UI widgets. Developers often write tests that depend on private implementation details of widgets, such as DOM structure and CSS classes. Those dependencies make tests brittle and hard to maintain. Harnesses offer an alternative— a supported API that interacts with the widget the same way an end-user does. Widget implementation changes now become less likely to break user tests. For example, [Angular Material](https://material.angular.io/components/categories) provides a test harness for each component in the library. + +Component harnesses support multiple testing environments. You can use the same harness implementation in both unit and end-to-end tests. Test authors only need to learn one API and component authors don't have to maintain separate unit and end-to-end test implementations. + +Many developers can be categorized by one of the following developer type categories: test authors, component harness authors, and harness environment authors. Use the table below to find the most relevant section in this guide based on these categories: + +| Developer Type | Description | Relevant Section | +|:--- | :--- | :--- | +| Test Authors | Developers that use component harnesses written by someone else to test their application. For example, this could be an app developer who uses a third-party menu component and needs to interact with the menu in a unit test. | [Using component harnesses in tests](guide/testing/using-component-harnesses) | +| Component harness authors | Developers who maintain some reusable Angular components and want to create a test harness for its users to use in their tests. For example, an author of a third party Angular component library or a developer who maintains a set of common components for a large Angular application. | [Creating component harnesses for your components](guide/testing/creating-component-harnesses ) | +| Harness environment authors | Developers who want to add support for using component harnesses in additional testing environments. For information on supported testing environments out-of-the-box, see the [test harness environments and loaders](guide/testing/using-component-harnesses#test-harness-environments-and-loaders). | [Adding support for additional testing environments](guide/testing/component-harnesses-testing-environments) | + +For the full API reference, please see the [Angular CDK's component harness API reference page](https://material.angular.io/cdk/testing/api). diff --git a/adev/src/content/guide/testing/component-harnesses-testing-environments.md b/adev/src/content/guide/testing/component-harnesses-testing-environments.md new file mode 100644 index 000000000000..9ada0c8eabfa --- /dev/null +++ b/adev/src/content/guide/testing/component-harnesses-testing-environments.md @@ -0,0 +1,59 @@ +# Adding harness support for additional testing environments + +## Before you start + +Tip: This guide assumes you've already read the [component harnesses overview guide](guide/testing/component-harnesses-overview). Read that first if you're new to using component harnesses. + +### When does adding support for a test environment make sense? + +To use component harnesses in the following environments, you can use Angular CDK's two built-in environments: +- Unit tests +- WebDriver end-to-end tests + +To use a supported testing environment, read the [Creating harnesses for your components guide](guide/testing/creating-component-harnesses). + +Otherwise, to add support for other environments, you need to define how to interact with a DOM element and how DOM interactions work in your environment. Continue reading to learn more. + +### CDK Installation + +The [Component Dev Kit (CDK)](https://material.angular.io/cdk/categories) is a set of behavior primitives for building components. To use the component harnesses, first install `@angular/cdk` from npm. You can do this from your terminal using the Angular CLI: + + + ng add @angular/cdk + + +## Creating a `TestElement` implementation + +Every test environment must define a `TestElement` implementation. The `TestElement` interface serves as an environment-agnostic representation of a DOM element. It enables harnesses to interact with DOM elements regardless of the underlying environment. Because some environments don't support interacting with DOM elements synchronously (e.g. WebDriver), all `TestElement` methods are asynchronous, returning a `Promise` with the result of the operation. + +`TestElement` offers a number of methods to interact with the underlying DOM such as `blur()`, `click()`, `getAttribute()`, and more. See the [TestElement API reference page](https://material.angular.io/cdk/testing/api#TestElement) for the full list of methods. + +The `TestElement` interface consists largely of methods that resemble methods available on `HTMLElement`. Similar methods exist in most test environments, which makes implementing the methods fairly straightforward. However, one important difference to note when implementing the `sendKeys` method, is that the key codes in the `TestKey` enum likely differ from the key codes used in the test environment. Environment authors should maintain a mapping from `TestKey` codes to the codes used in the particular testing environment. + +The [UnitTestElement](https://github.com/angular/components/blob/main/src/cdk/testing/testbed/unit-test-element.ts#L33) and [SeleniumWebDriverElement](https://github.com/angular/components/blob/main/src/cdk/testing/selenium-webdriver/selenium-webdriver-keys.ts#L16) implementations in Angular CDK serve as good examples of implementations of this interface. + +## Creating a `HarnessEnvironment` implementation +Test authors use `HarnessEnvironment` to create component harness instances for use in tests. `HarnessEnvironment` is an abstract class that must be extended to create a concrete subclass for the new environment. When supporting a new test environment, create a `HarnessEnvironment` subclass that adds concrete implementations for all abstract members. + +`HarnessEnvironment` has a generic type parameter: `HarnessEnvironment`. This parameter, `E`, represents the raw element type of the environment. For example, this parameter is Element for unit test environments. + +The following are the abstract methods that must be implemented: + +| Method | Description | +|:--- | :--- | +| `abstract getDocumentRoot(): E` | Gets the root element for the environment (e.g. `document.body`). | +| `abstract createTestElement(element: E): TestElement` | Creates a `TestElement` for the given raw element. | +| `abstract createEnvironment(element: E): HarnessEnvironment` | Creates a `HarnessEnvironment` rooted at the given raw element. | +| `abstract getAllRawElements(selector: string): Promise` | Gets all of the raw elements under the root element of the environment matching the given selector. | +| `abstract forceStabilize(): Promise` | Gets a `Promise` that resolves when the `NgZone` is stable. Additionally, if applicable, tells `NgZone` to stabilize (e.g. calling `flush()` in a `fakeAsync` test). | +| `abstract waitForTasksOutsideAngular(): Promise` | Gets a `Promise` that resolves when the parent zone of `NgZone` is stable. | + +In addition to implementing the missing methods, this class should provide a way for test authors to get `ComponentHarness` instances. You should define a protected constructor and provide a static method called `loader` that returns a `HarnessLoader` instance. This allows test authors to write code like: `SomeHarnessEnvironment.loader().getHarness(...)`. Depending on the needs of the particular environment, the class may provide several different static methods or require arguments to be passed. (e.g. the `loader` method on `TestbedHarnessEnvironment` takes a `ComponentFixture`, and the class provides additional static methods called `documentRootLoader` and `harnessForFixture`). + +The [`TestbedHarnessEnvironment`](https://github.com/angular/components/blob/main/src/cdk/testing/testbed/testbed-harness-environment.ts#L89) and [SeleniumWebDriverHarnessEnvironment](https://github.com/angular/components/blob/main/src/cdk/testing/selenium-webdriver/selenium-web-driver-harness-environment.ts#L71) implementations in Angular CDK serve as good examples of implementations of this interface. + +## Handling auto change detection +In order to support the `manualChangeDetection` and parallel APIs, your environment should install a handler for the auto change detection status. + +When your environment wants to start handling the auto change detection status it can call `handleAutoChangeDetectionStatus(handler)`. The handler function will receive a `AutoChangeDetectionStatus` which has two properties `isDisabled` and `onDetectChangesNow()`. See the [AutoChangeDetectionStatus API reference page](https://material.angular.io/cdk/testing/api#AutoChangeDetectionStatus) for more information. +If your environment wants to stop handling auto change detection status it can call `stopHandlingAutoChangeDetectionStatus()`. diff --git a/adev/src/content/guide/testing/components-scenarios.md b/adev/src/content/guide/testing/components-scenarios.md index 14b3bfb5b6da..abdcd6d8df59 100644 --- a/adev/src/content/guide/testing/components-scenarios.md +++ b/adev/src/content/guide/testing/components-scenarios.md @@ -83,7 +83,7 @@ The first test shows the benefit of automatic change detection. The second and third test reveal an important limitation. The Angular testing environment does not run change detection synchronously when updates happen inside the test case that changed the component's `title`. -The test must call `await fixture.whenStable` to wait for another of change detection. +The test must call `await fixture.whenStable` to wait for another round of change detection. HELPFUL: Angular does not know about direct updates to values that are not signals. The easiest way to ensure that change detection will be scheduled is to use signals for values read in the template. @@ -554,7 +554,7 @@ It confirms that the selected `DashboardHeroComponent` hero really does find its A *routing component* is a component that tells the `Router` to navigate to another component. The `DashboardComponent` is a *routing component* because the user can navigate to the `HeroDetailComponent` by clicking on one of the *hero buttons* on the dashboard. -Angular provides test helpers to reduce boilerplate and more effectively test code which depends HttpClient. The `provideRouter` function can be used directly in the test module as well. +Angular provides test helpers to reduce boilerplate and more effectively test code which depends on `HttpClient`. The `provideRouter` function can be used directly in the test module as well. diff --git a/adev/src/content/guide/testing/creating-component-harnesses.md b/adev/src/content/guide/testing/creating-component-harnesses.md new file mode 100644 index 000000000000..692b8d8cd041 --- /dev/null +++ b/adev/src/content/guide/testing/creating-component-harnesses.md @@ -0,0 +1,276 @@ +# Creating harnesses for your components + +## Before you start + +Tip: This guide assumes you've already read the [component harnesses overview guide](guide/testing/component-harnesses-overview). Read that first if you're new to using component harnesses. + +### When does creating a test harness make sense? + +The Angular team recommends creating component test harnesses for shared components that are used in many places and have some user interactivity. This most commonly applies to widget libraries and similar reusable components. Harnesses are valuable for these cases because they provide the consumers of these shared components a well- supported API for interacting with a component. Tests that use harnesses can avoid depending on unreliable implementation details of these shared components, such as DOM structure and specific event listeners. + +For components that appear in only one place, such as a page in an application, harnesses don't provide as much benefit. In these situations, a component's tests can reasonably depend on the implementation details of this component, as the tests and components are updated at the same time. However, harnesses still provide some value if you would use the harness in both unit and end-to-end tests. + +### CDK Installation + +The [Component Dev Kit (CDK)](https://material.angular.io/cdk/categories) is a set of behavior primitives for building components. To use the component harnesses, first install `@angular/cdk` from npm. You can do this from your terminal using the Angular CLI: + + + ng add @angular/cdk + + +## Extending `ComponentHarness` + +The abstract `ComponentHarness` class is the base class for all component harnesses. To create a custom component harness, extend `ComponentHarness` and implement the static property `hostSelector`. + +The `hostSelector` property identifies elements in the DOM that match this harness subclass. In most cases, the `hostSelector` should be the same as the selector of the corresponding `Component` or `Directive`. For example, consider a simple popup component: + + +@Component({ + selector: 'my-popup', + template: ` + + @if (isOpen()) { +

    + } + ` +}) +class MyPopup { + triggerText = input(''); + + isOpen = signal(false); + + toggle() { + this.isOpen.update((value) => !value); + } +} + + +In this case, a minimal harness for the component would look like the following: + + +class MyPopupHarness extends ComponentHarness { + static hostSelector = 'my-popup'; +} + + +While `ComponentHarness` subclasses require only the `hostSelector` property, most harnesses should also implement a static `with` method to generate `HarnessPredicate` instances. The [filtering harnesses section](guide/testing/using-component-harnesses#filtering-harnesses) covers this in more detail. + +## Finding elements in the component's DOM + +Each instance of a `ComponentHarness` subclass represents a particular instance of the corresponding component. You can access the component's host element via the `host() `method from the `ComponentHarness` base class. + +`ComponentHarness` also offers several methods for locating elements within the component's DOM. These methods are `locatorFor()`, `locatorForOptional()`, and `locatorForAll()`. These methods create functions that find elements, they do not directly find elements. This approach safeguards against caching references to out-of-date elements. For example, when an `ngIf` hides and then shows an element, the result is a new DOM element; using functions ensures that tests always reference the current state of the DOM. + +See the [ComponentHarness API reference page](https://material.angular.io/cdk/testing/api#ComponentHarness) for the full list details of the different `locatorFor` methods. + +For example, the `MyPopupHarness` example discussed above could provide methods to get the trigger and content elements as follows: + + +class MyPopupHarness extends ComponentHarness { + static hostSelector = 'my-popup'; + + /** Gets the trigger element */ + getTriggerElement = this.locatorFor('button'); + + /** Gets the content element. */ + getContentElement = this.locatorForOptional('.my-popup-content'); +} + + +## Working with `TestElement` instances + +`TestElement` is an abstraction designed to work across different test environments (Unit tests, WebDriver, etc). When using harnesses, you should perform all DOM interaction via this interface. Other means of accessing DOM elements, such as `document.querySelector()`, do not work in all test environments. + +`TestElement` has a number of methods to interact with the underlying DOM, such as `blur()`, `click()`, `getAttribute()`, and more. See the [TestElement API reference page](https://material.angular.io/cdk/testing/api#TestElement) for the full list of methods. + +Do not expose `TestElement` instances to harness users unless it's an element the component consumer defines directly, such as the component's host element. Exposing `TestElement` instances for internal elements leads users to depend on a component's internal DOM structure. + +Instead, provide more narrow-focused methods for specific actions the end-user may take or particular state they may observe. For example, `MyPopupHarness` from previous sections could provide methods like `toggle` and `isOpen`: + + +class MyPopupHarness extends ComponentHarness { + static hostSelector = 'my-popup'; + + protected getTriggerElement = this.locatorFor('button'); + protected getContentElement = this.locatorForOptional('.my-popup-content'); + + /** Toggles the open state of the popup. */ + async toggle() { + const trigger = await this.getTriggerElement(); + return trigger.click(); + } + + /** Checks if the popup us open. */ + async isOpen() { + const content = await this.getContentElement(); + return !!content; + } +} + + +## Loading harnesses for subcomponents + +Larger components often compose sub-components. You can reflect this structure in a component's harness as well. Each of the `locatorFor` methods on `ComponentHarness` has an alternate signature that can be used for locating sub-harnesses rather than elements. + +See the [ComponentHarness API reference page](https://material.angular.io/cdk/testing/api#ComponentHarness) for the full list of the different locatorFor methods. + +For example, consider a menu build using the popup from above: + + +@Directive({ + selector: 'my-menu-item' +}) +class MyMenuItem {} + +@Component({ + selector: 'my-menu', + template: ` + + + + ` +}) +class MyMenu { + triggerText = input(''); + + @ContentChildren(MyMenuItem) items: QueryList; +} + + +The harness for `MyMenu` can then take advantage of other harnesses for `MyPopup` and `MyMenuItem`: + + +class MyMenuHarness extends ComponentHarness { + static hostSelector = 'my-menu'; + + protected getPopupHarness = this.locatorFor(MyPopupHarness); + + /** Gets the currently shown menu items (empty list if menu is closed). */ + getItems = this.locatorForAll(MyMenuItemHarness); + + /** Toggles open state of the menu. */ + async toggle() { + const popupHarness = await this.getPopupHarness(); + return popupHarness.toggle(); + } +} + +class MyMenuItemHarness extends ComponentHarness { + static hostSelector = 'my-menu-item'; +} + + +## Filtering harness instances with `HarnessPredicate` +When a page contains multiple instances of a particular component, you may want to filter based on some property of the component to get a particular component instance. For example, you may want a button with some specific text, or a menu with a specific ID. The `HarnessPredicate` class can capture criteria like this for a `ComponentHarness` subclass. While the test author is able to construct `HarnessPredicate` instances manually, it's easier when the `ComponentHarness` subclass provides a helper method to construct predicates for common filters. + +You should create a static `with()` method on each `ComponentHarness` subclass that returns a `HarnessPredicate` for that class. This allows test authors to write easily understandable code, e.g. `loader.getHarness(MyMenuHarness.with({selector: '#menu1'}))`. In addition to the standard selector and ancestor options, the `with` method should add any other options that make sense for the particular subclass. + +Harnesses that need to add additional options should extend the `BaseHarnessFilters` interface and additional optional properties as needed. `HarnessPredicate` provides several convenience methods for adding options: `stringMatches()`, `addOption()`, and `add()`. See the [HarnessPredicate API page](https://material.angular.io/cdk/testing/api#HarnessPredicate) for the full description. + +For example, when working with a menu it is useful to filter based on trigger text and to filter menu items based on their text: + + +interface MyMenuHarnessFilters extends BaseHarnessFilters { + /** Filters based on the trigger text for the menu. */ + triggerText?: string | RegExp; +} + +interface MyMenuItemHarnessFilters extends BaseHarnessFilters { + /** Filters based on the text of the menu item. */ + text?: string | RegExp; +} + +class MyMenuHarness extends ComponentHarness { + static hostSelector = 'my-menu'; + + /** Creates a `HarnessPredicate` used to locate a particular `MyMenuHarness`. */ + static with(options: MyMenuHarnessFilters): HarnessPredicate { + return new HarnessPredicate(MyMenuHarness, options) + .addOption('trigger text', options.triggerText, + (harness, text) => HarnessPredicate.stringMatches(harness.getTriggerText(), text)); + } + + protected getPopupHarness = this.locatorFor(MyPopupHarness); + + /** Gets the text of the menu trigger. */ + async getTriggerText(): Promise { + const popupHarness = await this.getPopupHarness(); + return popupHarness.getTriggerText(); + } + ... +} + +class MyMenuItemHarness extends ComponentHarness { + static hostSelector = 'my-menu-item'; + + /** Creates a `HarnessPredicate` used to locate a particular `MyMenuItemHarness`. */ + static with(options: MyMenuItemHarnessFilters): HarnessPredicate { + return new HarnessPredicate(MyMenuItemHarness, options) + .addOption('text', options.text, + (harness, text) => HarnessPredicate.stringMatches(harness.getText(), text)); + } + + /** Gets the text of the menu item. */ + async getText(): Promise { + const host = await this.host(); + return host.text(); + } +} + + +You can pass a `HarnessPredicate` instead of a `ComponentHarness` class to any of the APIs on `HarnessLoader`, `LocatorFactory`, or `ComponentHarness`. This allows test authors to easily target a particular component instance when creating a harness instance. It also allows the harness author to leverage the same `HarnessPredicate` to enable more powerful APIs on their harness class. For example, consider the `getItems` method on the `MyMenuHarness` shown above. Adding a filtering API allows users of the harness to search for particular menu items: + + +class MyMenuHarness extends ComponentHarness { + static hostSelector = 'my-menu'; + + /** Gets a list of items in the menu, optionally filtered based on the given criteria. */ + async getItems(filters: MyMenuItemHarnessFilters = {}): Promise { + const getFilteredItems = this.locatorForAll(MyMenuItemHarness.with(filters)); + return getFilteredItems(); + } + ... +} + + +## Creating `HarnessLoader` for elements that use content projection + +Some components project additional content into the component's template. See the [content projection guide](guide/components/content-projection) for more information. + +Add a `HarnessLoader` instance scoped to the element containing the `` when you create a harness for a component that uses content projection. This allows the user of the harness to load additional harnesses for whatever components were passed in as content. `ComponentHarness` has several methods that can be used to create HarnessLoader instances for cases like this: `harnessLoaderFor()`, `harnessLoaderForOptional()`, `harnessLoaderForAll()`. See the [HarnessLoader interface API reference page](https://material.angular.io/cdk/testing/api#HarnessLoader) for more details. + +For example, the `MyPopupHarness` example from above can extend `ContentContainerComponentHarness` to add support to load harnesses within the `` of the component. + + +class MyPopupHarness extends ContentContainerComponentHarness { + static hostSelector = 'my-popup'; +} + + +## Accessing elements outside of the component's host element + +There are times when a component harness might need to access elements outside of its corresponding component's host element. For example, code that displays a floating element or pop-up often attaches DOM elements directly to the document body, such as the `Overlay` service in Angular CDK. + +In this case, `ComponentHarness` provides a method that can be used to get a `LocatorFactory` for the root element of the document. The `LocatorFactory` supports most of the same APIs as the `ComponentHarness` base class, and can then be used to query relative to the document's root element. + +Consider if the `MyPopup` component above used the CDK overlay for the popup content, rather than an element in its own template. In this case, `MyPopupHarness` would have to access the content element via `documentRootLocatorFactory()` method that gets a locator factory rooted at the document root. + + +class MyPopupHarness extends ComponentHarness { + static hostSelector = 'my-popup'; + + /** Gets a `HarnessLoader` whose root element is the popup's content element. */ + async getHarnessLoaderForContent(): Promise { + const rootLocator = this.documentRootLocatorFactory(); + return rootLocator.harnessLoaderFor('my-popup-content'); + } +} + + +## Waiting for asynchronous tasks + +The methods on `TestElement` automatically trigger Angular's change detection and wait for tasks inside the `NgZone`. In most cases no special effort is required for harness authors to wait on asynchronous tasks. However, there are some edge cases where this may not be sufficient. + +Under some circumstances, Angular animations may require a second cycle of change detection and subsequent `NgZone` stabilization before animation events are fully flushed. In cases where this is needed, the `ComponentHarness` offers a `forceStabilize()` method that can be called to do the second round. + +You can use `NgZone.runOutsideAngular()` to schedule tasks outside of NgZone. Call the `waitForTasksOutsideAngular()` method on the corresponding harness if you need to explicitly wait for tasks outside `NgZone` since this does not happen automatically. diff --git a/adev/src/content/guide/testing/using-component-harnesses.md b/adev/src/content/guide/testing/using-component-harnesses.md new file mode 100644 index 000000000000..884b33a3335f --- /dev/null +++ b/adev/src/content/guide/testing/using-component-harnesses.md @@ -0,0 +1,207 @@ +# Using component harnesses in tests + +## Before you start + +Tip: This guide assumes you've already read the [component harnesses overview guide](guide/testing/component-harnesses-overview). Read that first if you're new to using component harnesses. + +### CDK Installation + +The [Component Dev Kit (CDK)](https://material.angular.io/cdk/categories) is a set of behavior primitives for building components. To use the component harnesses, first install `@angular/cdk` from npm. You can do this from your terminal using the Angular CLI: + + + ng add @angular/cdk + + +## Test harness environments and loaders + +You can use component test harnesses in different test environments. Angular CDK supports two built-in environments: +- Unit tests with Angular's `TestBed` +- End-to-end tests with [WebDriver](https://developer.mozilla.org/en-US/docs/Web/WebDriver) + + +Each environment provides a harness loader. The loader creates the harness instances you use throughout your tests. See below for more specific guidance on supported testing environments. + +Additional testing environments require custom bindings. See the [adding harness support for additional testing environments guide](guide/testing/component-harnesses-testing-environments) for more information. + +### Using the loader from `TestbedHarnessEnvironment` for unit tests + +For unit tests you can create a harness loader from [TestbedHarnessEnvironment](https://material.angular.io/cdk/testing/api#TestbedHarnessEnvironment). This environment uses a [component fixture](api/core/testing/ComponentFixture) created by Angular's `TestBed`. + +To create a harness loader rooted at the fixture's root element, use the `loader()` method: + + +const fixture = TestBed.createComponent(MyComponent); + +// Create a harness loader from the fixture +const loader = TestbedHarnessEnvironment.loader(fixture); +... + +// Use the loader to get harness instances +const myComponentHarness = await loader.getHarness(MyComponent); + + +To create a harness loader for harnesses for elements that fall outside the fixture, use the `documentRootLoader()` method. For example, code that displays a floating element or pop-up often attaches DOM elements directly to the document body, such as the `Overlay` service in Angular CDK. + +You can also create a harness loader directly with `harnessForFixture()` for a harness at that fixture's root element directly. + +### Using the loader from `SeleniumWebDriverHarnessEnvironment` for end-to-end tests + +For WebDriver-based end-to-end tests you can create a harness loader with `SeleniumWebDriverHarnessEnvironment`. + +Use the `loader()` method to get the harness loader instance for the current HTML document, rooted at the document's root element. This environment uses a WebDriver client. + + +let wd: webdriver.WebDriver = getMyWebDriverClient(); +const loader = SeleniumWebDriverHarnessEnvironment.loader(wd); +... +const myComponentHarness = await loader.getHarness(MyComponent); + + +## Using a harness loader + +Harness loader instances correspond to a specific DOM element and are used to create component harness instances for elements under that specific element. + +To get `ComponentHarness` for the first instance of the element, use the `getHarness()` method. To get all `ComponentHarness` instances, use the `getAllHarnesses()` method. + + +// Get harness for first instance of the element +const myComponentHarness = await loader.getHarness(MyComponent); + +// Get harnesses for all instances of the element +const myComponentHarnesses = await loader.getHarnesses(MyComponent); + + +As an example, consider a reusable dialog-button component that opens a dialog on click. It contains the following components, each with a corresponding harness: +- `MyDialogButton` (composes the `MyButton` and `MyDialog` with a convenient API) +- `MyButton` (a standard button component) +- `MyDialog` (a dialog appended to `document.body` by `MyDialogButton` upon click) + +The following test loads harnesses for each of these components: + + +let fixture: ComponentFixture; +let loader: HarnessLoader; +let rootLoader: HarnessLoader; + +beforeEach(() => { + fixture = TestBed.createComponent(MyDialogButton); + loader = TestbedHarnessEnvironment.loader(fixture); + rootLoader = TestbedHarnessEnvironment.documentRootLoader(fixture); +}); + +it('loads harnesses', async () => { + // Load a harness for the bootstrapped component with `harnessForFixture` + dialogButtonHarness = + await TestbedHarnessEnvironment.harnessForFixture(fixture, MyDialogButtonHarness); + // The button element is inside the fixture's root element, so we use `loader`. + const buttonHarness = await loader.getHarness(MyButtonHarness); + // Click the button to open the dialog + await buttonHarness.click(); + // The dialog is appended to `document.body`, outside of the fixture's root element, + // so we use `rootLoader` in this case. + const dialogHarness = await rootLoader.getHarness(MyDialogHarness); + // ... make some assertions +}); + + +### Harness behavior in different environments + +Harnesses may not behave exactly the same in all environments. Some differences are unavoidable between the real user interaction versus the simulated events generated in unit tests. Angular CDK makes a best effort to normalize the behavior to the extent possible. + +### Interacting with child elements + +To interact with elements below the root element of this harness loader, use the `HarnessLoader` instance of a child element. For the first instance of the child element, use the `getChildLoader()` method. For all instances of the child element, use the `getAllChildLoaders()` method. + + +const myComponentHarness = await loader.getHarness(MyComponent); + +// Get loader for first instance of child element with '.child' selector +const childLoader = await myComponentHarness.getLoader('.child'); + +// Get loaders for all instances of child elements with '.child' selector +const allChildLoaders = await myComponentHarness.getAllChildLoaders('.child'); + + +### Filtering harnesses + +When a page contains multiple instances of a particular component, you may want to filter based on some property of the component to get a particular component instance. You can use a harness predicate, a class used to associate a `ComponentHarness` class with predicates functions that can be used to filter component instances, to do so. + +When you ask a `HarnessLoader` for a harness, you're actually providing a HarnessQuery. A query can be one of two things: +- A harness constructor. This just gets that harness +- A `HarnessPredicate`, which gets harnesses that are filtered based on one or more conditions + +`HarnessPredicate` does support some base filters (selector, ancestor) that work on anything that extends `ComponentHarness`. + + +// Example of loading a MyButtonComponentHarness with a harness predicate +const disabledButtonPredicate = new HarnessPredicate(MyButtonComponentHarness, {selector: '[disabled]'}); +const disabledButton = await loader.getHarness(disabledButtonPredicate); + + +However it's common for harnesses to implement a static `with()` method that accepts component-specific filtering options and returns a `HarnessPredicate`. + + +// Example of loading a MyButtonComponentHarness with a specific selector +const button = await loader.getHarness(MyButtonComponentHarness.with({selector: 'btn'})) + + +For more details refer to the specific harness documentation since additional filtering options are specific to each harness implementation. + +## Using test harness APIs + +While every harness defines an API specific to its corresponding component, they all share a common base class, [ComponentHarness](https://material.angular.io/cdk/testing/api#ComponentHarness). This base class defines a static property, `hostSelector`, that matches the harness class to instances of the component in the DOM. + +Beyond that, the API of any given harness is specific to its corresponding component; refer to the component's documentation to learn how to use a specific harness. + +As an example, the following is a test for a component that uses the [Angular Material slider component harness](https://material.angular.io/components/slider/api#MatSliderHarness): + + +it('should get value of slider thumb', async () => { + const slider = await loader.getHarness(MatSliderHarness); + const thumb = await slider.getEndThumb(); + expect(await thumb.getValue()).toBe(50); +}); + + +## Interop with Angular change detection + +By default, test harnesses runs Angular's [change detection](https://angular.dev/best-practices/runtime-performance) before reading the state of a DOM element and after interacting with a DOM element. + +There may be times that you need finer-grained control over change detection in your tests. such as checking the state of a component while an async operation is pending. In these cases use the `manualChangeDetection` function to disable automatic handling of change detection for a block of code. + + +it('checks state while async action is in progress', async () => { + const buttonHarness = loader.getHarness(MyButtonHarness); + await manualChangeDetection(async () => { + await buttonHarness.click(); + fixture.detectChanges(); + // Check expectations while async click operation is in progress. + expect(isProgressSpinnerVisible()).toBe(true); + await fixture.whenStable(); + // Check expectations after async click operation complete. + expect(isProgressSpinnerVisible()).toBe(false); + }); +}); + + +Almost all harness methods are asynchronous and return a `Promise` to support the following: +- Support for unit tests +- Support for end-to-end tests +- Insulate tests against changes in asynchronous behavior + +The Angular team recommends using [await](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function) to improve the test readability. Calling `await` blocks the execution of your test until the associated `Promise` resolves. + +Occasionally, you may want to perform multiple actions simultaneously and wait until they're all done rather than performing each action sequentially. For example, read multiple properties of a single component. In these situations use the `parallel` function to parallelize the operations. The parallel function works similarly to `Promise.all`, while also optimizing change detection checks. + + +it('reads properties in parallel', async () => { + const checkboxHarness = loader.getHarness(MyCheckboxHarness); + // Read the checked and intermediate properties simultaneously. + const [checked, indeterminate] = await parallel(() => [ + checkboxHarness.isChecked(), + checkboxHarness.isIndeterminate() + ]); + expect(checked).toBe(false); + expect(indeterminate).toBe(true); +}); + diff --git a/adev/src/content/introduction/installation.md b/adev/src/content/introduction/installation.md index a53f697a54fb..fa41e5866f9e 100644 --- a/adev/src/content/introduction/installation.md +++ b/adev/src/content/introduction/installation.md @@ -13,7 +13,7 @@ If you just want to play around with Angular in your browser without setting up -## Setup a new project locally +## Set up a new project locally If you're starting a new project, you'll most likely want to create a local project so that you can use tooling such as Git. @@ -22,6 +22,7 @@ If you're starting a new project, you'll most likely want to create a local proj - **Node.js** - v[^18.19.1 or newer](/reference/versions) - **Text editor** - We recommend [Visual Studio Code](https://code.visualstudio.com/) - **Terminal** - Required for running Angular CLI commands +- **Development Tool** - To improve your development workflow, we recommend the [Angular Language Service](/tools/language-service) ### Instructions diff --git a/adev/src/content/reference/errors/BUILD.bazel b/adev/src/content/reference/errors/BUILD.bazel index c347eea407fc..fdfbb6a529be 100644 --- a/adev/src/content/reference/errors/BUILD.bazel +++ b/adev/src/content/reference/errors/BUILD.bazel @@ -1,13 +1,34 @@ -load("//adev/shared-docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides", "generate_nav_items") + +package(default_visibility = ["//adev:__subpackages__"]) + +filegroup( + name = "files", + srcs = glob( + [ + "*.md", + ], + exclude = [ + "overview.md", + ], + ), + visibility = ["//visibility:private"], +) generate_guides( name = "errors", - srcs = glob([ - "*.md", - ]), + srcs = [ + "overview.md", + ":files", + ], data = [ "//adev/src/content/examples/errors:cyclic-imports/child.component.ts", "//adev/src/content/examples/errors:cyclic-imports/parent.component.ts", ], - visibility = ["//adev:__subpackages__"], +) + +generate_nav_items( + name = "route-nav-items", + srcs = [":files"], + strategy = "errors", ) diff --git a/adev/src/content/reference/errors/NG0403.md b/adev/src/content/reference/errors/NG0403.md index fd54ce65b4c6..a78c1d99ceae 100644 --- a/adev/src/content/reference/errors/NG0403.md +++ b/adev/src/content/reference/errors/NG0403.md @@ -35,7 +35,7 @@ platformBrowser().bootstrapModule(AppModule); ## Debugging the error -Please make sure that the NgModule that is used for bootstrapping is setup correctly: +Please make sure that the NgModule that is used for bootstrapping is set up correctly: - either the `bootstrap` property exists (and contains a non-empty array) in the `@NgModule` annotation - or the `ngDoBootstrap` method exists on the NgModule class diff --git a/adev/src/content/reference/extended-diagnostics/BUILD.bazel b/adev/src/content/reference/extended-diagnostics/BUILD.bazel index b5f6f83e522e..2ad047e0be5f 100644 --- a/adev/src/content/reference/extended-diagnostics/BUILD.bazel +++ b/adev/src/content/reference/extended-diagnostics/BUILD.bazel @@ -1,9 +1,30 @@ -load("//adev/shared-docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides", "generate_nav_items") + +package(default_visibility = ["//adev:__subpackages__"]) + +filegroup( + name = "files", + srcs = glob( + [ + "*.md", + ], + exclude = [ + "overview.md", + ], + ), + visibility = ["//visibility:private"], +) generate_guides( name = "extended-diagnostics", - srcs = glob([ - "*.md", - ]), - visibility = ["//adev:__subpackages__"], + srcs = [ + "overview.md", + ":files", + ], +) + +generate_nav_items( + name = "route-nav-items", + srcs = [":files"], + strategy = "extended-diagnostics", ) diff --git a/adev/src/content/reference/license.md b/adev/src/content/reference/license.md index c37c9024852b..9fb02a48c528 100644 --- a/adev/src/content/reference/license.md +++ b/adev/src/content/reference/license.md @@ -1,6 +1,6 @@ # The MIT License -Copyright (c) 2010-2024 Google LLC. https://angular.dev/license +Copyright (c) 2010-2025 Google LLC. https://angular.dev/license Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/adev/src/content/reference/migrations/cleanup-unused-imports.md b/adev/src/content/reference/migrations/cleanup-unused-imports.md new file mode 100644 index 000000000000..3191acaf2a09 --- /dev/null +++ b/adev/src/content/reference/migrations/cleanup-unused-imports.md @@ -0,0 +1,38 @@ +# Clean up unused imports + +As of version 19, Angular reports when a component's `imports` array contains symbols that aren't used in its template. + +Running this schematic will clean up all unused imports within the project. + +Run the schematic using the following command: + + + +ng generate @angular/core:cleanup-unused-imports + + + +#### Before + + +import { Component } from '@angular/core'; +import { UnusedDirective } from './unused'; + +@Component({ + template: 'Hello', + imports: [UnusedDirective], +}) +export class MyComp {} + + +#### After + + +import { Component } from '@angular/core'; + +@Component({ + template: 'Hello', + imports: [], +}) +export class MyComp {} + diff --git a/adev/src/content/reference/migrations/outputs.md b/adev/src/content/reference/migrations/outputs.md index 9ca85a3262a3..bc662f8ad015 100644 --- a/adev/src/content/reference/migrations/outputs.md +++ b/adev/src/content/reference/migrations/outputs.md @@ -80,7 +80,7 @@ ng generate @angular/core:output-migration --path src/app/sub-folder ## Exceptions In some cases, the migration will not touch the code. -One of these excpetions is the case where the event is used with a `pipe()` method. +One of these exceptions is the case where the event is used with a `pipe()` method. The following code won't be migrated: ```typescript @@ -93,4 +93,4 @@ export class MyDialogComponent { this.close.pipe(); } } -``` \ No newline at end of file +``` diff --git a/adev/src/content/reference/migrations/overview.md b/adev/src/content/reference/migrations/overview.md index ac4e1a4f7d98..847cc99d6b4a 100644 --- a/adev/src/content/reference/migrations/overview.md +++ b/adev/src/content/reference/migrations/overview.md @@ -24,4 +24,10 @@ Learn about how you can migrate your existing angular project to the latest feat Convert existing decorator query fields to the improved signal queries API. The API is now production ready. + + Clean up unused imports in your project. + + + Convert component templates to use self-closing tags where possible. + diff --git a/adev/src/content/reference/migrations/self-closing-tags.md b/adev/src/content/reference/migrations/self-closing-tags.md new file mode 100644 index 000000000000..d8a103007380 --- /dev/null +++ b/adev/src/content/reference/migrations/self-closing-tags.md @@ -0,0 +1,26 @@ +# Migration to self-closing tags + +Self-closing tags are supported in Angular templates since [v16](https://blog.angular.dev/angular-v16-is-here-4d7a28ec680d#7065). . + +This schematic migrates the templates in your application to use self-closing tags. + +Run the schematic using the following command: + + + +ng generate @angular/core:self-closing-tag + + + + +#### Before + + + + + + + + + + diff --git a/adev/src/content/reference/releases.md b/adev/src/content/reference/releases.md index c8fc4124bb2b..445ebdfdf523 100644 --- a/adev/src/content/reference/releases.md +++ b/adev/src/content/reference/releases.md @@ -76,7 +76,7 @@ HELPFUL: Approximate dates are offered as general guidance and are subject to ch |:--------|:-------------------| | v19.1 | Week of 2025-01-13 | | v19.2 | Week of 2025-02-24 | -| v20.0 | Week of 2025-05-19 | +| v20.0 | Week of 2025-05-26 | ### Support window diff --git a/adev/src/content/tools/cli/build-system-migration.md b/adev/src/content/tools/cli/build-system-migration.md index dde2fbd8d56f..f8f53e2fef82 100644 --- a/adev/src/content/tools/cli/build-system-migration.md +++ b/adev/src/content/tools/cli/build-system-migration.md @@ -188,14 +188,13 @@ This will not occur in builds outside the development server. Hot Module Replacement (HMR) is a technique used by development servers to avoid reloading the entire page when only part of an application is changed. The changes in many cases can be immediately shown in the browser which allows for an improved edit/refresh cycle while developing an application. While general JavaScript-based hot module replacement (HMR) is currently not supported, several more specific forms of HMR are available: -- **global stylesheets** (default) -- **component stylesheet** (default) -- **component template** (experimental opt-in) +- **global stylesheet** (`styles` build option) +- **component stylesheet** (inline and file-based) +- **component template** (inline and file-based) -The stylesheet HMR capabilities are automatically enabled and require no code or configuration changes to use. -Angular provides HMR support for both file-based (`styleUrl`/`styleUrls`) and inline (`styles`) component styles. +The HMR capabilities are automatically enabled and require no code or configuration changes to use. +Angular provides HMR support for both file-based (`templateUrl`/`styleUrl`/`styleUrls`) and inline (`template`/`styles`) component styles and templates. The build system will attempt to compile and process the minimal amount of application code when it detects a stylesheet only change. -In many cases, no JavaScript/TypeScript processing will be required. If preferred, the HMR capabilities can be disabled by setting the `hmr` development server option to `false`. This can also be changed on the command line via: @@ -206,14 +205,6 @@ ng serve --no-hmr -In addition to fully supported component stylesheet HMR, Angular provides **experimental** support for component template HMR. -Template HMR also requires no application code changes but currently requires the use of the `NG_HMR_TEMPLATES=1` environment variable to enable. - -IMPORTANT: Component **template** HMR is experimental and is not enabled by default. -Currently, only file-based (`styleUrl`) templates are supported and any inline template changes will cause a full page reload. -When manually enabled, there may be cases where the browser is not fully synchronized with the application code and a restart of the development server may be required. -If you encounter an issue while using this feature, please [report the bug](https://github.com/angular/angular-cli/issues) to help the Angular team stabilize the feature. - ### Vite as a development server The usage of Vite in the Angular CLI is currently within a _development server capacity only_. Even without using the underlying Vite build system, Vite provides a full-featured development server with client side support that has been bundled into a low dependency npm package. This makes it an ideal candidate to provide comprehensive development server functionality. The current development server process uses the new build system to generate a development build of the application in memory and passes the results to Vite to serve the application. The usage of Vite, much like the Webpack-based development server, is encapsulated within the Angular CLI `dev-server` builder and currently cannot be directly configured. diff --git a/adev/src/content/tools/cli/build.md b/adev/src/content/tools/cli/build.md index 426835b46329..f6f2140eb19f 100644 --- a/adev/src/content/tools/cli/build.md +++ b/adev/src/content/tools/cli/build.md @@ -8,9 +8,9 @@ Angular CLI includes four builders typically used as `build` targets: | Builder | Purpose | | ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `@angular-devkit/build-angular:browser` | Bundles a client-side application for use in a browser with [webpack](https://webpack.js.org/). | -| `@angular-devkit/build-angular:browser-esbuild` | Bundles a client-side application for use in a browser with [esbuild](https://esbuild.github.io/). See [`browser-esbuild` documentation](tools/cli/build-system-migration#manual-migration-to-the-compatibility-builder) for more information. | | `@angular-devkit/build-angular:application` | Builds an application with a client-side bundle, a Node server, and build-time prerendered routes with [esbuild](https://esbuild.github.io/). | +| `@angular-devkit/build-angular:browser-esbuild` | Bundles a client-side application for use in a browser with [esbuild](https://esbuild.github.io/). See [`browser-esbuild` documentation](tools/cli/build-system-migration#manual-migration-to-the-compatibility-builder) for more information. | +| `@angular-devkit/build-angular:browser` | Bundles a client-side application for use in a browser with [webpack](https://webpack.js.org/). | | `@angular-devkit/build-angular:ng-packagr` | Builds an Angular library adhering to [Angular Package Format](tools/libraries/angular-package-format). | Applications generated by `ng new` use `@angular-devkit/build-angular:application` by default. @@ -153,3 +153,9 @@ Avoid expanding this list to more browsers. Even if your application code more b You should only ever _reduce_ the set of browsers or versions in this list. HELPFUL: Use [browsersl.ist](https://browsersl.ist) to display compatible browsers for a `browserslist` query. + +## Configuring Tailwind + +Angular supports [Tailwind](https://tailwindcss.com/), a utility-first CSS framework. + +Follow the [Tailwind documentation](https://tailwindcss.com/docs/installation/framework-guides/angular) for integrating with Angular CLI. diff --git a/adev/src/content/tools/cli/end-to-end.md b/adev/src/content/tools/cli/end-to-end.md index 00d2350885fa..c1f888b49788 100644 --- a/adev/src/content/tools/cli/end-to-end.md +++ b/adev/src/content/tools/cli/end-to-end.md @@ -2,7 +2,7 @@ End-to-end or (E2E) testing is a form of testing used to assert your entire application works as expected from start to finish or _"end-to-end"_. E2E testing differs from unit testing in that it is completely decoupled from the underlying implementation details of your code. It is typically used to validate an application in a way that mimics the way a user would interact with it. This page serves as a guide to getting started with end-to-end testing in Angular using the Angular CLI. -## Setup E2E Testing +## Set Up E2E Testing The Angular CLI downloads and installs everything you need to run end-to-end tests for your Angular application. @@ -36,7 +36,7 @@ Puppeteer -If you don't find the test runner you would like you use from the list above, you can add manually add a package using `ng add`. +If you don't find the test runner you would like to use from the list above, you can manually add a package using `ng add`. ## Running E2E Tests diff --git a/adev/src/content/tutorials/deferrable-views/common/package-lock.json b/adev/src/content/tutorials/deferrable-views/common/package-lock.json index b39c3cc8971e..c7e530756a8c 100644 --- a/adev/src/content/tutorials/deferrable-views/common/package-lock.json +++ b/adev/src/content/tutorials/deferrable-views/common/package-lock.json @@ -22,7 +22,7 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } }, "node_modules/@ampproject/remapping": { @@ -40,13 +40,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1900.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz", - "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==", + "version": "0.1901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.7.tgz", + "integrity": "sha512-qltyebfbej7joIKZVH8EFfrVDrkw0p9N9ja3A0XeU1sl2vlepHNAQdVm0Os8Vy2XjjyHvT5bXWE3G3/221qEKw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.1.7", "rxjs": "7.8.1" }, "engines": { @@ -56,9 +56,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", - "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.7.tgz", + "integrity": "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -84,15 +84,15 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz", - "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.7.tgz", + "integrity": "sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.1.7", "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -103,36 +103,37 @@ } }, "node_modules/@angular/build": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz", - "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.7.tgz", + "integrity": "sha512-22SjHZDTk91JHU5aFVDU2n+xkPolDosRVfsK4zs+RRXQs30LYPH9KCLiUWCYjFbRj7oYvw7sbrs94szo7dWYvw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.6", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.0.2", - "@vitejs/plugin-basic-ssl": "1.1.0", - "beasties": "0.1.0", + "@inquirer/confirm": "5.1.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", "browserslist": "^4.23.0", - "esbuild": "0.24.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", + "esbuild": "0.24.2", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", "listr2": "8.2.5", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "mrmime": "2.0.0", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.7.0", - "rollup": "4.26.0", - "sass": "1.80.7", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", "semver": "7.6.3", - "vite": "5.4.11", + "vite": "6.0.11", "watchpack": "2.4.2" }, "engines": { @@ -141,7 +142,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.1.5" + "lmdb": "3.2.2" }, "peerDependencies": { "@angular/compiler": "^19.0.0", @@ -149,11 +150,12 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.6", + "@angular/ssr": "^19.1.7", "less": "^4.2.0", + "ng-packagr": "^19.0.0", "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -171,6 +173,9 @@ "less": { "optional": true }, + "ng-packagr": { + "optional": true + }, "postcss": { "optional": true }, @@ -180,26 +185,26 @@ } }, "node_modules/@angular/cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz", - "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.7.tgz", + "integrity": "sha512-qVEy0R4QKQ2QAGfpj2mPVxRxgOVst+rIgZBtLwf/mrbN9YyzJUaBKvaVslUpOqkvoW9mX5myf0iZkT5NykrIoA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.6", - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", - "@inquirer/prompts": "7.1.0", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", + "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.6", + "@schematics/angular": "19.1.7", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", "listr2": "8.2.5", - "npm-package-arg": "12.0.0", + "npm-package-arg": "12.0.1", "npm-pick-manifest": "10.0.0", "pacote": "20.0.0", - "resolve": "1.22.8", + "resolve": "1.22.10", "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -214,9 +219,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz", - "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.6.tgz", + "integrity": "sha512-FkuejwbxsOLhcyOgDM/7YEYvMG3tuyOvr+831VzPwMwYp5QO9AUYtn4ffGf698JccbA+Ocw3BAdhPU6i+YZC1A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -225,14 +230,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5", + "@angular/core": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz", - "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.6.tgz", + "integrity": "sha512-Tl2PFEtnU8UgSqtEKG827xDUGZrErhR6S1JICeV1kbRCYmwQA4hhG25tzi+ifSAOPW7eJiyzP2LWIvOuZkq3Vw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -241,7 +246,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -250,9 +255,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz", - "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.6.tgz", + "integrity": "sha512-rTpHC/tfLBj+5a3X+BA/4s2w5T/cHT6x3RgO8CYy7003Musn0/BiqjfE6VCIllQgLaOQRhCcf51T6Kerkzv8Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -274,14 +279,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.5", - "typescript": ">=5.5 <5.7" + "@angular/compiler": "19.1.6", + "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz", - "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.6.tgz", + "integrity": "sha512-FD167URT+apxjzj9sG/MzffW5G6YyQiPQ6nrrIoYi9jeY3LYurybuOgvcXrU8PT4Z3+CKMq9k/ZnmrlHU72BpA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -295,9 +300,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz", - "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.6.tgz", + "integrity": "sha512-uu/76KAwCAcDuhD67Vv78UvOC/tiprtFXOgqNCj0LK8vyFcvPsunb3nF/PtfF9rSHyslXAqxZhME+Ha2tU6Lpw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -306,16 +311,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz", - "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.6.tgz", + "integrity": "sha512-sfWU+gMpqQ6GYtE3tAfDktftC01NgtqAOKfeCQ/KY2rxRTIxYahenW0Licuzgmd+8AZtmncoZaYX0Fd/5XMqzQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -324,9 +329,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.5", - "@angular/common": "19.0.5", - "@angular/core": "19.0.5" + "@angular/animations": "19.1.6", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -335,9 +340,9 @@ } }, "node_modules/@angular/router": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.5.tgz", - "integrity": "sha512-6tNubVVj/rRyTg+OXjQxACfufvCLHAwDQtv9wqt6q/3OYSnysHTik3ho3FaFPwu7fXJ+6p9Rjzkh2VY9QMk4bw==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.6.tgz", + "integrity": "sha512-TEfw3W5jVodVDMD4krhXGog1THZN3x1yoh2oZmCv3lXg22+pVC6Cp+x3vVExq0mS+g3/6uZwy/3qAYdlzqYjTg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -346,9 +351,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -368,9 +373,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { @@ -426,14 +431,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -456,13 +461,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -515,9 +520,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "license": "MIT", "engines": { @@ -568,27 +573,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -614,32 +619,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -648,9 +653,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, "license": "MIT", "dependencies": { @@ -662,9 +667,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -679,9 +684,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -696,9 +701,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -713,9 +718,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -730,9 +735,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -747,9 +752,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -764,9 +769,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -781,9 +786,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -798,9 +803,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -815,9 +820,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -832,9 +837,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -849,9 +854,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -866,9 +871,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -883,9 +888,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -900,9 +905,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -917,9 +922,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -934,9 +939,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -950,10 +955,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -968,9 +990,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], @@ -985,9 +1007,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -1002,9 +1024,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -1019,9 +1041,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -1036,9 +1058,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -1053,9 +1075,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -1070,15 +1092,15 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.4.tgz", - "integrity": "sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.1.tgz", + "integrity": "sha512-os5kFd/52gZTl/W6xqMfhaKVJHQM8V/U1P8jcSaQJ/C4Qhdrf2jEXdA/HaxfQs9iiUA/0yzYhk5d3oRHTxGDDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1087,17 +1109,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/confirm": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", - "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz", + "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" }, "engines": { "node": ">=18" @@ -1107,35 +1134,42 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.2.tgz", - "integrity": "sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==", + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.6.tgz", + "integrity": "sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/editor": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.1.tgz", - "integrity": "sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.6.tgz", + "integrity": "sha512-l0smvr8g/KAVdXx4I92sFxZiaTG4kFc06cFZw+qqwTirwdUHMFLnouXBB9OafWhpO3cfEkEz2CdPoCmor3059A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "external-editor": "^3.1.0" }, "engines": { @@ -1143,17 +1177,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/expand": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.4.tgz", - "integrity": "sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.8.tgz", + "integrity": "sha512-k0ouAC6L+0Yoj/j0ys2bat0fYcyFVtItDB7h+pDFKaDDSFJey/C/YY1rmIOqkmFVZ5rZySeAQuS8zLcKkKRLmg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1161,12 +1200,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/figures": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", - "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", + "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", "dev": true, "license": "MIT", "engines": { @@ -1174,48 +1218,58 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.1.tgz", - "integrity": "sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.5.tgz", + "integrity": "sha512-bB6wR5wBCz5zbIVBPnhp94BHv/G4eKbUEjlpCw676pI2chcvzTx1MuwZSCZ/fgNOdqDlAxkhQ4wagL8BI1D3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/number": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.4.tgz", - "integrity": "sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.8.tgz", + "integrity": "sha512-CTKs+dT1gw8dILVWATn8Ugik1OHLkkfY82J+Musb57KpmF6EKyskv8zmMiEJPzOnLTZLo05X/QdMd8VH9oulXw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/password": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.4.tgz", - "integrity": "sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.8.tgz", + "integrity": "sha512-MgA+Z7o3K1df2lGY649fyOBowHGfrKRz64dx3+b6c1w+h2W7AwBoOkHhhF/vfhbs5S4vsKNCuDzS3s9r5DpK1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2" }, "engines": { @@ -1223,25 +1277,30 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/prompts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", - "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.1.tgz", + "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.0.2", - "@inquirer/confirm": "^5.0.2", - "@inquirer/editor": "^4.1.0", - "@inquirer/expand": "^4.0.2", - "@inquirer/input": "^4.0.2", - "@inquirer/number": "^3.0.2", - "@inquirer/password": "^4.0.2", - "@inquirer/rawlist": "^4.0.2", - "@inquirer/search": "^3.0.2", - "@inquirer/select": "^4.0.2" + "@inquirer/checkbox": "^4.0.4", + "@inquirer/confirm": "^5.1.1", + "@inquirer/editor": "^4.2.1", + "@inquirer/expand": "^4.0.4", + "@inquirer/input": "^4.1.1", + "@inquirer/number": "^3.0.4", + "@inquirer/password": "^4.0.4", + "@inquirer/rawlist": "^4.0.4", + "@inquirer/search": "^3.0.4", + "@inquirer/select": "^4.0.4" }, "engines": { "node": ">=18" @@ -1251,14 +1310,14 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.4.tgz", - "integrity": "sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.8.tgz", + "integrity": "sha512-hl7rvYW7Xl4un8uohQRUgO6uc2hpn7PKqfcGkCOWC0AA4waBxAv6MpGOFCEDrUaBCP+pXPVqp4LmnpWmn1E1+g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1266,18 +1325,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/search": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.4.tgz", - "integrity": "sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.8.tgz", + "integrity": "sha512-ihSE9D3xQAupNg/aGDZaukqoUSXG2KfstWosVmFCG7jbMQPaj2ivxWtsB+CnYY/T4D6LX1GHKixwJLunNCffww==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1285,18 +1349,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/select": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.4.tgz", - "integrity": "sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.8.tgz", + "integrity": "sha512-Io2prxFyN2jOCcu4qJbVoilo19caiD3kqkD3WR0q3yDA5HUCo83v4LrRtg55ZwniYACW64z36eV7gyVbOfORjA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1305,12 +1374,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", - "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, "license": "MIT", "engines": { @@ -1318,6 +1392,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@isaacs/cliui": { @@ -1338,19 +1417,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -1389,22 +1455,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -1539,9 +1589,9 @@ } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", - "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz", + "integrity": "sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g==", "cpu": [ "arm64" ], @@ -1553,9 +1603,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", - "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz", + "integrity": "sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA==", "cpu": [ "x64" ], @@ -1567,9 +1617,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", - "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz", + "integrity": "sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA==", "cpu": [ "arm" ], @@ -1581,9 +1631,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", - "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz", + "integrity": "sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g==", "cpu": [ "arm64" ], @@ -1595,9 +1645,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", - "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz", + "integrity": "sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw==", "cpu": [ "x64" ], @@ -1609,9 +1659,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", - "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz", + "integrity": "sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ==", "cpu": [ "x64" ], @@ -2142,9 +2192,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz", - "integrity": "sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.1.tgz", + "integrity": "sha512-d5qimadRAUCO4A/Txw71VM7UrRZzV+NPclxz/dc+M6B2oYwjWTjqh8HA/sGQgs9VZuJ6I/P7XIAlJvgrl27ZOw==", "dev": true, "license": "ISC", "dependencies": { @@ -2152,9 +2202,9 @@ "glob": "^10.2.2", "hosted-git-info": "^8.0.0", "json-parse-even-better-errors": "^4.0.0", - "normalize-package-data": "^7.0.0", "proc-log": "^5.0.0", - "semver": "^7.5.3" + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2174,9 +2224,9 @@ } }, "node_modules/@npmcli/redact": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz", - "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz", + "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==", "dev": true, "license": "ISC", "engines": { @@ -2202,9 +2252,9 @@ } }, "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2223,25 +2273,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" } }, "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", "cpu": [ "arm64" ], @@ -2260,9 +2310,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", "cpu": [ "arm64" ], @@ -2281,9 +2331,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", "cpu": [ "x64" ], @@ -2302,9 +2352,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", "cpu": [ "x64" ], @@ -2323,9 +2373,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", "cpu": [ "arm" ], @@ -2344,9 +2394,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", "cpu": [ "arm" ], @@ -2365,9 +2415,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", "cpu": [ "arm64" ], @@ -2386,9 +2436,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", "cpu": [ "arm64" ], @@ -2407,9 +2457,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", "cpu": [ "x64" ], @@ -2428,9 +2478,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", "cpu": [ "x64" ], @@ -2449,9 +2499,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", "cpu": [ "arm64" ], @@ -2470,9 +2520,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", "cpu": [ "ia32" ], @@ -2491,9 +2541,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", "cpu": [ "x64" ], @@ -2545,9 +2595,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", "cpu": [ "arm" ], @@ -2559,9 +2609,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", "cpu": [ "arm64" ], @@ -2573,9 +2623,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", "cpu": [ "arm64" ], @@ -2587,9 +2637,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", "cpu": [ "x64" ], @@ -2601,9 +2651,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", "cpu": [ "arm64" ], @@ -2615,9 +2665,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", "cpu": [ "x64" ], @@ -2629,9 +2679,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", "cpu": [ "arm" ], @@ -2643,9 +2693,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", "cpu": [ "arm" ], @@ -2657,9 +2707,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", "cpu": [ "arm64" ], @@ -2671,9 +2721,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", "cpu": [ "arm64" ], @@ -2684,10 +2734,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", "cpu": [ "ppc64" ], @@ -2699,9 +2763,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", "cpu": [ "riscv64" ], @@ -2713,9 +2777,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", "cpu": [ "s390x" ], @@ -2727,9 +2791,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", "cpu": [ "x64" ], @@ -2741,9 +2805,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", "cpu": [ "x64" ], @@ -2755,9 +2819,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", "cpu": [ "arm64" ], @@ -2769,9 +2833,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", "cpu": [ "ia32" ], @@ -2783,9 +2847,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", "cpu": [ "x64" ], @@ -2797,14 +2861,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz", - "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.7.tgz", + "integrity": "sha512-BB8yMGmYDZzSb8Nu+Ln0TKyeoS3++f9STCYw30NwM3IViHxJJYxu/zowzwSa9TjftIzdCpbOaPxGS0vU9UOUDQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -2814,13 +2878,13 @@ } }, "node_modules/@sigstore/bundle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", - "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", + "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2837,26 +2901,26 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz", + "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/sign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", - "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", + "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^14.0.1", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", "proc-log": "^5.0.0", "promise-retry": "^2.0.1" }, @@ -2865,13 +2929,13 @@ } }, "node_modules/@sigstore/tuf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", - "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.0.tgz", + "integrity": "sha512-suVMQEA+sKdOz5hwP9qNcEjX6B45R+hFFr4LAWzbRc5O+U2IInwvay/bpG5a4s+qR35P/JK/PiKiRGjfuLy1IA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/protobuf-specs": "^0.4.0", "tuf-js": "^3.0.1" }, "engines": { @@ -2879,15 +2943,15 @@ } }, "node_modules/@sigstore/verify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", - "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.0.tgz", + "integrity": "sha512-kAAM06ca4CzhvjIZdONAL9+MLppW3K48wOFy1TbuaWFW/OMfl8JuTgW0Bm02JB1WJGT/ET2eqav0KTEKmxqkIA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2925,9 +2989,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, "license": "MIT", "peer": true, @@ -2936,16 +3000,16 @@ } }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@yarnpkg/lockfile": { @@ -2956,13 +3020,13 @@ "license": "BSD-2-Clause" }, "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", + "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/agent-base": { @@ -3027,13 +3091,16 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -3081,9 +3148,9 @@ "license": "MIT" }, "node_modules/beasties": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", - "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz", + "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3091,10 +3158,13 @@ "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "htmlparser2": "^9.0.0", + "htmlparser2": "^9.1.0", "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/bl": { @@ -3140,9 +3210,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -3283,9 +3353,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", "dev": true, "funding": [ { @@ -3424,6 +3494,16 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3456,6 +3536,19 @@ "node": ">=8" } }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -3673,9 +3766,9 @@ } }, "node_modules/domutils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", - "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3695,9 +3788,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.76", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", - "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "version": "1.5.100", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.100.tgz", + "integrity": "sha512-u1z9VuzDXV86X2r3vAns0/5ojfXBue9o0+JDUDBKYqGLjxLkSqsSUoPU/6kW0gx76V44frHaf6Zo+QF74TQCMg==", "dev": true, "license": "ISC" }, @@ -3777,9 +3870,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3790,30 +3883,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/escalade": { @@ -3834,9 +3928,9 @@ "license": "MIT" }, "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true, "license": "Apache-2.0" }, @@ -3863,9 +3957,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -3873,16 +3967,16 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", - "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, "funding": [ { @@ -3897,9 +3991,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, "license": "ISC", "dependencies": { @@ -4150,13 +4244,13 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -4488,19 +4582,6 @@ "node": ">=18.0.0" } }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4514,22 +4595,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -4549,9 +4614,9 @@ } }, "node_modules/lmdb": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", - "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.2.tgz", + "integrity": "sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4567,12 +4632,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.1.5", - "@lmdb/lmdb-darwin-x64": "3.1.5", - "@lmdb/lmdb-linux-arm": "3.1.5", - "@lmdb/lmdb-linux-arm64": "3.1.5", - "@lmdb/lmdb-linux-x64": "3.1.5", - "@lmdb/lmdb-win32-x64": "3.1.5" + "@lmdb/lmdb-darwin-arm64": "3.2.2", + "@lmdb/lmdb-darwin-x64": "3.2.2", + "@lmdb/lmdb-linux-arm": "3.2.2", + "@lmdb/lmdb-linux-arm64": "3.2.2", + "@lmdb/lmdb-linux-x64": "3.2.2", + "@lmdb/lmdb-win32-x64": "3.2.2" } }, "node_modules/log-symbols": { @@ -4628,19 +4693,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4687,22 +4739,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -4732,9 +4768,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { @@ -5106,9 +5142,9 @@ "optional": true }, "node_modules/node-gyp": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz", - "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.1.0.tgz", + "integrity": "sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5208,13 +5244,13 @@ "license": "MIT" }, "node_modules/nopt": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", - "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "dev": true, "license": "ISC", "dependencies": { - "abbrev": "^2.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" @@ -5223,21 +5259,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/normalize-package-data": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz", - "integrity": "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^8.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/npm-bundled": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", @@ -5275,9 +5296,9 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz", + "integrity": "sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==", "dev": true, "license": "ISC", "dependencies": { @@ -5392,6 +5413,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ora/node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -5442,6 +5473,19 @@ "dev": true, "license": "ISC" }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ordered-binary": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", @@ -5615,9 +5659,9 @@ } }, "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -5625,9 +5669,9 @@ } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "dev": true, "funding": [ { @@ -5645,7 +5689,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5728,13 +5772,13 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -5769,19 +5813,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5848,9 +5895,9 @@ } }, "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, "license": "MIT", "dependencies": { @@ -5864,24 +5911,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", "fsevents": "~2.3.2" } }, @@ -5947,9 +5995,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.80.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", - "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz", + "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==", "dev": true, "license": "MIT", "dependencies": { @@ -6017,18 +6065,18 @@ } }, "node_modules/sigstore": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", - "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", + "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^3.0.0", - "@sigstore/tuf": "^3.0.0", - "@sigstore/verify": "^2.0.0" + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -6076,9 +6124,9 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6155,9 +6203,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "dev": true, "license": "CC0-1.0" }, @@ -6225,6 +6273,16 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6242,20 +6300,20 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/string-width/node_modules/strip-ansi": { + "node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", @@ -6271,7 +6329,8 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-ansi": { + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", @@ -6284,16 +6343,12 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } @@ -6483,9 +6538,9 @@ } }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6531,9 +6586,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, "funding": [ { @@ -6552,7 +6607,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -6590,21 +6645,21 @@ } }, "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -6613,19 +6668,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -6646,439 +6707,15 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", @@ -7161,6 +6798,16 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7193,6 +6840,29 @@ "node": ">=8" } }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7225,6 +6895,19 @@ "node": ">=8" } }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -7271,6 +6954,16 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7303,6 +6996,19 @@ "node": ">=8" } }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yoctocolors-cjs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", diff --git a/adev/src/content/tutorials/deferrable-views/common/package.json b/adev/src/content/tutorials/deferrable-views/common/package.json index 75c8c8e253e2..433b21a3ed6e 100644 --- a/adev/src/content/tutorials/deferrable-views/common/package.json +++ b/adev/src/content/tutorials/deferrable-views/common/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "NG_BUILD_PARALLEL_TS=0 ng serve", + "start": "ng serve", "build": "ng build", "watch": "ng build --watch --configuration development" }, @@ -23,6 +23,6 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } } diff --git a/adev/src/content/tutorials/first-app/common/package-lock.json b/adev/src/content/tutorials/first-app/common/package-lock.json index 77ad45508d2b..7ec817557892 100644 --- a/adev/src/content/tutorials/first-app/common/package-lock.json +++ b/adev/src/content/tutorials/first-app/common/package-lock.json @@ -26,7 +26,7 @@ "@types/jasmine": "~5.1.0", "@types/node": "^16.11.35", "copyfiles": "^2.4.1", - "jasmine-core": "~5.5.0", + "jasmine-core": "~5.6.0", "jasmine-marbles": "~0.9.2", "jasmine-spec-reporter": "~7.0.0", "karma": "~6.4.0", @@ -36,7 +36,7 @@ "karma-jasmine-html-reporter": "~2.1.0", "protractor": "~7.0.0", "ts-node": "~10.9.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } }, "node_modules/@ampproject/remapping": { @@ -54,13 +54,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1900.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz", - "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==", + "version": "0.1901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.7.tgz", + "integrity": "sha512-qltyebfbej7joIKZVH8EFfrVDrkw0p9N9ja3A0XeU1sl2vlepHNAQdVm0Os8Vy2XjjyHvT5bXWE3G3/221qEKw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.1.7", "rxjs": "7.8.1" }, "engines": { @@ -70,19 +70,19 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.0.6.tgz", - "integrity": "sha512-dWTAsE6BSI8z0xglQdYBdqTBwg1Q+RWE3OrmlGs+520Dcoq/F0Z41Y1F3MiuHuQPdDAIQr88iB0APkIRW4clMg==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.1.7.tgz", + "integrity": "sha512-CMl3D5cpXoY0WuvdYtuOU2TetCwqxNsYM2jpuGG/kuuTEASAOI1cs9OhGwny1A/63bB8eyL33eLe82ON2Oemow==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.6", - "@angular-devkit/build-webpack": "0.1900.6", - "@angular-devkit/core": "19.0.6", - "@angular/build": "19.0.6", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/build-webpack": "0.1901.7", + "@angular-devkit/core": "19.1.7", + "@angular/build": "19.1.7", "@babel/core": "7.26.0", - "@babel/generator": "7.26.2", + "@babel/generator": "7.26.3", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", "@babel/plugin-transform-async-generator-functions": "7.25.9", @@ -91,21 +91,21 @@ "@babel/preset-env": "7.26.0", "@babel/runtime": "7.26.0", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "19.0.6", - "@vitejs/plugin-basic-ssl": "1.1.0", + "@ngtools/webpack": "19.1.7", + "@vitejs/plugin-basic-ssl": "1.2.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.20", "babel-loader": "9.2.1", "browserslist": "^4.21.5", "copy-webpack-plugin": "12.0.2", "css-loader": "7.1.2", - "esbuild-wasm": "0.24.0", - "fast-glob": "3.3.2", + "esbuild-wasm": "0.24.2", + "fast-glob": "3.3.3", "http-proxy-middleware": "3.0.3", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.2.0", + "less": "4.2.1", "less-loader": "12.2.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.3.1", @@ -113,22 +113,22 @@ "open": "10.1.0", "ora": "5.4.1", "picomatch": "4.0.2", - "piscina": "4.7.0", + "piscina": "4.8.0", "postcss": "8.4.49", "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.80.7", - "sass-loader": "16.0.3", + "sass": "1.83.1", + "sass-loader": "16.0.4", "semver": "7.6.3", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.36.0", + "terser": "5.37.0", "tree-kill": "1.2.2", "tslib": "2.8.1", - "webpack": "5.96.1", + "webpack": "5.97.1", "webpack-dev-middleware": "7.4.2", - "webpack-dev-server": "5.1.0", + "webpack-dev-server": "5.2.0", "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" }, @@ -138,14 +138,14 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.24.0" + "esbuild": "0.24.2" }, "peerDependencies": { "@angular/compiler-cli": "^19.0.0", "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.6", + "@angular/ssr": "^19.1.7", "@web/test-runner": "^0.19.0", "browser-sync": "^3.0.2", "jest": "^29.5.0", @@ -153,8 +153,8 @@ "karma": "^6.3.0", "ng-packagr": "^19.0.0", "protractor": "^7.0.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -195,424 +195,10 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, "license": "MIT", "optional": true, @@ -622,35 +208,35 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@angular-devkit/build-angular/node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz", + "integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.2", + "postcss": "^8.5.1", + "rollup": "^4.30.1" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -659,653 +245,297 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1900.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1900.6.tgz", - "integrity": "sha512-WehtVrbBow4fc7hsaUKb+BZ6MDE5lO98/tgv7GR5PkRdGKnyLA0pW1AfPLJJQDgcaKjneramMhDFNc1eGSX0mQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/architect": "0.1900.6", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "webpack": "^5.30.0", - "webpack-dev-server": "^5.0.2" - } - }, - "node_modules/@angular-devkit/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", - "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/schematics": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz", - "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "19.0.6", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/animations": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.5.tgz", - "integrity": "sha512-HCOF2CrhUvjoZWusd4nh32VOxpUrg6bV+3Z8Q36Ix3aZdni8v0qoP2rl5wGbotaPtYg5RtyDH60Z2AOPKqlrZg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "19.0.5" - } - }, - "node_modules/@angular/build": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz", - "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.6", - "@babel/core": "7.26.0", - "@babel/helper-annotate-as-pure": "7.25.9", - "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.0.2", - "@vitejs/plugin-basic-ssl": "1.1.0", - "beasties": "0.1.0", - "browserslist": "^4.23.0", - "esbuild": "0.24.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", - "istanbul-lib-instrument": "6.0.3", - "listr2": "8.2.5", - "magic-string": "0.30.12", - "mrmime": "2.0.0", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.7.0", - "rollup": "4.26.0", - "sass": "1.80.7", - "semver": "7.6.3", - "vite": "5.4.11", - "watchpack": "2.4.2" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "optionalDependencies": { - "lmdb": "3.1.5" - }, - "peerDependencies": { - "@angular/compiler": "^19.0.0", - "@angular/compiler-cli": "^19.0.0", - "@angular/localize": "^19.0.0", - "@angular/platform-server": "^19.0.0", - "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.6", - "less": "^4.2.0", - "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { - "@angular/localize": { + "@types/node": { "optional": true }, - "@angular/platform-server": { + "jiti": { "optional": true }, - "@angular/service-worker": { + "less": { "optional": true }, - "@angular/ssr": { + "lightningcss": { "optional": true }, - "less": { + "sass": { "optional": true }, - "postcss": { + "sass-embedded": { "optional": true }, - "tailwindcss": { + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { "optional": true } } }, - "node_modules/@angular/build/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/postcss": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } ], - "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, "engines": { - "node": ">=12" + "node": "^10 || ^12 || >=14" } }, - "node_modules/@angular/build/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1901.7.tgz", + "integrity": "sha512-g7xPN7unBnqP9HsgFvEV1DIhNYmVwmWR9ZiSP0xJq+EjpjWlz2vmgru4a5WKwGeuLsP8vg7RKV0kCH3bunOmFA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "@angular-devkit/architect": "0.1901.7", + "rxjs": "7.8.1" + }, "engines": { - "node": ">=12" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" } }, - "node_modules/@angular/build/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/core": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.7.tgz", + "integrity": "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, "engines": { - "node": ">=12" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@angular/build/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/schematics": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.7.tgz", + "integrity": "sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "@angular-devkit/core": "19.1.7", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, "engines": { - "node": ">=12" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@angular/build/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@angular/animations": { + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.6.tgz", + "integrity": "sha512-iacosz3fygp0AyT57+suVpLChl10xS5RBje09TfQIKHTUY0LWkMspgaK9gwtlflpIhjedPV0UmgRIKhhFcQM1A==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "tslib": "^2.3.0" + }, "engines": { - "node": ">=12" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "19.1.6" } }, - "node_modules/@angular/build/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], + "node_modules/@angular/build": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.7.tgz", + "integrity": "sha512-22SjHZDTk91JHU5aFVDU2n+xkPolDosRVfsK4zs+RRXQs30LYPH9KCLiUWCYjFbRj7oYvw7sbrs94szo7dWYvw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", + "@babel/core": "7.26.0", + "@babel/helper-annotate-as-pure": "7.25.9", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-syntax-import-attributes": "7.26.0", + "@inquirer/confirm": "5.1.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", + "browserslist": "^4.23.0", + "esbuild": "0.24.2", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "listr2": "8.2.5", + "magic-string": "0.30.17", + "mrmime": "2.0.0", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.2", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", + "semver": "7.6.3", + "vite": "6.0.11", + "watchpack": "2.4.2" + }, "engines": { - "node": ">=12" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.2.2" + }, + "peerDependencies": { + "@angular/compiler": "^19.0.0", + "@angular/compiler-cli": "^19.0.0", + "@angular/localize": "^19.0.0", + "@angular/platform-server": "^19.0.0", + "@angular/service-worker": "^19.0.0", + "@angular/ssr": "^19.1.7", + "less": "^4.2.0", + "ng-packagr": "^19.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.8" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + } } }, - "node_modules/@angular/build/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], + "node_modules/@angular/build/node_modules/@inquirer/confirm": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz", + "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" + }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, - "node_modules/@angular/build/node_modules/@inquirer/confirm": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", - "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "node_modules/@angular/build/node_modules/@inquirer/core": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.6.tgz", + "integrity": "sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/build/node_modules/@inquirer/type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", - "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, "license": "MIT", "engines": { @@ -1313,12 +543,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/build/node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, "license": "MIT", "peer": true, @@ -1327,34 +562,105 @@ } }, "node_modules/@angular/build/node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/@angular/build/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/build/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/build/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular/build/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/build/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/build/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/@angular/build/node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -1363,19 +669,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -1396,69 +708,51 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/@angular/build/node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "node_modules/@angular/build/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "node": ">=8" } }, "node_modules/@angular/cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz", - "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.7.tgz", + "integrity": "sha512-qVEy0R4QKQ2QAGfpj2mPVxRxgOVst+rIgZBtLwf/mrbN9YyzJUaBKvaVslUpOqkvoW9mX5myf0iZkT5NykrIoA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.6", - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", - "@inquirer/prompts": "7.1.0", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", + "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.6", + "@schematics/angular": "19.1.7", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", "listr2": "8.2.5", - "npm-package-arg": "12.0.0", + "npm-package-arg": "12.0.1", "npm-pick-manifest": "10.0.0", "pacote": "20.0.0", - "resolve": "1.22.8", + "resolve": "1.22.10", "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -1473,15 +767,15 @@ } }, "node_modules/@angular/cli/node_modules/@inquirer/checkbox": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.4.tgz", - "integrity": "sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.1.tgz", + "integrity": "sha512-os5kFd/52gZTl/W6xqMfhaKVJHQM8V/U1P8jcSaQJ/C4Qhdrf2jEXdA/HaxfQs9iiUA/0yzYhk5d3oRHTxGDDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1490,34 +784,72 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/confirm": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz", - "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.5.tgz", + "integrity": "sha512-ZB2Cz8KeMINUvoeDi7IrvghaVkYT2RB0Zb31EaLWOE87u276w4wnApv0SH2qWaJ3r0VSUa3BIuz7qAV2ZvsZlg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@angular/cli/node_modules/@inquirer/core": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.6.tgz", + "integrity": "sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/editor": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.1.tgz", - "integrity": "sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.6.tgz", + "integrity": "sha512-l0smvr8g/KAVdXx4I92sFxZiaTG4kFc06cFZw+qqwTirwdUHMFLnouXBB9OafWhpO3cfEkEz2CdPoCmor3059A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "external-editor": "^3.1.0" }, "engines": { @@ -1525,17 +857,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/expand": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.4.tgz", - "integrity": "sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.8.tgz", + "integrity": "sha512-k0ouAC6L+0Yoj/j0ys2bat0fYcyFVtItDB7h+pDFKaDDSFJey/C/YY1rmIOqkmFVZ5rZySeAQuS8zLcKkKRLmg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1543,51 +880,66 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/input": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.1.tgz", - "integrity": "sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.5.tgz", + "integrity": "sha512-bB6wR5wBCz5zbIVBPnhp94BHv/G4eKbUEjlpCw676pI2chcvzTx1MuwZSCZ/fgNOdqDlAxkhQ4wagL8BI1D3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/number": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.4.tgz", - "integrity": "sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.8.tgz", + "integrity": "sha512-CTKs+dT1gw8dILVWATn8Ugik1OHLkkfY82J+Musb57KpmF6EKyskv8zmMiEJPzOnLTZLo05X/QdMd8VH9oulXw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/password": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.4.tgz", - "integrity": "sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.8.tgz", + "integrity": "sha512-MgA+Z7o3K1df2lGY649fyOBowHGfrKRz64dx3+b6c1w+h2W7AwBoOkHhhF/vfhbs5S4vsKNCuDzS3s9r5DpK1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2" }, "engines": { @@ -1595,25 +947,30 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/prompts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", - "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.1.tgz", + "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.0.2", - "@inquirer/confirm": "^5.0.2", - "@inquirer/editor": "^4.1.0", - "@inquirer/expand": "^4.0.2", - "@inquirer/input": "^4.0.2", - "@inquirer/number": "^3.0.2", - "@inquirer/password": "^4.0.2", - "@inquirer/rawlist": "^4.0.2", - "@inquirer/search": "^3.0.2", - "@inquirer/select": "^4.0.2" + "@inquirer/checkbox": "^4.0.4", + "@inquirer/confirm": "^5.1.1", + "@inquirer/editor": "^4.2.1", + "@inquirer/expand": "^4.0.4", + "@inquirer/input": "^4.1.1", + "@inquirer/number": "^3.0.4", + "@inquirer/password": "^4.0.4", + "@inquirer/rawlist": "^4.0.4", + "@inquirer/search": "^3.0.4", + "@inquirer/select": "^4.0.4" }, "engines": { "node": ">=18" @@ -1623,14 +980,14 @@ } }, "node_modules/@angular/cli/node_modules/@inquirer/rawlist": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.4.tgz", - "integrity": "sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.8.tgz", + "integrity": "sha512-hl7rvYW7Xl4un8uohQRUgO6uc2hpn7PKqfcGkCOWC0AA4waBxAv6MpGOFCEDrUaBCP+pXPVqp4LmnpWmn1E1+g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1638,18 +995,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/search": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.4.tgz", - "integrity": "sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.8.tgz", + "integrity": "sha512-ihSE9D3xQAupNg/aGDZaukqoUSXG2KfstWosVmFCG7jbMQPaj2ivxWtsB+CnYY/T4D6LX1GHKixwJLunNCffww==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1657,18 +1019,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/select": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.4.tgz", - "integrity": "sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.8.tgz", + "integrity": "sha512-Io2prxFyN2jOCcu4qJbVoilo19caiD3kqkD3WR0q3yDA5HUCo83v4LrRtg55ZwniYACW64z36eV7gyVbOfORjA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1677,12 +1044,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", - "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, "license": "MIT", "engines": { @@ -1690,6 +1062,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@listr2/prompt-adapter-inquirer": { @@ -1721,10 +1098,20 @@ "node": ">=18" } }, + "node_modules/@angular/cli/node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@angular/cli/node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, "license": "MIT", "peer": true, @@ -1748,20 +1135,80 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/cli/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "node_modules/@angular/cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" + } + }, + "node_modules/@angular/cli/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular/cli/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/cli/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@angular/common": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz", - "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.6.tgz", + "integrity": "sha512-FkuejwbxsOLhcyOgDM/7YEYvMG3tuyOvr+831VzPwMwYp5QO9AUYtn4ffGf698JccbA+Ocw3BAdhPU6i+YZC1A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1770,14 +1217,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5", + "@angular/core": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz", - "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.6.tgz", + "integrity": "sha512-Tl2PFEtnU8UgSqtEKG827xDUGZrErhR6S1JICeV1kbRCYmwQA4hhG25tzi+ifSAOPW7eJiyzP2LWIvOuZkq3Vw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1786,7 +1233,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -1795,9 +1242,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz", - "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.6.tgz", + "integrity": "sha512-rTpHC/tfLBj+5a3X+BA/4s2w5T/cHT6x3RgO8CYy7003Musn0/BiqjfE6VCIllQgLaOQRhCcf51T6Kerkzv8Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -1819,14 +1266,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.5", - "typescript": ">=5.5 <5.7" + "@angular/compiler": "19.1.6", + "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz", - "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.6.tgz", + "integrity": "sha512-FD167URT+apxjzj9sG/MzffW5G6YyQiPQ6nrrIoYi9jeY3LYurybuOgvcXrU8PT4Z3+CKMq9k/ZnmrlHU72BpA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1840,9 +1287,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz", - "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.6.tgz", + "integrity": "sha512-uu/76KAwCAcDuhD67Vv78UvOC/tiprtFXOgqNCj0LK8vyFcvPsunb3nF/PtfF9rSHyslXAqxZhME+Ha2tU6Lpw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1851,16 +1298,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz", - "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.6.tgz", + "integrity": "sha512-sfWU+gMpqQ6GYtE3tAfDktftC01NgtqAOKfeCQ/KY2rxRTIxYahenW0Licuzgmd+8AZtmncoZaYX0Fd/5XMqzQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1869,9 +1316,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.5", - "@angular/common": "19.0.5", - "@angular/core": "19.0.5" + "@angular/animations": "19.1.6", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1880,9 +1327,9 @@ } }, "node_modules/@angular/router": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.5.tgz", - "integrity": "sha512-6tNubVVj/rRyTg+OXjQxACfufvCLHAwDQtv9wqt6q/3OYSnysHTik3ho3FaFPwu7fXJ+6p9Rjzkh2VY9QMk4bw==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.6.tgz", + "integrity": "sha512-TEfw3W5jVodVDMD4krhXGog1THZN3x1yoh2oZmCv3lXg22+pVC6Cp+x3vVExq0mS+g3/6uZwy/3qAYdlzqYjTg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1891,9 +1338,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1913,9 +1360,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { @@ -1971,14 +1418,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", - "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.2", - "@babel/types": "^7.26.0", + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -2001,13 +1448,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -2028,18 +1475,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", + "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/traverse": "^7.26.9", "semver": "^6.3.1" }, "engines": { @@ -2164,9 +1611,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "license": "MIT", "engines": { @@ -2192,15 +1639,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2282,27 +1729,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -2510,13 +1957,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2728,13 +2175,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { @@ -2930,13 +2377,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -3227,13 +2674,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -3243,13 +2690,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -3448,32 +2895,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -3482,14 +2929,14 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -3499,9 +2946,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, "license": "MIT", "dependencies": { @@ -3557,9 +3004,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -3574,9 +3021,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -3591,9 +3038,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -3608,9 +3055,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -3625,9 +3072,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -3642,9 +3089,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -3659,9 +3106,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -3676,9 +3123,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -3693,9 +3140,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -3710,9 +3157,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -3727,9 +3174,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -3744,9 +3191,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -3761,9 +3208,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -3778,9 +3225,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -3795,9 +3242,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -3812,9 +3259,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -3828,27 +3275,44 @@ "node": ">=18" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "netbsd" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -3863,9 +3327,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], @@ -3880,9 +3344,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -3897,9 +3361,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -3914,9 +3378,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -3931,9 +3395,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -3948,9 +3412,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -3964,141 +3428,10 @@ "node": ">=18" } }, - "node_modules/@inquirer/core": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.2.tgz", - "integrity": "sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core/node_modules/@inquirer/type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", - "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@inquirer/core/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@inquirer/core/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/core/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@inquirer/core/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/core/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/core/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@inquirer/figures": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", - "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", + "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", "dev": true, "license": "MIT", "engines": { @@ -4331,9 +3664,9 @@ "license": "MIT" }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", - "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz", + "integrity": "sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g==", "cpu": [ "arm64" ], @@ -4345,9 +3678,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", - "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz", + "integrity": "sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA==", "cpu": [ "x64" ], @@ -4359,9 +3692,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", - "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz", + "integrity": "sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA==", "cpu": [ "arm" ], @@ -4373,9 +3706,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", - "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz", + "integrity": "sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g==", "cpu": [ "arm64" ], @@ -4387,9 +3720,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", - "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz", + "integrity": "sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw==", "cpu": [ "x64" ], @@ -4401,9 +3734,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", - "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz", + "integrity": "sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ==", "cpu": [ "x64" ], @@ -4804,9 +4137,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.0.6.tgz", - "integrity": "sha512-eWrIb0tS1CK6+JvFS4GgTD4fN9TtmApKrlaj3pPQXKXKKd42361ec85fuQQXdb4G8eEEq0vyd/bn4NJllh/3vw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.1.7.tgz", + "integrity": "sha512-U39LVqHWj+GtKzBA3+AseHZgLPlL5YE/iRkZJ4PHQVrgW9LtyMzPuUmnW+e0XQwPFHq9xQxaoj3w8gApj4/MIg==", "dev": true, "license": "MIT", "engines": { @@ -4816,7 +4149,7 @@ }, "peerDependencies": { "@angular/compiler-cli": "^19.0.0", - "typescript": ">=5.5 <5.7", + "typescript": ">=5.5 <5.8", "webpack": "^5.54.0" } }, @@ -4977,9 +4310,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz", - "integrity": "sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.1.tgz", + "integrity": "sha512-d5qimadRAUCO4A/Txw71VM7UrRZzV+NPclxz/dc+M6B2oYwjWTjqh8HA/sGQgs9VZuJ6I/P7XIAlJvgrl27ZOw==", "dev": true, "license": "ISC", "dependencies": { @@ -4987,9 +4320,9 @@ "glob": "^10.2.2", "hosted-git-info": "^8.0.0", "json-parse-even-better-errors": "^4.0.0", - "normalize-package-data": "^7.0.0", "proc-log": "^5.0.0", - "semver": "^7.5.3" + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -5082,9 +4415,9 @@ } }, "node_modules/@npmcli/redact": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz", - "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz", + "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==", "dev": true, "license": "ISC", "engines": { @@ -5136,9 +4469,9 @@ } }, "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5157,25 +4490,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" } }, "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", "cpu": [ "arm64" ], @@ -5194,9 +4527,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", "cpu": [ "arm64" ], @@ -5215,9 +4548,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", "cpu": [ "x64" ], @@ -5236,9 +4569,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", "cpu": [ "x64" ], @@ -5257,9 +4590,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", "cpu": [ "arm" ], @@ -5278,9 +4611,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", "cpu": [ "arm" ], @@ -5299,9 +4632,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", "cpu": [ "arm64" ], @@ -5320,9 +4653,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", "cpu": [ "arm64" ], @@ -5341,9 +4674,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", "cpu": [ "x64" ], @@ -5362,9 +4695,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", "cpu": [ "x64" ], @@ -5383,9 +4716,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", "cpu": [ "arm64" ], @@ -5404,9 +4737,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", "cpu": [ "ia32" ], @@ -5425,9 +4758,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", "cpu": [ "x64" ], @@ -5479,9 +4812,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", "cpu": [ "arm" ], @@ -5493,9 +4826,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", "cpu": [ "arm64" ], @@ -5507,9 +4840,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", "cpu": [ "arm64" ], @@ -5521,9 +4854,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", "cpu": [ "x64" ], @@ -5535,9 +4868,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", "cpu": [ "arm64" ], @@ -5549,9 +4882,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", "cpu": [ "x64" ], @@ -5563,9 +4896,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", "cpu": [ "arm" ], @@ -5577,9 +4910,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", "cpu": [ "arm" ], @@ -5591,9 +4924,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", "cpu": [ "arm64" ], @@ -5605,9 +4938,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", "cpu": [ "arm64" ], @@ -5618,10 +4951,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", "cpu": [ "ppc64" ], @@ -5633,9 +4980,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", "cpu": [ "riscv64" ], @@ -5647,9 +4994,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", "cpu": [ "s390x" ], @@ -5661,9 +5008,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", "cpu": [ "x64" ], @@ -5675,9 +5022,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", "cpu": [ "x64" ], @@ -5689,9 +5036,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", "cpu": [ "arm64" ], @@ -5703,9 +5050,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", "cpu": [ "ia32" ], @@ -5717,9 +5064,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", "cpu": [ "x64" ], @@ -5731,14 +5078,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz", - "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.7.tgz", + "integrity": "sha512-BB8yMGmYDZzSb8Nu+Ln0TKyeoS3++f9STCYw30NwM3IViHxJJYxu/zowzwSa9TjftIzdCpbOaPxGS0vU9UOUDQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -5748,13 +5095,13 @@ } }, "node_modules/@sigstore/bundle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", - "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", + "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -5771,26 +5118,26 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz", + "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/sign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", - "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", + "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^14.0.1", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", "proc-log": "^5.0.0", "promise-retry": "^2.0.1" }, @@ -5799,13 +5146,13 @@ } }, "node_modules/@sigstore/tuf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", - "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.0.tgz", + "integrity": "sha512-suVMQEA+sKdOz5hwP9qNcEjX6B45R+hFFr4LAWzbRc5O+U2IInwvay/bpG5a4s+qR35P/JK/PiKiRGjfuLy1IA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/protobuf-specs": "^0.4.0", "tuf-js": "^3.0.1" }, "engines": { @@ -5813,15 +5160,15 @@ } }, "node_modules/@sigstore/verify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", - "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.0.tgz", + "integrity": "sha512-kAAM06ca4CzhvjIZdONAL9+MLppW3K48wOFy1TbuaWFW/OMfl8JuTgW0Bm02JB1WJGT/ET2eqav0KTEKmxqkIA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -5967,13 +5314,6 @@ "@types/node": "*" } }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/cors": { "version": "2.8.17", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", @@ -6027,9 +5367,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.3.tgz", - "integrity": "sha512-JEhMNwUJt7bw728CydvYzntD0XJeTmDnvwLlbfbAhE7Tbslm/ax6bdIiUwTgeVlZTsJQPwZwKpAkyDtIjsvx3g==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "dev": true, "license": "MIT", "dependencies": { @@ -6060,9 +5400,9 @@ "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", "dev": true, "license": "MIT", "dependencies": { @@ -6070,9 +5410,9 @@ } }, "node_modules/@types/jasmine": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.5.tgz", - "integrity": "sha512-SaCZ3kM5NjOiJqMRYwHpLbTfUC2Dyk1KS3QanNFsUYPGTk70CWVK/J9ueun6zNhw/UkgV7xl8V4ZLQZNRbfnNw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.6.tgz", + "integrity": "sha512-JDwKwipGFDwf021BtRTuluYe1aMDNimtO72ygPrVXnZSC8Df2V22AHeIgGa84tbF4SLkRvN+dJnlV8aMwQjkVw==", "dev": true, "license": "MIT" }, @@ -6091,9 +5431,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "16.18.123", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.123.tgz", - "integrity": "sha512-/n7I6V/4agSpJtFDKKFEa763Hc1z3hmvchobHS1TisCOTKD5nxq8NJ2iK7SRIMYL276Q9mgWOx2AWp5n2XI6eA==", + "version": "16.18.126", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", "dev": true, "license": "MIT" }, @@ -6115,9 +5455,9 @@ "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", "dev": true, "license": "MIT" }, @@ -6186,9 +5526,9 @@ } }, "node_modules/@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz", + "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==", "dev": true, "license": "MIT", "dependencies": { @@ -6378,13 +5718,13 @@ "license": "BSD-2-Clause" }, "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", + "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/accepts": { @@ -6891,9 +6231,9 @@ } }, "node_modules/beasties": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", - "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz", + "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6901,10 +6241,13 @@ "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "htmlparser2": "^9.0.0", + "htmlparser2": "^9.1.0", "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/big.js": { @@ -7068,9 +6411,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -7338,9 +6681,9 @@ } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7389,9 +6732,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", "dev": true, "funding": [ { @@ -7736,9 +7079,9 @@ } }, "node_modules/compression": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", - "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", "dev": true, "license": "MIT", "dependencies": { @@ -8051,13 +7394,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.24.2" + "browserslist": "^4.24.3" }, "funding": { "type": "opencollective", @@ -8531,9 +7874,9 @@ } }, "node_modules/domutils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", - "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -8593,9 +7936,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.76", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", - "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "version": "1.5.100", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.100.tgz", + "integrity": "sha512-u1z9VuzDXV86X2r3vAns0/5ojfXBue9o0+JDUDBKYqGLjxLkSqsSUoPU/6kW0gx76V44frHaf6Zo+QF74TQCMg==", "dev": true, "license": "ISC" }, @@ -8652,13 +7995,12 @@ } }, "node_modules/engine.io": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", - "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", "dev": true, "license": "MIT", "dependencies": { - "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", @@ -8702,9 +8044,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", - "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "dev": true, "license": "MIT", "dependencies": { @@ -8826,9 +8168,9 @@ "license": "MIT" }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "license": "MIT", "dependencies": { @@ -8856,9 +8198,9 @@ } }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -8869,36 +8211,37 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/esbuild-wasm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.24.0.tgz", - "integrity": "sha512-xhNn5tL1AhkPg4ft59yXT6FkwKXiPSYyz1IeinJHUJpjvOHOIPvdmFQc0pGdjxlKSbzZc2mNmtVOWAR1EF/JAg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.24.2.tgz", + "integrity": "sha512-03/7Z1gD+ohDnScFztvI4XddTAbKVmMEzCvvkBpQdWKEXJ+73dTyeNrmdxP1Q0zpDMFjzUJwtK4rLjqwiHbzkw==", "dev": true, "license": "MIT", "bin": { @@ -9029,9 +8372,9 @@ } }, "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true, "license": "Apache-2.0" }, @@ -9201,9 +8544,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -9211,7 +8554,7 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -9238,9 +8581,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", - "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, "funding": [ { @@ -9255,9 +8598,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, "license": "ISC", "dependencies": { @@ -9682,18 +9025,18 @@ } }, "node_modules/globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", "dev": true, "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" + "unicorn-magic": "^0.3.0" }, "engines": { "node": ">=18" @@ -9926,23 +9269,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -10012,9 +9338,9 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", + "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", "dev": true, "license": "MIT" }, @@ -10082,13 +9408,13 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -10153,9 +9479,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", + "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", "dev": true, "license": "MIT", "engines": { @@ -10230,9 +9556,9 @@ "license": "MIT" }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10727,9 +10053,9 @@ } }, "node_modules/jasmine-core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.5.0.tgz", - "integrity": "sha512-NHOvoPO6o9gVR6pwqEACTEpbgcH+JJ6QDypyymGbSUIFIFsMMbBJ/xsFNud8MSClfnWclXd7RQlAZBz7yVo5TQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.6.0.tgz", + "integrity": "sha512-niVlkeYVRwKFpmfWg6suo6H9CrNnydfBLEqefM5UjibYS+UoTjZdmvPJSiuyrRLGnFj1eYRhFd/ch+5hSlsFVA==", "dev": true, "license": "MIT" }, @@ -11356,9 +10682,9 @@ } }, "node_modules/less": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", - "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.1.tgz", + "integrity": "sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -11532,9 +10858,9 @@ "license": "MIT" }, "node_modules/lmdb": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", - "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.2.tgz", + "integrity": "sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -11550,12 +10876,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.1.5", - "@lmdb/lmdb-darwin-x64": "3.1.5", - "@lmdb/lmdb-linux-arm": "3.1.5", - "@lmdb/lmdb-linux-arm64": "3.1.5", - "@lmdb/lmdb-linux-x64": "3.1.5", - "@lmdb/lmdb-win32-x64": "3.1.5" + "@lmdb/lmdb-darwin-arm64": "3.2.2", + "@lmdb/lmdb-darwin-x64": "3.2.2", + "@lmdb/lmdb-linux-arm": "3.2.2", + "@lmdb/lmdb-linux-arm64": "3.2.2", + "@lmdb/lmdb-linux-x64": "3.2.2", + "@lmdb/lmdb-win32-x64": "3.2.2" } }, "node_modules/loader-runner": { @@ -11719,9 +11045,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { @@ -11795,9 +11121,9 @@ } }, "node_modules/memfs": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.15.3.tgz", - "integrity": "sha512-vR/g1SgqvKJgAyYla+06G4p/EOcEmwhYuVb1yc1ixcKf8o/sh7Zngv63957ZSNd1xrZJoinmNyDf2LzuP8WJXw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz", + "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -12380,9 +11706,9 @@ } }, "node_modules/node-gyp": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz", - "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.1.0.tgz", + "integrity": "sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12566,13 +11892,13 @@ } }, "node_modules/nopt": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", - "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "dev": true, "license": "ISC", "dependencies": { - "abbrev": "^2.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" @@ -12581,21 +11907,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/normalize-package-data": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz", - "integrity": "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^8.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -12653,9 +11964,9 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz", + "integrity": "sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==", "dev": true, "license": "ISC", "dependencies": { @@ -12751,9 +12062,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { @@ -13258,13 +12569,13 @@ "license": "MIT" }, "node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -13331,9 +12642,9 @@ } }, "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -13488,9 +12799,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, "license": "MIT", "dependencies": { @@ -14083,13 +13394,13 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -14141,9 +13452,9 @@ } }, "node_modules/regex-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", - "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", "dev": true, "license": "MIT" }, @@ -14276,19 +13587,22 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14408,9 +13722,9 @@ } }, "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, "license": "MIT", "dependencies": { @@ -14424,24 +13738,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", "fsevents": "~2.3.2" } }, @@ -14538,9 +13853,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.80.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", - "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz", + "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==", "dev": true, "license": "MIT", "dependencies": { @@ -14559,9 +13874,9 @@ } }, "node_modules/sass-loader": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.3.tgz", - "integrity": "sha512-gosNorT1RCkuCMyihv6FBRR7BMV06oKRAs+l4UMp1mlcVg9rWN6KMmUj3igjQwmYys4mDP3etEYJgiHRbgHCHA==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.4.tgz", + "integrity": "sha512-LavLbgbBGUt3wCiYzhuLLu65+fWXaXLmq7YxivLhEqmiupCFZ5sKUAipK3do6V80YSU0jvSxNhEdT13IXNr3rg==", "dev": true, "license": "MIT", "dependencies": { @@ -15107,18 +14422,18 @@ } }, "node_modules/sigstore": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", - "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", + "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^3.0.0", - "@sigstore/tuf": "^3.0.0", - "@sigstore/verify": "^2.0.0" + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -15299,9 +14614,9 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15433,9 +14748,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "dev": true, "license": "CC0-1.0" }, @@ -15830,9 +15145,9 @@ "license": "ISC" }, "node_modules/terser": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", - "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -16158,9 +15473,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -16251,9 +15566,9 @@ } }, "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, "license": "MIT", "engines": { @@ -16320,9 +15635,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, "funding": [ { @@ -16341,7 +15656,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -16642,17 +15957,17 @@ } }, "node_modules/webpack": { - "version": "5.96.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", - "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.14.0", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", @@ -16719,9 +16034,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", - "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.0.tgz", + "integrity": "sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==", "dev": true, "license": "MIT", "dependencies": { @@ -16738,10 +16053,9 @@ "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "express": "^4.19.2", + "express": "^4.21.2", "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", + "http-proxy-middleware": "^2.0.7", "ipaddr.js": "^2.1.0", "launch-editor": "^2.6.1", "open": "^10.0.3", diff --git a/adev/src/content/tutorials/first-app/common/package.json b/adev/src/content/tutorials/first-app/common/package.json index 0dfa7e512dd6..e22e4fdc50d6 100644 --- a/adev/src/content/tutorials/first-app/common/package.json +++ b/adev/src/content/tutorials/first-app/common/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "NG_BUILD_PARALLEL_TS=0 ng serve", + "start": "ng serve", "build": "ng build", "watch": "ng build --watch --configuration development" }, @@ -27,7 +27,7 @@ "@types/jasmine": "~5.1.0", "@types/node": "^16.11.35", "copyfiles": "^2.4.1", - "jasmine-core": "~5.5.0", + "jasmine-core": "~5.6.0", "jasmine-marbles": "~0.9.2", "jasmine-spec-reporter": "~7.0.0", "karma": "~6.4.0", @@ -37,6 +37,6 @@ "karma-jasmine-html-reporter": "~2.1.0", "protractor": "~7.0.0", "ts-node": "~10.9.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } } diff --git a/adev/src/content/tutorials/homepage/package-lock.json b/adev/src/content/tutorials/homepage/package-lock.json index 905976928e16..6efd17b737d1 100644 --- a/adev/src/content/tutorials/homepage/package-lock.json +++ b/adev/src/content/tutorials/homepage/package-lock.json @@ -21,7 +21,7 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } }, "node_modules/@ampproject/remapping": { @@ -39,13 +39,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1900.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz", - "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==", + "version": "0.1901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.7.tgz", + "integrity": "sha512-qltyebfbej7joIKZVH8EFfrVDrkw0p9N9ja3A0XeU1sl2vlepHNAQdVm0Os8Vy2XjjyHvT5bXWE3G3/221qEKw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.1.7", "rxjs": "7.8.1" }, "engines": { @@ -55,9 +55,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", - "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.7.tgz", + "integrity": "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -83,15 +83,15 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz", - "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.7.tgz", + "integrity": "sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.1.7", "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -102,36 +102,37 @@ } }, "node_modules/@angular/build": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz", - "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.7.tgz", + "integrity": "sha512-22SjHZDTk91JHU5aFVDU2n+xkPolDosRVfsK4zs+RRXQs30LYPH9KCLiUWCYjFbRj7oYvw7sbrs94szo7dWYvw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.6", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.0.2", - "@vitejs/plugin-basic-ssl": "1.1.0", - "beasties": "0.1.0", + "@inquirer/confirm": "5.1.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", "browserslist": "^4.23.0", - "esbuild": "0.24.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", + "esbuild": "0.24.2", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", "listr2": "8.2.5", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "mrmime": "2.0.0", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.7.0", - "rollup": "4.26.0", - "sass": "1.80.7", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", "semver": "7.6.3", - "vite": "5.4.11", + "vite": "6.0.11", "watchpack": "2.4.2" }, "engines": { @@ -140,7 +141,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.1.5" + "lmdb": "3.2.2" }, "peerDependencies": { "@angular/compiler": "^19.0.0", @@ -148,11 +149,12 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.6", + "@angular/ssr": "^19.1.7", "less": "^4.2.0", + "ng-packagr": "^19.0.0", "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -170,6 +172,9 @@ "less": { "optional": true }, + "ng-packagr": { + "optional": true + }, "postcss": { "optional": true }, @@ -179,26 +184,26 @@ } }, "node_modules/@angular/cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz", - "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.7.tgz", + "integrity": "sha512-qVEy0R4QKQ2QAGfpj2mPVxRxgOVst+rIgZBtLwf/mrbN9YyzJUaBKvaVslUpOqkvoW9mX5myf0iZkT5NykrIoA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.6", - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", - "@inquirer/prompts": "7.1.0", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", + "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.6", + "@schematics/angular": "19.1.7", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", "listr2": "8.2.5", - "npm-package-arg": "12.0.0", + "npm-package-arg": "12.0.1", "npm-pick-manifest": "10.0.0", "pacote": "20.0.0", - "resolve": "1.22.8", + "resolve": "1.22.10", "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -213,9 +218,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz", - "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.6.tgz", + "integrity": "sha512-FkuejwbxsOLhcyOgDM/7YEYvMG3tuyOvr+831VzPwMwYp5QO9AUYtn4ffGf698JccbA+Ocw3BAdhPU6i+YZC1A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -224,14 +229,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5", + "@angular/core": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz", - "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.6.tgz", + "integrity": "sha512-Tl2PFEtnU8UgSqtEKG827xDUGZrErhR6S1JICeV1kbRCYmwQA4hhG25tzi+ifSAOPW7eJiyzP2LWIvOuZkq3Vw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -240,7 +245,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -249,9 +254,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz", - "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.6.tgz", + "integrity": "sha512-rTpHC/tfLBj+5a3X+BA/4s2w5T/cHT6x3RgO8CYy7003Musn0/BiqjfE6VCIllQgLaOQRhCcf51T6Kerkzv8Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -273,14 +278,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.5", - "typescript": ">=5.5 <5.7" + "@angular/compiler": "19.1.6", + "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz", - "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.6.tgz", + "integrity": "sha512-FD167URT+apxjzj9sG/MzffW5G6YyQiPQ6nrrIoYi9jeY3LYurybuOgvcXrU8PT4Z3+CKMq9k/ZnmrlHU72BpA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -294,9 +299,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz", - "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.6.tgz", + "integrity": "sha512-uu/76KAwCAcDuhD67Vv78UvOC/tiprtFXOgqNCj0LK8vyFcvPsunb3nF/PtfF9rSHyslXAqxZhME+Ha2tU6Lpw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -305,16 +310,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz", - "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.6.tgz", + "integrity": "sha512-sfWU+gMpqQ6GYtE3tAfDktftC01NgtqAOKfeCQ/KY2rxRTIxYahenW0Licuzgmd+8AZtmncoZaYX0Fd/5XMqzQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -323,9 +328,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.5", - "@angular/common": "19.0.5", - "@angular/core": "19.0.5" + "@angular/animations": "19.1.6", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -349,9 +354,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { @@ -407,14 +412,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -437,13 +442,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -496,9 +501,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "license": "MIT", "engines": { @@ -549,27 +554,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -595,32 +600,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -629,9 +634,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, "license": "MIT", "dependencies": { @@ -643,9 +648,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -660,9 +665,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -677,9 +682,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -694,9 +699,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -711,9 +716,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -728,9 +733,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -745,9 +750,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -762,9 +767,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -779,9 +784,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -796,9 +801,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -813,9 +818,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -830,9 +835,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -847,9 +852,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -864,9 +869,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -881,9 +886,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -898,9 +903,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -915,9 +920,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -931,10 +936,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -949,9 +971,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], @@ -966,9 +988,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -983,9 +1005,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -1000,9 +1022,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -1017,9 +1039,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -1034,9 +1056,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -1051,15 +1073,15 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.4.tgz", - "integrity": "sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.1.tgz", + "integrity": "sha512-os5kFd/52gZTl/W6xqMfhaKVJHQM8V/U1P8jcSaQJ/C4Qhdrf2jEXdA/HaxfQs9iiUA/0yzYhk5d3oRHTxGDDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1068,17 +1090,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/confirm": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", - "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz", + "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" }, "engines": { "node": ">=18" @@ -1088,35 +1115,42 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.2.tgz", - "integrity": "sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==", + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.6.tgz", + "integrity": "sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/editor": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.1.tgz", - "integrity": "sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.6.tgz", + "integrity": "sha512-l0smvr8g/KAVdXx4I92sFxZiaTG4kFc06cFZw+qqwTirwdUHMFLnouXBB9OafWhpO3cfEkEz2CdPoCmor3059A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "external-editor": "^3.1.0" }, "engines": { @@ -1124,17 +1158,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/expand": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.4.tgz", - "integrity": "sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.8.tgz", + "integrity": "sha512-k0ouAC6L+0Yoj/j0ys2bat0fYcyFVtItDB7h+pDFKaDDSFJey/C/YY1rmIOqkmFVZ5rZySeAQuS8zLcKkKRLmg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1142,12 +1181,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/figures": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", - "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", + "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", "dev": true, "license": "MIT", "engines": { @@ -1155,48 +1199,58 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.1.tgz", - "integrity": "sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.5.tgz", + "integrity": "sha512-bB6wR5wBCz5zbIVBPnhp94BHv/G4eKbUEjlpCw676pI2chcvzTx1MuwZSCZ/fgNOdqDlAxkhQ4wagL8BI1D3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/number": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.4.tgz", - "integrity": "sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.8.tgz", + "integrity": "sha512-CTKs+dT1gw8dILVWATn8Ugik1OHLkkfY82J+Musb57KpmF6EKyskv8zmMiEJPzOnLTZLo05X/QdMd8VH9oulXw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/password": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.4.tgz", - "integrity": "sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.8.tgz", + "integrity": "sha512-MgA+Z7o3K1df2lGY649fyOBowHGfrKRz64dx3+b6c1w+h2W7AwBoOkHhhF/vfhbs5S4vsKNCuDzS3s9r5DpK1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2" }, "engines": { @@ -1204,25 +1258,30 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/prompts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", - "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.1.tgz", + "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.0.2", - "@inquirer/confirm": "^5.0.2", - "@inquirer/editor": "^4.1.0", - "@inquirer/expand": "^4.0.2", - "@inquirer/input": "^4.0.2", - "@inquirer/number": "^3.0.2", - "@inquirer/password": "^4.0.2", - "@inquirer/rawlist": "^4.0.2", - "@inquirer/search": "^3.0.2", - "@inquirer/select": "^4.0.2" + "@inquirer/checkbox": "^4.0.4", + "@inquirer/confirm": "^5.1.1", + "@inquirer/editor": "^4.2.1", + "@inquirer/expand": "^4.0.4", + "@inquirer/input": "^4.1.1", + "@inquirer/number": "^3.0.4", + "@inquirer/password": "^4.0.4", + "@inquirer/rawlist": "^4.0.4", + "@inquirer/search": "^3.0.4", + "@inquirer/select": "^4.0.4" }, "engines": { "node": ">=18" @@ -1232,14 +1291,14 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.4.tgz", - "integrity": "sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.8.tgz", + "integrity": "sha512-hl7rvYW7Xl4un8uohQRUgO6uc2hpn7PKqfcGkCOWC0AA4waBxAv6MpGOFCEDrUaBCP+pXPVqp4LmnpWmn1E1+g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1247,18 +1306,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/search": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.4.tgz", - "integrity": "sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.8.tgz", + "integrity": "sha512-ihSE9D3xQAupNg/aGDZaukqoUSXG2KfstWosVmFCG7jbMQPaj2ivxWtsB+CnYY/T4D6LX1GHKixwJLunNCffww==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1266,18 +1330,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/select": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.4.tgz", - "integrity": "sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.8.tgz", + "integrity": "sha512-Io2prxFyN2jOCcu4qJbVoilo19caiD3kqkD3WR0q3yDA5HUCo83v4LrRtg55ZwniYACW64z36eV7gyVbOfORjA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1286,12 +1355,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", - "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, "license": "MIT", "engines": { @@ -1299,6 +1373,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@isaacs/cliui": { @@ -1319,19 +1398,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -1370,22 +1436,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -1520,9 +1570,9 @@ } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", - "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz", + "integrity": "sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g==", "cpu": [ "arm64" ], @@ -1534,9 +1584,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", - "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz", + "integrity": "sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA==", "cpu": [ "x64" ], @@ -1548,9 +1598,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", - "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz", + "integrity": "sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA==", "cpu": [ "arm" ], @@ -1562,9 +1612,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", - "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz", + "integrity": "sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g==", "cpu": [ "arm64" ], @@ -1576,9 +1626,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", - "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz", + "integrity": "sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw==", "cpu": [ "x64" ], @@ -1590,9 +1640,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", - "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz", + "integrity": "sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ==", "cpu": [ "x64" ], @@ -2123,9 +2173,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz", - "integrity": "sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.1.tgz", + "integrity": "sha512-d5qimadRAUCO4A/Txw71VM7UrRZzV+NPclxz/dc+M6B2oYwjWTjqh8HA/sGQgs9VZuJ6I/P7XIAlJvgrl27ZOw==", "dev": true, "license": "ISC", "dependencies": { @@ -2133,9 +2183,9 @@ "glob": "^10.2.2", "hosted-git-info": "^8.0.0", "json-parse-even-better-errors": "^4.0.0", - "normalize-package-data": "^7.0.0", "proc-log": "^5.0.0", - "semver": "^7.5.3" + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2155,9 +2205,9 @@ } }, "node_modules/@npmcli/redact": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz", - "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz", + "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==", "dev": true, "license": "ISC", "engines": { @@ -2183,9 +2233,9 @@ } }, "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2204,25 +2254,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" } }, "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", "cpu": [ "arm64" ], @@ -2241,9 +2291,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", "cpu": [ "arm64" ], @@ -2262,9 +2312,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", "cpu": [ "x64" ], @@ -2283,9 +2333,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", "cpu": [ "x64" ], @@ -2304,9 +2354,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", "cpu": [ "arm" ], @@ -2325,9 +2375,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", "cpu": [ "arm" ], @@ -2346,9 +2396,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", "cpu": [ "arm64" ], @@ -2367,9 +2417,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", "cpu": [ "arm64" ], @@ -2388,9 +2438,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", "cpu": [ "x64" ], @@ -2409,9 +2459,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", "cpu": [ "x64" ], @@ -2430,9 +2480,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", "cpu": [ "arm64" ], @@ -2451,9 +2501,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", "cpu": [ "ia32" ], @@ -2472,9 +2522,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", "cpu": [ "x64" ], @@ -2526,9 +2576,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", "cpu": [ "arm" ], @@ -2540,9 +2590,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", "cpu": [ "arm64" ], @@ -2554,9 +2604,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", "cpu": [ "arm64" ], @@ -2568,9 +2618,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", "cpu": [ "x64" ], @@ -2582,9 +2632,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", "cpu": [ "arm64" ], @@ -2596,9 +2646,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", "cpu": [ "x64" ], @@ -2610,9 +2660,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", "cpu": [ "arm" ], @@ -2624,9 +2674,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", "cpu": [ "arm" ], @@ -2638,9 +2688,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", "cpu": [ "arm64" ], @@ -2652,9 +2702,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", "cpu": [ "arm64" ], @@ -2665,10 +2715,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", "cpu": [ "ppc64" ], @@ -2680,9 +2744,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", "cpu": [ "riscv64" ], @@ -2694,9 +2758,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", "cpu": [ "s390x" ], @@ -2708,9 +2772,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", "cpu": [ "x64" ], @@ -2722,9 +2786,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", "cpu": [ "x64" ], @@ -2736,9 +2800,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", "cpu": [ "arm64" ], @@ -2750,9 +2814,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", "cpu": [ "ia32" ], @@ -2764,9 +2828,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", "cpu": [ "x64" ], @@ -2778,14 +2842,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz", - "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.7.tgz", + "integrity": "sha512-BB8yMGmYDZzSb8Nu+Ln0TKyeoS3++f9STCYw30NwM3IViHxJJYxu/zowzwSa9TjftIzdCpbOaPxGS0vU9UOUDQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -2795,13 +2859,13 @@ } }, "node_modules/@sigstore/bundle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", - "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", + "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2818,26 +2882,26 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz", + "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/sign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", - "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", + "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^14.0.1", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", "proc-log": "^5.0.0", "promise-retry": "^2.0.1" }, @@ -2846,13 +2910,13 @@ } }, "node_modules/@sigstore/tuf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", - "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.0.tgz", + "integrity": "sha512-suVMQEA+sKdOz5hwP9qNcEjX6B45R+hFFr4LAWzbRc5O+U2IInwvay/bpG5a4s+qR35P/JK/PiKiRGjfuLy1IA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/protobuf-specs": "^0.4.0", "tuf-js": "^3.0.1" }, "engines": { @@ -2860,15 +2924,15 @@ } }, "node_modules/@sigstore/verify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", - "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.0.tgz", + "integrity": "sha512-kAAM06ca4CzhvjIZdONAL9+MLppW3K48wOFy1TbuaWFW/OMfl8JuTgW0Bm02JB1WJGT/ET2eqav0KTEKmxqkIA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2906,9 +2970,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, "license": "MIT", "peer": true, @@ -2917,16 +2981,16 @@ } }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@yarnpkg/lockfile": { @@ -2937,13 +3001,13 @@ "license": "BSD-2-Clause" }, "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", + "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/agent-base": { @@ -3008,13 +3072,16 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -3062,9 +3129,9 @@ "license": "MIT" }, "node_modules/beasties": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", - "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz", + "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3072,10 +3139,13 @@ "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "htmlparser2": "^9.0.0", + "htmlparser2": "^9.1.0", "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/bl": { @@ -3121,9 +3191,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -3264,9 +3334,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", "dev": true, "funding": [ { @@ -3405,6 +3475,16 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3437,6 +3517,19 @@ "node": ">=8" } }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -3654,9 +3747,9 @@ } }, "node_modules/domutils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", - "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3676,9 +3769,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.76", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", - "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "version": "1.5.100", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.100.tgz", + "integrity": "sha512-u1z9VuzDXV86X2r3vAns0/5ojfXBue9o0+JDUDBKYqGLjxLkSqsSUoPU/6kW0gx76V44frHaf6Zo+QF74TQCMg==", "dev": true, "license": "ISC" }, @@ -3758,9 +3851,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3771,30 +3864,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/escalade": { @@ -3815,9 +3909,9 @@ "license": "MIT" }, "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true, "license": "Apache-2.0" }, @@ -3844,9 +3938,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -3854,16 +3948,16 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", - "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, "funding": [ { @@ -3878,9 +3972,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, "license": "ISC", "dependencies": { @@ -4131,13 +4225,13 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -4469,19 +4563,6 @@ "node": ">=18.0.0" } }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4495,22 +4576,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -4530,9 +4595,9 @@ } }, "node_modules/lmdb": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", - "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.2.tgz", + "integrity": "sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4548,12 +4613,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.1.5", - "@lmdb/lmdb-darwin-x64": "3.1.5", - "@lmdb/lmdb-linux-arm": "3.1.5", - "@lmdb/lmdb-linux-arm64": "3.1.5", - "@lmdb/lmdb-linux-x64": "3.1.5", - "@lmdb/lmdb-win32-x64": "3.1.5" + "@lmdb/lmdb-darwin-arm64": "3.2.2", + "@lmdb/lmdb-darwin-x64": "3.2.2", + "@lmdb/lmdb-linux-arm": "3.2.2", + "@lmdb/lmdb-linux-arm64": "3.2.2", + "@lmdb/lmdb-linux-x64": "3.2.2", + "@lmdb/lmdb-win32-x64": "3.2.2" } }, "node_modules/log-symbols": { @@ -4609,19 +4674,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4668,22 +4720,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -4713,9 +4749,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { @@ -5087,9 +5123,9 @@ "optional": true }, "node_modules/node-gyp": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz", - "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.1.0.tgz", + "integrity": "sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5189,13 +5225,13 @@ "license": "MIT" }, "node_modules/nopt": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", - "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "dev": true, "license": "ISC", "dependencies": { - "abbrev": "^2.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" @@ -5204,21 +5240,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/normalize-package-data": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz", - "integrity": "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^8.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/npm-bundled": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", @@ -5256,9 +5277,9 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz", + "integrity": "sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==", "dev": true, "license": "ISC", "dependencies": { @@ -5373,6 +5394,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ora/node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -5423,6 +5454,19 @@ "dev": true, "license": "ISC" }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ordered-binary": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", @@ -5596,9 +5640,9 @@ } }, "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -5606,9 +5650,9 @@ } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "dev": true, "funding": [ { @@ -5626,7 +5670,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5709,13 +5753,13 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -5750,19 +5794,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5829,9 +5876,9 @@ } }, "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, "license": "MIT", "dependencies": { @@ -5845,24 +5892,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", "fsevents": "~2.3.2" } }, @@ -5928,9 +5976,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.80.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", - "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz", + "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==", "dev": true, "license": "MIT", "dependencies": { @@ -5998,18 +6046,18 @@ } }, "node_modules/sigstore": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", - "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", + "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^3.0.0", - "@sigstore/tuf": "^3.0.0", - "@sigstore/verify": "^2.0.0" + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -6057,9 +6105,9 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6136,9 +6184,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "dev": true, "license": "CC0-1.0" }, @@ -6206,6 +6254,16 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6223,20 +6281,20 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/string-width/node_modules/strip-ansi": { + "node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", @@ -6252,7 +6310,8 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-ansi": { + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", @@ -6265,16 +6324,12 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } @@ -6464,9 +6519,9 @@ } }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6512,9 +6567,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, "funding": [ { @@ -6533,7 +6588,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -6571,21 +6626,21 @@ } }, "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -6594,19 +6649,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -6627,439 +6688,15 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", @@ -7142,6 +6779,16 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7174,6 +6821,29 @@ "node": ">=8" } }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7206,6 +6876,19 @@ "node": ">=8" } }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -7252,6 +6935,16 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7284,6 +6977,19 @@ "node": ">=8" } }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yoctocolors-cjs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", diff --git a/adev/src/content/tutorials/homepage/package.json b/adev/src/content/tutorials/homepage/package.json index e8bdff5bb32b..893078626990 100644 --- a/adev/src/content/tutorials/homepage/package.json +++ b/adev/src/content/tutorials/homepage/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "NG_BUILD_PARALLEL_TS=0 ng serve", + "start": "ng serve", "build": "ng build", "watch": "ng build --watch --configuration development" }, @@ -22,6 +22,6 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } } diff --git a/adev/src/content/tutorials/learn-angular/common/package-lock.json b/adev/src/content/tutorials/learn-angular/common/package-lock.json index b39c3cc8971e..c7e530756a8c 100644 --- a/adev/src/content/tutorials/learn-angular/common/package-lock.json +++ b/adev/src/content/tutorials/learn-angular/common/package-lock.json @@ -22,7 +22,7 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } }, "node_modules/@ampproject/remapping": { @@ -40,13 +40,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1900.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz", - "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==", + "version": "0.1901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.7.tgz", + "integrity": "sha512-qltyebfbej7joIKZVH8EFfrVDrkw0p9N9ja3A0XeU1sl2vlepHNAQdVm0Os8Vy2XjjyHvT5bXWE3G3/221qEKw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.1.7", "rxjs": "7.8.1" }, "engines": { @@ -56,9 +56,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", - "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.7.tgz", + "integrity": "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -84,15 +84,15 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz", - "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.7.tgz", + "integrity": "sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.1.7", "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -103,36 +103,37 @@ } }, "node_modules/@angular/build": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz", - "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.7.tgz", + "integrity": "sha512-22SjHZDTk91JHU5aFVDU2n+xkPolDosRVfsK4zs+RRXQs30LYPH9KCLiUWCYjFbRj7oYvw7sbrs94szo7dWYvw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.6", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.0.2", - "@vitejs/plugin-basic-ssl": "1.1.0", - "beasties": "0.1.0", + "@inquirer/confirm": "5.1.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", "browserslist": "^4.23.0", - "esbuild": "0.24.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", + "esbuild": "0.24.2", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", "listr2": "8.2.5", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "mrmime": "2.0.0", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.7.0", - "rollup": "4.26.0", - "sass": "1.80.7", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", "semver": "7.6.3", - "vite": "5.4.11", + "vite": "6.0.11", "watchpack": "2.4.2" }, "engines": { @@ -141,7 +142,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.1.5" + "lmdb": "3.2.2" }, "peerDependencies": { "@angular/compiler": "^19.0.0", @@ -149,11 +150,12 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.6", + "@angular/ssr": "^19.1.7", "less": "^4.2.0", + "ng-packagr": "^19.0.0", "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -171,6 +173,9 @@ "less": { "optional": true }, + "ng-packagr": { + "optional": true + }, "postcss": { "optional": true }, @@ -180,26 +185,26 @@ } }, "node_modules/@angular/cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz", - "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.7.tgz", + "integrity": "sha512-qVEy0R4QKQ2QAGfpj2mPVxRxgOVst+rIgZBtLwf/mrbN9YyzJUaBKvaVslUpOqkvoW9mX5myf0iZkT5NykrIoA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.6", - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", - "@inquirer/prompts": "7.1.0", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", + "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.6", + "@schematics/angular": "19.1.7", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", "listr2": "8.2.5", - "npm-package-arg": "12.0.0", + "npm-package-arg": "12.0.1", "npm-pick-manifest": "10.0.0", "pacote": "20.0.0", - "resolve": "1.22.8", + "resolve": "1.22.10", "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -214,9 +219,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz", - "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.6.tgz", + "integrity": "sha512-FkuejwbxsOLhcyOgDM/7YEYvMG3tuyOvr+831VzPwMwYp5QO9AUYtn4ffGf698JccbA+Ocw3BAdhPU6i+YZC1A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -225,14 +230,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5", + "@angular/core": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz", - "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.6.tgz", + "integrity": "sha512-Tl2PFEtnU8UgSqtEKG827xDUGZrErhR6S1JICeV1kbRCYmwQA4hhG25tzi+ifSAOPW7eJiyzP2LWIvOuZkq3Vw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -241,7 +246,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -250,9 +255,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz", - "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.6.tgz", + "integrity": "sha512-rTpHC/tfLBj+5a3X+BA/4s2w5T/cHT6x3RgO8CYy7003Musn0/BiqjfE6VCIllQgLaOQRhCcf51T6Kerkzv8Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -274,14 +279,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.5", - "typescript": ">=5.5 <5.7" + "@angular/compiler": "19.1.6", + "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz", - "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.6.tgz", + "integrity": "sha512-FD167URT+apxjzj9sG/MzffW5G6YyQiPQ6nrrIoYi9jeY3LYurybuOgvcXrU8PT4Z3+CKMq9k/ZnmrlHU72BpA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -295,9 +300,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz", - "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.6.tgz", + "integrity": "sha512-uu/76KAwCAcDuhD67Vv78UvOC/tiprtFXOgqNCj0LK8vyFcvPsunb3nF/PtfF9rSHyslXAqxZhME+Ha2tU6Lpw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -306,16 +311,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz", - "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.6.tgz", + "integrity": "sha512-sfWU+gMpqQ6GYtE3tAfDktftC01NgtqAOKfeCQ/KY2rxRTIxYahenW0Licuzgmd+8AZtmncoZaYX0Fd/5XMqzQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -324,9 +329,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.5", - "@angular/common": "19.0.5", - "@angular/core": "19.0.5" + "@angular/animations": "19.1.6", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -335,9 +340,9 @@ } }, "node_modules/@angular/router": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.5.tgz", - "integrity": "sha512-6tNubVVj/rRyTg+OXjQxACfufvCLHAwDQtv9wqt6q/3OYSnysHTik3ho3FaFPwu7fXJ+6p9Rjzkh2VY9QMk4bw==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.6.tgz", + "integrity": "sha512-TEfw3W5jVodVDMD4krhXGog1THZN3x1yoh2oZmCv3lXg22+pVC6Cp+x3vVExq0mS+g3/6uZwy/3qAYdlzqYjTg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -346,9 +351,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -368,9 +373,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { @@ -426,14 +431,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -456,13 +461,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -515,9 +520,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "license": "MIT", "engines": { @@ -568,27 +573,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -614,32 +619,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -648,9 +653,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, "license": "MIT", "dependencies": { @@ -662,9 +667,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -679,9 +684,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -696,9 +701,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -713,9 +718,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -730,9 +735,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -747,9 +752,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -764,9 +769,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -781,9 +786,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -798,9 +803,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -815,9 +820,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -832,9 +837,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -849,9 +854,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -866,9 +871,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -883,9 +888,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -900,9 +905,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -917,9 +922,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -934,9 +939,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -950,10 +955,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -968,9 +990,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], @@ -985,9 +1007,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -1002,9 +1024,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -1019,9 +1041,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -1036,9 +1058,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -1053,9 +1075,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -1070,15 +1092,15 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.4.tgz", - "integrity": "sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.1.tgz", + "integrity": "sha512-os5kFd/52gZTl/W6xqMfhaKVJHQM8V/U1P8jcSaQJ/C4Qhdrf2jEXdA/HaxfQs9iiUA/0yzYhk5d3oRHTxGDDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1087,17 +1109,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/confirm": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", - "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz", + "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" }, "engines": { "node": ">=18" @@ -1107,35 +1134,42 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.2.tgz", - "integrity": "sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==", + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.6.tgz", + "integrity": "sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/editor": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.1.tgz", - "integrity": "sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.6.tgz", + "integrity": "sha512-l0smvr8g/KAVdXx4I92sFxZiaTG4kFc06cFZw+qqwTirwdUHMFLnouXBB9OafWhpO3cfEkEz2CdPoCmor3059A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "external-editor": "^3.1.0" }, "engines": { @@ -1143,17 +1177,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/expand": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.4.tgz", - "integrity": "sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.8.tgz", + "integrity": "sha512-k0ouAC6L+0Yoj/j0ys2bat0fYcyFVtItDB7h+pDFKaDDSFJey/C/YY1rmIOqkmFVZ5rZySeAQuS8zLcKkKRLmg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1161,12 +1200,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/figures": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", - "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", + "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", "dev": true, "license": "MIT", "engines": { @@ -1174,48 +1218,58 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.1.tgz", - "integrity": "sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.5.tgz", + "integrity": "sha512-bB6wR5wBCz5zbIVBPnhp94BHv/G4eKbUEjlpCw676pI2chcvzTx1MuwZSCZ/fgNOdqDlAxkhQ4wagL8BI1D3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/number": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.4.tgz", - "integrity": "sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.8.tgz", + "integrity": "sha512-CTKs+dT1gw8dILVWATn8Ugik1OHLkkfY82J+Musb57KpmF6EKyskv8zmMiEJPzOnLTZLo05X/QdMd8VH9oulXw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/password": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.4.tgz", - "integrity": "sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.8.tgz", + "integrity": "sha512-MgA+Z7o3K1df2lGY649fyOBowHGfrKRz64dx3+b6c1w+h2W7AwBoOkHhhF/vfhbs5S4vsKNCuDzS3s9r5DpK1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2" }, "engines": { @@ -1223,25 +1277,30 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/prompts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", - "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.1.tgz", + "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.0.2", - "@inquirer/confirm": "^5.0.2", - "@inquirer/editor": "^4.1.0", - "@inquirer/expand": "^4.0.2", - "@inquirer/input": "^4.0.2", - "@inquirer/number": "^3.0.2", - "@inquirer/password": "^4.0.2", - "@inquirer/rawlist": "^4.0.2", - "@inquirer/search": "^3.0.2", - "@inquirer/select": "^4.0.2" + "@inquirer/checkbox": "^4.0.4", + "@inquirer/confirm": "^5.1.1", + "@inquirer/editor": "^4.2.1", + "@inquirer/expand": "^4.0.4", + "@inquirer/input": "^4.1.1", + "@inquirer/number": "^3.0.4", + "@inquirer/password": "^4.0.4", + "@inquirer/rawlist": "^4.0.4", + "@inquirer/search": "^3.0.4", + "@inquirer/select": "^4.0.4" }, "engines": { "node": ">=18" @@ -1251,14 +1310,14 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.4.tgz", - "integrity": "sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.8.tgz", + "integrity": "sha512-hl7rvYW7Xl4un8uohQRUgO6uc2hpn7PKqfcGkCOWC0AA4waBxAv6MpGOFCEDrUaBCP+pXPVqp4LmnpWmn1E1+g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1266,18 +1325,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/search": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.4.tgz", - "integrity": "sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.8.tgz", + "integrity": "sha512-ihSE9D3xQAupNg/aGDZaukqoUSXG2KfstWosVmFCG7jbMQPaj2ivxWtsB+CnYY/T4D6LX1GHKixwJLunNCffww==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1285,18 +1349,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/select": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.4.tgz", - "integrity": "sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.8.tgz", + "integrity": "sha512-Io2prxFyN2jOCcu4qJbVoilo19caiD3kqkD3WR0q3yDA5HUCo83v4LrRtg55ZwniYACW64z36eV7gyVbOfORjA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1305,12 +1374,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", - "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, "license": "MIT", "engines": { @@ -1318,6 +1392,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@isaacs/cliui": { @@ -1338,19 +1417,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -1389,22 +1455,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -1539,9 +1589,9 @@ } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", - "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz", + "integrity": "sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g==", "cpu": [ "arm64" ], @@ -1553,9 +1603,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", - "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz", + "integrity": "sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA==", "cpu": [ "x64" ], @@ -1567,9 +1617,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", - "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz", + "integrity": "sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA==", "cpu": [ "arm" ], @@ -1581,9 +1631,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", - "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz", + "integrity": "sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g==", "cpu": [ "arm64" ], @@ -1595,9 +1645,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", - "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz", + "integrity": "sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw==", "cpu": [ "x64" ], @@ -1609,9 +1659,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", - "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz", + "integrity": "sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ==", "cpu": [ "x64" ], @@ -2142,9 +2192,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz", - "integrity": "sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.1.tgz", + "integrity": "sha512-d5qimadRAUCO4A/Txw71VM7UrRZzV+NPclxz/dc+M6B2oYwjWTjqh8HA/sGQgs9VZuJ6I/P7XIAlJvgrl27ZOw==", "dev": true, "license": "ISC", "dependencies": { @@ -2152,9 +2202,9 @@ "glob": "^10.2.2", "hosted-git-info": "^8.0.0", "json-parse-even-better-errors": "^4.0.0", - "normalize-package-data": "^7.0.0", "proc-log": "^5.0.0", - "semver": "^7.5.3" + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2174,9 +2224,9 @@ } }, "node_modules/@npmcli/redact": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz", - "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz", + "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==", "dev": true, "license": "ISC", "engines": { @@ -2202,9 +2252,9 @@ } }, "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2223,25 +2273,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" } }, "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", "cpu": [ "arm64" ], @@ -2260,9 +2310,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", "cpu": [ "arm64" ], @@ -2281,9 +2331,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", "cpu": [ "x64" ], @@ -2302,9 +2352,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", "cpu": [ "x64" ], @@ -2323,9 +2373,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", "cpu": [ "arm" ], @@ -2344,9 +2394,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", "cpu": [ "arm" ], @@ -2365,9 +2415,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", "cpu": [ "arm64" ], @@ -2386,9 +2436,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", "cpu": [ "arm64" ], @@ -2407,9 +2457,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", "cpu": [ "x64" ], @@ -2428,9 +2478,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", "cpu": [ "x64" ], @@ -2449,9 +2499,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", "cpu": [ "arm64" ], @@ -2470,9 +2520,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", "cpu": [ "ia32" ], @@ -2491,9 +2541,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", "cpu": [ "x64" ], @@ -2545,9 +2595,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", "cpu": [ "arm" ], @@ -2559,9 +2609,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", "cpu": [ "arm64" ], @@ -2573,9 +2623,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", "cpu": [ "arm64" ], @@ -2587,9 +2637,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", "cpu": [ "x64" ], @@ -2601,9 +2651,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", "cpu": [ "arm64" ], @@ -2615,9 +2665,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", "cpu": [ "x64" ], @@ -2629,9 +2679,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", "cpu": [ "arm" ], @@ -2643,9 +2693,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", "cpu": [ "arm" ], @@ -2657,9 +2707,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", "cpu": [ "arm64" ], @@ -2671,9 +2721,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", "cpu": [ "arm64" ], @@ -2684,10 +2734,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", "cpu": [ "ppc64" ], @@ -2699,9 +2763,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", "cpu": [ "riscv64" ], @@ -2713,9 +2777,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", "cpu": [ "s390x" ], @@ -2727,9 +2791,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", "cpu": [ "x64" ], @@ -2741,9 +2805,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", "cpu": [ "x64" ], @@ -2755,9 +2819,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", "cpu": [ "arm64" ], @@ -2769,9 +2833,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", "cpu": [ "ia32" ], @@ -2783,9 +2847,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", "cpu": [ "x64" ], @@ -2797,14 +2861,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz", - "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.7.tgz", + "integrity": "sha512-BB8yMGmYDZzSb8Nu+Ln0TKyeoS3++f9STCYw30NwM3IViHxJJYxu/zowzwSa9TjftIzdCpbOaPxGS0vU9UOUDQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -2814,13 +2878,13 @@ } }, "node_modules/@sigstore/bundle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", - "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", + "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2837,26 +2901,26 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz", + "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/sign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", - "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", + "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^14.0.1", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", "proc-log": "^5.0.0", "promise-retry": "^2.0.1" }, @@ -2865,13 +2929,13 @@ } }, "node_modules/@sigstore/tuf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", - "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.0.tgz", + "integrity": "sha512-suVMQEA+sKdOz5hwP9qNcEjX6B45R+hFFr4LAWzbRc5O+U2IInwvay/bpG5a4s+qR35P/JK/PiKiRGjfuLy1IA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/protobuf-specs": "^0.4.0", "tuf-js": "^3.0.1" }, "engines": { @@ -2879,15 +2943,15 @@ } }, "node_modules/@sigstore/verify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", - "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.0.tgz", + "integrity": "sha512-kAAM06ca4CzhvjIZdONAL9+MLppW3K48wOFy1TbuaWFW/OMfl8JuTgW0Bm02JB1WJGT/ET2eqav0KTEKmxqkIA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2925,9 +2989,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, "license": "MIT", "peer": true, @@ -2936,16 +3000,16 @@ } }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@yarnpkg/lockfile": { @@ -2956,13 +3020,13 @@ "license": "BSD-2-Clause" }, "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", + "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/agent-base": { @@ -3027,13 +3091,16 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -3081,9 +3148,9 @@ "license": "MIT" }, "node_modules/beasties": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", - "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz", + "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3091,10 +3158,13 @@ "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "htmlparser2": "^9.0.0", + "htmlparser2": "^9.1.0", "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/bl": { @@ -3140,9 +3210,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -3283,9 +3353,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", "dev": true, "funding": [ { @@ -3424,6 +3494,16 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3456,6 +3536,19 @@ "node": ">=8" } }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -3673,9 +3766,9 @@ } }, "node_modules/domutils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", - "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3695,9 +3788,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.76", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", - "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "version": "1.5.100", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.100.tgz", + "integrity": "sha512-u1z9VuzDXV86X2r3vAns0/5ojfXBue9o0+JDUDBKYqGLjxLkSqsSUoPU/6kW0gx76V44frHaf6Zo+QF74TQCMg==", "dev": true, "license": "ISC" }, @@ -3777,9 +3870,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3790,30 +3883,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/escalade": { @@ -3834,9 +3928,9 @@ "license": "MIT" }, "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true, "license": "Apache-2.0" }, @@ -3863,9 +3957,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -3873,16 +3967,16 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", - "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, "funding": [ { @@ -3897,9 +3991,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, "license": "ISC", "dependencies": { @@ -4150,13 +4244,13 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -4488,19 +4582,6 @@ "node": ">=18.0.0" } }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4514,22 +4595,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -4549,9 +4614,9 @@ } }, "node_modules/lmdb": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", - "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.2.tgz", + "integrity": "sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4567,12 +4632,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.1.5", - "@lmdb/lmdb-darwin-x64": "3.1.5", - "@lmdb/lmdb-linux-arm": "3.1.5", - "@lmdb/lmdb-linux-arm64": "3.1.5", - "@lmdb/lmdb-linux-x64": "3.1.5", - "@lmdb/lmdb-win32-x64": "3.1.5" + "@lmdb/lmdb-darwin-arm64": "3.2.2", + "@lmdb/lmdb-darwin-x64": "3.2.2", + "@lmdb/lmdb-linux-arm": "3.2.2", + "@lmdb/lmdb-linux-arm64": "3.2.2", + "@lmdb/lmdb-linux-x64": "3.2.2", + "@lmdb/lmdb-win32-x64": "3.2.2" } }, "node_modules/log-symbols": { @@ -4628,19 +4693,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4687,22 +4739,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -4732,9 +4768,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { @@ -5106,9 +5142,9 @@ "optional": true }, "node_modules/node-gyp": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz", - "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.1.0.tgz", + "integrity": "sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5208,13 +5244,13 @@ "license": "MIT" }, "node_modules/nopt": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", - "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "dev": true, "license": "ISC", "dependencies": { - "abbrev": "^2.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" @@ -5223,21 +5259,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/normalize-package-data": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz", - "integrity": "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^8.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/npm-bundled": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", @@ -5275,9 +5296,9 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz", + "integrity": "sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==", "dev": true, "license": "ISC", "dependencies": { @@ -5392,6 +5413,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ora/node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -5442,6 +5473,19 @@ "dev": true, "license": "ISC" }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ordered-binary": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", @@ -5615,9 +5659,9 @@ } }, "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -5625,9 +5669,9 @@ } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "dev": true, "funding": [ { @@ -5645,7 +5689,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5728,13 +5772,13 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -5769,19 +5813,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5848,9 +5895,9 @@ } }, "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, "license": "MIT", "dependencies": { @@ -5864,24 +5911,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", "fsevents": "~2.3.2" } }, @@ -5947,9 +5995,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.80.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", - "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz", + "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==", "dev": true, "license": "MIT", "dependencies": { @@ -6017,18 +6065,18 @@ } }, "node_modules/sigstore": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", - "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", + "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^3.0.0", - "@sigstore/tuf": "^3.0.0", - "@sigstore/verify": "^2.0.0" + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -6076,9 +6124,9 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6155,9 +6203,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "dev": true, "license": "CC0-1.0" }, @@ -6225,6 +6273,16 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6242,20 +6300,20 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/string-width/node_modules/strip-ansi": { + "node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", @@ -6271,7 +6329,8 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-ansi": { + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", @@ -6284,16 +6343,12 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } @@ -6483,9 +6538,9 @@ } }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6531,9 +6586,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, "funding": [ { @@ -6552,7 +6607,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -6590,21 +6645,21 @@ } }, "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -6613,19 +6668,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -6646,439 +6707,15 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", @@ -7161,6 +6798,16 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7193,6 +6840,29 @@ "node": ">=8" } }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7225,6 +6895,19 @@ "node": ">=8" } }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -7271,6 +6954,16 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7303,6 +6996,19 @@ "node": ">=8" } }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yoctocolors-cjs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", diff --git a/adev/src/content/tutorials/learn-angular/common/package.json b/adev/src/content/tutorials/learn-angular/common/package.json index 75c8c8e253e2..433b21a3ed6e 100644 --- a/adev/src/content/tutorials/learn-angular/common/package.json +++ b/adev/src/content/tutorials/learn-angular/common/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "NG_BUILD_PARALLEL_TS=0 ng serve", + "start": "ng serve", "build": "ng build", "watch": "ng build --watch --configuration development" }, @@ -23,6 +23,6 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } } diff --git a/adev/src/content/tutorials/learn-angular/steps/12-enable-routing/README.md b/adev/src/content/tutorials/learn-angular/steps/12-enable-routing/README.md index 927bb72dad0d..4464975e2a15 100644 --- a/adev/src/content/tutorials/learn-angular/steps/12-enable-routing/README.md +++ b/adev/src/content/tutorials/learn-angular/steps/12-enable-routing/README.md @@ -2,7 +2,7 @@ For most apps, there comes a point where the app requires more than a single page. When that time inevitably comes, routing becomes a big part of the performance story for users. -In this activity, you'll learn how to setup and configure your app to use Angular Router. +In this activity, you'll learn how to set up and configure your app to use Angular Router.
    @@ -71,6 +71,6 @@ export class AppComponent {} -Your app is now setup to use Angular Router. Nice work! 🙌 +Your app is now set up to use Angular Router. Nice work! 🙌 Keep the momentum going to learn the next step of defining the routes for our app. diff --git a/adev/src/content/tutorials/learn-angular/steps/15-forms/README.md b/adev/src/content/tutorials/learn-angular/steps/15-forms/README.md index 08dbb5bc9614..47483325a5be 100644 --- a/adev/src/content/tutorials/learn-angular/steps/15-forms/README.md +++ b/adev/src/content/tutorials/learn-angular/steps/15-forms/README.md @@ -4,7 +4,7 @@ Forms are a big part of many apps because they enable your app to accept user in In Angular, there are two types of forms: template-driven and reactive. You'll learn about both over the next few activities. -In this activity, you'll learn how to setup a form using a template-driven approach. +In this activity, you'll learn how to set up a form using a template-driven approach.
    diff --git a/adev/src/content/tutorials/learn-angular/steps/16-form-control-values/README.md b/adev/src/content/tutorials/learn-angular/steps/16-form-control-values/README.md index 1e6a8f8671ef..f1e673d37576 100644 --- a/adev/src/content/tutorials/learn-angular/steps/16-form-control-values/README.md +++ b/adev/src/content/tutorials/learn-angular/steps/16-form-control-values/README.md @@ -1,6 +1,6 @@ # Getting form control value -Now that your forms are setup with Angular, the next step is to access the values from the form controls. +Now that your forms are set up with Angular, the next step is to access the values from the form controls. In this activity, you'll learn how to get the value from your form input. diff --git a/adev/src/content/tutorials/learn-angular/steps/17-reactive-forms/README.md b/adev/src/content/tutorials/learn-angular/steps/17-reactive-forms/README.md index c257767e06e5..bfc4b213c6e6 100644 --- a/adev/src/content/tutorials/learn-angular/steps/17-reactive-forms/README.md +++ b/adev/src/content/tutorials/learn-angular/steps/17-reactive-forms/README.md @@ -2,7 +2,7 @@ When you want to manage your forms programmatically instead of relying purely on the template, reactive forms are the answer. -In this activity, you'll learn how to setup reactive forms. +In this activity, you'll learn how to set up reactive forms.
    diff --git a/adev/src/content/tutorials/playground/common/package-lock.json b/adev/src/content/tutorials/playground/common/package-lock.json index c3a4e0217157..de05369e340a 100644 --- a/adev/src/content/tutorials/playground/common/package-lock.json +++ b/adev/src/content/tutorials/playground/common/package-lock.json @@ -24,7 +24,7 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } }, "node_modules/@ampproject/remapping": { @@ -42,13 +42,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1900.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz", - "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==", + "version": "0.1901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.7.tgz", + "integrity": "sha512-qltyebfbej7joIKZVH8EFfrVDrkw0p9N9ja3A0XeU1sl2vlepHNAQdVm0Os8Vy2XjjyHvT5bXWE3G3/221qEKw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.1.7", "rxjs": "7.8.1" }, "engines": { @@ -58,9 +58,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", - "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.7.tgz", + "integrity": "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -86,15 +86,15 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz", - "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.7.tgz", + "integrity": "sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.1.7", "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -105,9 +105,9 @@ } }, "node_modules/@angular/animations": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.5.tgz", - "integrity": "sha512-HCOF2CrhUvjoZWusd4nh32VOxpUrg6bV+3Z8Q36Ix3aZdni8v0qoP2rl5wGbotaPtYg5RtyDH60Z2AOPKqlrZg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.6.tgz", + "integrity": "sha512-iacosz3fygp0AyT57+suVpLChl10xS5RBje09TfQIKHTUY0LWkMspgaK9gwtlflpIhjedPV0UmgRIKhhFcQM1A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -116,40 +116,41 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.1.6" } }, "node_modules/@angular/build": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz", - "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.7.tgz", + "integrity": "sha512-22SjHZDTk91JHU5aFVDU2n+xkPolDosRVfsK4zs+RRXQs30LYPH9KCLiUWCYjFbRj7oYvw7sbrs94szo7dWYvw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.6", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.0.2", - "@vitejs/plugin-basic-ssl": "1.1.0", - "beasties": "0.1.0", + "@inquirer/confirm": "5.1.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", "browserslist": "^4.23.0", - "esbuild": "0.24.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", + "esbuild": "0.24.2", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", "listr2": "8.2.5", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "mrmime": "2.0.0", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.7.0", - "rollup": "4.26.0", - "sass": "1.80.7", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", "semver": "7.6.3", - "vite": "5.4.11", + "vite": "6.0.11", "watchpack": "2.4.2" }, "engines": { @@ -158,7 +159,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.1.5" + "lmdb": "3.2.2" }, "peerDependencies": { "@angular/compiler": "^19.0.0", @@ -166,11 +167,12 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.6", + "@angular/ssr": "^19.1.7", "less": "^4.2.0", + "ng-packagr": "^19.0.0", "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -188,6 +190,9 @@ "less": { "optional": true }, + "ng-packagr": { + "optional": true + }, "postcss": { "optional": true }, @@ -197,9 +202,9 @@ } }, "node_modules/@angular/cdk": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.0.4.tgz", - "integrity": "sha512-P8V1n6AFFjBUJG3YRgw8DiiNDWPZVrwQ42wbwgZxd4s2TQAuNFg3YY8h/DSMVxt2sXpavrshZsoLtP9yLKZjHA==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.1.4.tgz", + "integrity": "sha512-PyvJ1VbYjW8tVnVHvcasiqI9eNWf8EJnr0in1QWnhpSbpVpVpc4yjbgnu2pTrW9mPo/YjV4pF+qs6E97y9mdYQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -214,26 +219,26 @@ } }, "node_modules/@angular/cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz", - "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.7.tgz", + "integrity": "sha512-qVEy0R4QKQ2QAGfpj2mPVxRxgOVst+rIgZBtLwf/mrbN9YyzJUaBKvaVslUpOqkvoW9mX5myf0iZkT5NykrIoA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.6", - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", - "@inquirer/prompts": "7.1.0", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", + "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.6", + "@schematics/angular": "19.1.7", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", "listr2": "8.2.5", - "npm-package-arg": "12.0.0", + "npm-package-arg": "12.0.1", "npm-pick-manifest": "10.0.0", "pacote": "20.0.0", - "resolve": "1.22.8", + "resolve": "1.22.10", "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -248,9 +253,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz", - "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.6.tgz", + "integrity": "sha512-FkuejwbxsOLhcyOgDM/7YEYvMG3tuyOvr+831VzPwMwYp5QO9AUYtn4ffGf698JccbA+Ocw3BAdhPU6i+YZC1A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -259,14 +264,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5", + "@angular/core": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz", - "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.6.tgz", + "integrity": "sha512-Tl2PFEtnU8UgSqtEKG827xDUGZrErhR6S1JICeV1kbRCYmwQA4hhG25tzi+ifSAOPW7eJiyzP2LWIvOuZkq3Vw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -275,7 +280,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -284,9 +289,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz", - "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.6.tgz", + "integrity": "sha512-rTpHC/tfLBj+5a3X+BA/4s2w5T/cHT6x3RgO8CYy7003Musn0/BiqjfE6VCIllQgLaOQRhCcf51T6Kerkzv8Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -308,14 +313,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.5", - "typescript": ">=5.5 <5.7" + "@angular/compiler": "19.1.6", + "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz", - "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.6.tgz", + "integrity": "sha512-FD167URT+apxjzj9sG/MzffW5G6YyQiPQ6nrrIoYi9jeY3LYurybuOgvcXrU8PT4Z3+CKMq9k/ZnmrlHU72BpA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -329,9 +334,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz", - "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.6.tgz", + "integrity": "sha512-uu/76KAwCAcDuhD67Vv78UvOC/tiprtFXOgqNCj0LK8vyFcvPsunb3nF/PtfF9rSHyslXAqxZhME+Ha2tU6Lpw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -340,23 +345,23 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.0.4.tgz", - "integrity": "sha512-8WRMbN1+oRXx1ZFLni+BRz60F4FWzJPFORsQ8qAvY3sHWzyjunsYZkpbze3uiZO6bu3hiyQCU6g+k/58Qc6kkw==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.1.4.tgz", + "integrity": "sha512-bqliTnUnMiTG6Quvk16epiQPZQB0zV/L2ctPinFcP6NhahcQFfahjabUlgMlfBk5qObolJArJr5HCMiOmpOGIQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^19.0.0 || ^20.0.0", - "@angular/cdk": "19.0.4", + "@angular/cdk": "19.1.4", "@angular/common": "^19.0.0 || ^20.0.0", "@angular/core": "^19.0.0 || ^20.0.0", "@angular/forms": "^19.0.0 || ^20.0.0", @@ -365,9 +370,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz", - "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.6.tgz", + "integrity": "sha512-sfWU+gMpqQ6GYtE3tAfDktftC01NgtqAOKfeCQ/KY2rxRTIxYahenW0Licuzgmd+8AZtmncoZaYX0Fd/5XMqzQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -376,9 +381,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.5", - "@angular/common": "19.0.5", - "@angular/core": "19.0.5" + "@angular/animations": "19.1.6", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -402,9 +407,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { @@ -460,14 +465,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -490,13 +495,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -549,9 +554,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "license": "MIT", "engines": { @@ -602,27 +607,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -648,32 +653,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -682,9 +687,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, "license": "MIT", "dependencies": { @@ -696,9 +701,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -713,9 +718,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -730,9 +735,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -747,9 +752,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -764,9 +769,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -781,9 +786,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -798,9 +803,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -815,9 +820,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -832,9 +837,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -849,9 +854,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -866,9 +871,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -883,9 +888,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -900,9 +905,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -917,9 +922,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -934,9 +939,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -951,9 +956,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -968,9 +973,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -984,10 +989,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -1002,9 +1024,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], @@ -1019,9 +1041,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -1036,9 +1058,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -1053,9 +1075,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -1070,9 +1092,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -1087,9 +1109,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -1104,15 +1126,15 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.4.tgz", - "integrity": "sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.1.tgz", + "integrity": "sha512-os5kFd/52gZTl/W6xqMfhaKVJHQM8V/U1P8jcSaQJ/C4Qhdrf2jEXdA/HaxfQs9iiUA/0yzYhk5d3oRHTxGDDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1121,17 +1143,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/confirm": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", - "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz", + "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" }, "engines": { "node": ">=18" @@ -1141,35 +1168,42 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.2.tgz", - "integrity": "sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==", + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.6.tgz", + "integrity": "sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/editor": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.1.tgz", - "integrity": "sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.6.tgz", + "integrity": "sha512-l0smvr8g/KAVdXx4I92sFxZiaTG4kFc06cFZw+qqwTirwdUHMFLnouXBB9OafWhpO3cfEkEz2CdPoCmor3059A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "external-editor": "^3.1.0" }, "engines": { @@ -1177,17 +1211,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/expand": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.4.tgz", - "integrity": "sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.8.tgz", + "integrity": "sha512-k0ouAC6L+0Yoj/j0ys2bat0fYcyFVtItDB7h+pDFKaDDSFJey/C/YY1rmIOqkmFVZ5rZySeAQuS8zLcKkKRLmg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1195,12 +1234,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/figures": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", - "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", + "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", "dev": true, "license": "MIT", "engines": { @@ -1208,48 +1252,58 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.1.tgz", - "integrity": "sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.5.tgz", + "integrity": "sha512-bB6wR5wBCz5zbIVBPnhp94BHv/G4eKbUEjlpCw676pI2chcvzTx1MuwZSCZ/fgNOdqDlAxkhQ4wagL8BI1D3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/number": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.4.tgz", - "integrity": "sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.8.tgz", + "integrity": "sha512-CTKs+dT1gw8dILVWATn8Ugik1OHLkkfY82J+Musb57KpmF6EKyskv8zmMiEJPzOnLTZLo05X/QdMd8VH9oulXw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/password": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.4.tgz", - "integrity": "sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.8.tgz", + "integrity": "sha512-MgA+Z7o3K1df2lGY649fyOBowHGfrKRz64dx3+b6c1w+h2W7AwBoOkHhhF/vfhbs5S4vsKNCuDzS3s9r5DpK1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2" }, "engines": { @@ -1257,25 +1311,30 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/prompts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", - "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.1.tgz", + "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.0.2", - "@inquirer/confirm": "^5.0.2", - "@inquirer/editor": "^4.1.0", - "@inquirer/expand": "^4.0.2", - "@inquirer/input": "^4.0.2", - "@inquirer/number": "^3.0.2", - "@inquirer/password": "^4.0.2", - "@inquirer/rawlist": "^4.0.2", - "@inquirer/search": "^3.0.2", - "@inquirer/select": "^4.0.2" + "@inquirer/checkbox": "^4.0.4", + "@inquirer/confirm": "^5.1.1", + "@inquirer/editor": "^4.2.1", + "@inquirer/expand": "^4.0.4", + "@inquirer/input": "^4.1.1", + "@inquirer/number": "^3.0.4", + "@inquirer/password": "^4.0.4", + "@inquirer/rawlist": "^4.0.4", + "@inquirer/search": "^3.0.4", + "@inquirer/select": "^4.0.4" }, "engines": { "node": ">=18" @@ -1285,14 +1344,14 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.4.tgz", - "integrity": "sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.8.tgz", + "integrity": "sha512-hl7rvYW7Xl4un8uohQRUgO6uc2hpn7PKqfcGkCOWC0AA4waBxAv6MpGOFCEDrUaBCP+pXPVqp4LmnpWmn1E1+g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1300,18 +1359,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/search": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.4.tgz", - "integrity": "sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.8.tgz", + "integrity": "sha512-ihSE9D3xQAupNg/aGDZaukqoUSXG2KfstWosVmFCG7jbMQPaj2ivxWtsB+CnYY/T4D6LX1GHKixwJLunNCffww==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1319,18 +1383,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/select": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.4.tgz", - "integrity": "sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.8.tgz", + "integrity": "sha512-Io2prxFyN2jOCcu4qJbVoilo19caiD3kqkD3WR0q3yDA5HUCo83v4LrRtg55ZwniYACW64z36eV7gyVbOfORjA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1339,12 +1408,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", - "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, "license": "MIT", "engines": { @@ -1352,6 +1426,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@isaacs/cliui": { @@ -1372,19 +1451,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -1423,22 +1489,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -1573,9 +1623,9 @@ } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", - "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz", + "integrity": "sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g==", "cpu": [ "arm64" ], @@ -1587,9 +1637,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", - "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz", + "integrity": "sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA==", "cpu": [ "x64" ], @@ -1601,9 +1651,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", - "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz", + "integrity": "sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA==", "cpu": [ "arm" ], @@ -1615,9 +1665,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", - "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz", + "integrity": "sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g==", "cpu": [ "arm64" ], @@ -1629,9 +1679,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", - "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz", + "integrity": "sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw==", "cpu": [ "x64" ], @@ -1643,9 +1693,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", - "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz", + "integrity": "sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ==", "cpu": [ "x64" ], @@ -2176,9 +2226,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz", - "integrity": "sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.1.tgz", + "integrity": "sha512-d5qimadRAUCO4A/Txw71VM7UrRZzV+NPclxz/dc+M6B2oYwjWTjqh8HA/sGQgs9VZuJ6I/P7XIAlJvgrl27ZOw==", "dev": true, "license": "ISC", "dependencies": { @@ -2186,9 +2236,9 @@ "glob": "^10.2.2", "hosted-git-info": "^8.0.0", "json-parse-even-better-errors": "^4.0.0", - "normalize-package-data": "^7.0.0", "proc-log": "^5.0.0", - "semver": "^7.5.3" + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2208,9 +2258,9 @@ } }, "node_modules/@npmcli/redact": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz", - "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz", + "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==", "dev": true, "license": "ISC", "engines": { @@ -2236,9 +2286,9 @@ } }, "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2257,25 +2307,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" } }, "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", "cpu": [ "arm64" ], @@ -2294,9 +2344,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", "cpu": [ "arm64" ], @@ -2315,9 +2365,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", "cpu": [ "x64" ], @@ -2336,9 +2386,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", "cpu": [ "x64" ], @@ -2357,9 +2407,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", "cpu": [ "arm" ], @@ -2378,9 +2428,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", "cpu": [ "arm" ], @@ -2399,9 +2449,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", "cpu": [ "arm64" ], @@ -2420,9 +2470,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", "cpu": [ "arm64" ], @@ -2441,9 +2491,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", "cpu": [ "x64" ], @@ -2462,9 +2512,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", "cpu": [ "x64" ], @@ -2483,9 +2533,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", "cpu": [ "arm64" ], @@ -2504,9 +2554,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", "cpu": [ "ia32" ], @@ -2525,9 +2575,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", "cpu": [ "x64" ], @@ -2579,9 +2629,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", "cpu": [ "arm" ], @@ -2593,9 +2643,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", "cpu": [ "arm64" ], @@ -2607,9 +2657,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", "cpu": [ "arm64" ], @@ -2621,9 +2671,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", "cpu": [ "x64" ], @@ -2635,9 +2685,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", "cpu": [ "arm64" ], @@ -2649,9 +2699,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", "cpu": [ "x64" ], @@ -2663,9 +2713,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", "cpu": [ "arm" ], @@ -2677,9 +2727,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", "cpu": [ "arm" ], @@ -2691,9 +2741,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", "cpu": [ "arm64" ], @@ -2705,9 +2755,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", "cpu": [ "arm64" ], @@ -2718,10 +2768,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", "cpu": [ "ppc64" ], @@ -2733,9 +2797,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", "cpu": [ "riscv64" ], @@ -2747,9 +2811,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", "cpu": [ "s390x" ], @@ -2761,9 +2825,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", "cpu": [ "x64" ], @@ -2775,9 +2839,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", "cpu": [ "x64" ], @@ -2789,9 +2853,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", "cpu": [ "arm64" ], @@ -2803,9 +2867,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", "cpu": [ "ia32" ], @@ -2817,9 +2881,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", "cpu": [ "x64" ], @@ -2831,14 +2895,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz", - "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.7.tgz", + "integrity": "sha512-BB8yMGmYDZzSb8Nu+Ln0TKyeoS3++f9STCYw30NwM3IViHxJJYxu/zowzwSa9TjftIzdCpbOaPxGS0vU9UOUDQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -2848,13 +2912,13 @@ } }, "node_modules/@sigstore/bundle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", - "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", + "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2871,26 +2935,26 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz", + "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/sign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", - "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", + "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^14.0.1", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", "proc-log": "^5.0.0", "promise-retry": "^2.0.1" }, @@ -2899,13 +2963,13 @@ } }, "node_modules/@sigstore/tuf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", - "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.0.tgz", + "integrity": "sha512-suVMQEA+sKdOz5hwP9qNcEjX6B45R+hFFr4LAWzbRc5O+U2IInwvay/bpG5a4s+qR35P/JK/PiKiRGjfuLy1IA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/protobuf-specs": "^0.4.0", "tuf-js": "^3.0.1" }, "engines": { @@ -2913,15 +2977,15 @@ } }, "node_modules/@sigstore/verify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", - "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.0.tgz", + "integrity": "sha512-kAAM06ca4CzhvjIZdONAL9+MLppW3K48wOFy1TbuaWFW/OMfl8JuTgW0Bm02JB1WJGT/ET2eqav0KTEKmxqkIA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2959,9 +3023,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, "license": "MIT", "peer": true, @@ -2970,16 +3034,16 @@ } }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@yarnpkg/lockfile": { @@ -2990,13 +3054,13 @@ "license": "BSD-2-Clause" }, "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", + "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/agent-base": { @@ -3061,13 +3125,16 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -3115,9 +3182,9 @@ "license": "MIT" }, "node_modules/beasties": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", - "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz", + "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3125,10 +3192,13 @@ "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "htmlparser2": "^9.0.0", + "htmlparser2": "^9.1.0", "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/bl": { @@ -3174,9 +3244,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -3317,9 +3387,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", "dev": true, "funding": [ { @@ -3458,6 +3528,16 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3490,6 +3570,19 @@ "node": ">=8" } }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -3707,9 +3800,9 @@ } }, "node_modules/domutils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", - "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3729,9 +3822,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.76", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", - "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "version": "1.5.100", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.100.tgz", + "integrity": "sha512-u1z9VuzDXV86X2r3vAns0/5ojfXBue9o0+JDUDBKYqGLjxLkSqsSUoPU/6kW0gx76V44frHaf6Zo+QF74TQCMg==", "dev": true, "license": "ISC" }, @@ -3811,9 +3904,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3824,30 +3917,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/escalade": { @@ -3868,9 +3962,9 @@ "license": "MIT" }, "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true, "license": "Apache-2.0" }, @@ -3897,9 +3991,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -3907,16 +4001,16 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", - "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, "funding": [ { @@ -3931,9 +4025,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, "license": "ISC", "dependencies": { @@ -4184,13 +4278,13 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -4522,19 +4616,6 @@ "node": ">=18.0.0" } }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4548,22 +4629,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -4583,9 +4648,9 @@ } }, "node_modules/lmdb": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", - "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.2.tgz", + "integrity": "sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4601,12 +4666,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.1.5", - "@lmdb/lmdb-darwin-x64": "3.1.5", - "@lmdb/lmdb-linux-arm": "3.1.5", - "@lmdb/lmdb-linux-arm64": "3.1.5", - "@lmdb/lmdb-linux-x64": "3.1.5", - "@lmdb/lmdb-win32-x64": "3.1.5" + "@lmdb/lmdb-darwin-arm64": "3.2.2", + "@lmdb/lmdb-darwin-x64": "3.2.2", + "@lmdb/lmdb-linux-arm": "3.2.2", + "@lmdb/lmdb-linux-arm64": "3.2.2", + "@lmdb/lmdb-linux-x64": "3.2.2", + "@lmdb/lmdb-win32-x64": "3.2.2" } }, "node_modules/log-symbols": { @@ -4662,19 +4727,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4721,22 +4773,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -4766,9 +4802,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { @@ -5140,9 +5176,9 @@ "optional": true }, "node_modules/node-gyp": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz", - "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.1.0.tgz", + "integrity": "sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5242,13 +5278,13 @@ "license": "MIT" }, "node_modules/nopt": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", - "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "dev": true, "license": "ISC", "dependencies": { - "abbrev": "^2.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" @@ -5257,21 +5293,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/normalize-package-data": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz", - "integrity": "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^8.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/npm-bundled": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", @@ -5309,9 +5330,9 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz", + "integrity": "sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==", "dev": true, "license": "ISC", "dependencies": { @@ -5426,6 +5447,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ora/node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -5476,6 +5507,19 @@ "dev": true, "license": "ISC" }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ordered-binary": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", @@ -5649,9 +5693,9 @@ } }, "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -5659,9 +5703,9 @@ } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "dev": true, "funding": [ { @@ -5679,7 +5723,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5762,13 +5806,13 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -5803,19 +5847,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5882,9 +5929,9 @@ } }, "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, "license": "MIT", "dependencies": { @@ -5898,24 +5945,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", "fsevents": "~2.3.2" } }, @@ -5981,9 +6029,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.80.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", - "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz", + "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==", "dev": true, "license": "MIT", "dependencies": { @@ -6051,18 +6099,18 @@ } }, "node_modules/sigstore": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", - "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", + "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^3.0.0", - "@sigstore/tuf": "^3.0.0", - "@sigstore/verify": "^2.0.0" + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -6110,9 +6158,9 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6189,9 +6237,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "dev": true, "license": "CC0-1.0" }, @@ -6259,6 +6307,16 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6276,20 +6334,20 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/string-width/node_modules/strip-ansi": { + "node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", @@ -6305,7 +6363,8 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-ansi": { + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", @@ -6318,16 +6377,12 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } @@ -6517,9 +6572,9 @@ } }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6565,9 +6620,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, "funding": [ { @@ -6586,7 +6641,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -6624,21 +6679,21 @@ } }, "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -6647,19 +6702,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -6680,439 +6741,15 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", @@ -7195,6 +6832,16 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7227,6 +6874,29 @@ "node": ">=8" } }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7259,6 +6929,19 @@ "node": ">=8" } }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -7305,6 +6988,16 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7337,6 +7030,19 @@ "node": ">=8" } }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yoctocolors-cjs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", diff --git a/adev/src/content/tutorials/playground/common/package.json b/adev/src/content/tutorials/playground/common/package.json index 9db8ea0d201b..764147551e3b 100644 --- a/adev/src/content/tutorials/playground/common/package.json +++ b/adev/src/content/tutorials/playground/common/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "NG_BUILD_PARALLEL_TS=0 ng serve", + "start": "ng serve", "build": "ng build", "watch": "ng build --watch --configuration development" }, @@ -25,6 +25,6 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } } diff --git a/adev/src/index.html b/adev/src/index.html index f6d4c0eb48e9..4b15ccb87c80 100644 --- a/adev/src/index.html +++ b/adev/src/index.html @@ -58,7 +58,7 @@ - + @@ -95,7 +95,6 @@ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" rel="stylesheet" /> - diff --git a/adev/src/local-styles.scss b/adev/src/local-styles.scss index 4dcf2e82aa8b..2c83a2ad4a2e 100644 --- a/adev/src/local-styles.scss +++ b/adev/src/local-styles.scss @@ -1 +1,3 @@ -@import './styles/xterm'; \ No newline at end of file +@use './styles/xterm'; + +@include xterm.xterm(); diff --git a/adev/src/styles/_xterm.scss b/adev/src/styles/_xterm.scss index f016c44057c1..8b941f703f1c 100644 --- a/adev/src/styles/_xterm.scss +++ b/adev/src/styles/_xterm.scss @@ -1,121 +1,123 @@ -.xterm-viewport, -.xterm-screen { - &::-webkit-scrollbar-track { - background: rgba(0, 0, 0, 0); - cursor: pointer; - margin: 2px; +@mixin xterm() { + .xterm-viewport, + .xterm-screen { + &::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0); + cursor: pointer; + margin: 2px; + } + + &::-webkit-scrollbar { + width: 6px; + height: 6px; + } + + &::-webkit-scrollbar-thumb { + background-color: var(--senary-contrast); + border-radius: 10px; + transition: background-color 0.3s ease; + } + + &::-webkit-scrollbar-thumb:hover { + background-color: var(--quaternary-contrast); + } } - &::-webkit-scrollbar { - width: 6px; - height: 6px; + // Override terminal styles + .xterm { + height: 100%; + width: 100%; + padding: 10px; } - &::-webkit-scrollbar-thumb { - background-color: var(--senary-contrast); - border-radius: 10px; + .xterm-viewport { + overflow-y: auto !important; + height: 100% !important; + width: 100% !important; + background-color: var(--octonary-contrast) !important; transition: background-color 0.3s ease; } - &::-webkit-scrollbar-thumb:hover { - background-color: var(--quaternary-contrast); + .xterm-screen { + box-sizing: border-box; + overflow: visible !important; + height: 100% !important; + width: 100% !important; } -} - -// Override terminal styles -.xterm { - height: 100%; - width: 100%; - padding: 10px; -} -.xterm-viewport { - overflow-y: auto !important; - height: 100% !important; - width: 100% !important; - background-color: var(--octonary-contrast) !important; - transition: background-color 0.3s ease; -} - -.xterm-screen { - box-sizing: border-box; - overflow: visible !important; - height: 100% !important; - width: 100% !important; -} - -.xterm-rows { - height: 100% !important; - overflow: visible !important; - color: var(--primary-contrast) !important; - transition: color 0.3s ease; - // It is important to not alter the font-size or the selection would lose in precision - - .xterm-cursor { - &.xterm-cursor-outline { - outline-color: var(--primary-contrast) !important; - } - &.xterm-cursor-block { - background: var(--primary-contrast) !important; + .xterm-rows { + height: 100% !important; + overflow: visible !important; + color: var(--primary-contrast) !important; + transition: color 0.3s ease; + // It is important to not alter the font-size or the selection would lose in precision + + .xterm-cursor { + &.xterm-cursor-outline { + outline-color: var(--primary-contrast) !important; + } + &.xterm-cursor-block { + background: var(--primary-contrast) !important; + } } } -} -.xterm-selection { - top: 10px !important; - left: 10px !important; - div { - background-color: transparent !important; + .xterm-selection { + top: 10px !important; + left: 10px !important; + div { + background-color: transparent !important; + } } -} -.xterm-decoration-top { - background-color: var(--quinary-contrast) !important; -} + .xterm-decoration-top { + background-color: var(--quinary-contrast) !important; + } -.xterm-fg-11 { - color: var(--electric-violet) !important; -} + .xterm-fg-11 { + color: var(--electric-violet) !important; + } -.xterm-fg-4 { - color: var(--bright-blue) !important; -} + .xterm-fg-4 { + color: var(--bright-blue) !important; + } -// progress ### -.xterm-fg-15 { - color: var(--secondary-contrast) !important; -} + // progress ### + .xterm-fg-15 { + color: var(--secondary-contrast) !important; + } -.xterm-fg-14 { - color: var(--vivid-pink) !important; -} + .xterm-fg-14 { + color: var(--vivid-pink) !important; + } -// > in terminal -.xterm-fg-5 { - color: var(--electric-violet) !important; -} + // > in terminal + .xterm-fg-5 { + color: var(--electric-violet) !important; + } -// error text, warning text -.xterm-fg-9, -.xterm-fg-3 { - color: var(--vivid-pink) !important; -} + // error text, warning text + .xterm-fg-9, + .xterm-fg-3 { + color: var(--vivid-pink) !important; + } -.xterm-fg-10, -.xterm-fg-2 { - color: var(--symbolic-green) !important; -} + .xterm-fg-10, + .xterm-fg-2 { + color: var(--symbolic-green) !important; + } -// error bg -.xterm-bg-1 { - background-color: var(--orange-red) !important; -} + // error bg + .xterm-bg-1 { + background-color: var(--orange-red) !important; + } -// error text -.xterm-fg-257 { - color: var(--octonary-contrast) !important; -} + // error text + .xterm-fg-257 { + color: var(--octonary-contrast) !important; + } -.xterm-fg-8 { - color: var(--tertiary-contrast) !important; + .xterm-fg-8 { + color: var(--tertiary-contrast) !important; + } } diff --git a/contributing-docs/branches-and-versioning.md b/contributing-docs/branches-and-versioning.md index b3b7a1d445ad..54a5d56dab3c 100644 --- a/contributing-docs/branches-and-versioning.md +++ b/contributing-docs/branches-and-versioning.md @@ -92,6 +92,10 @@ The vast majority of pull requests will target `major`, `minor`, or `patch` base the code change. In rare cases, a pull request will specify `target: rc` or `target: lts` to explicitly target a special branch. +Note that PRs merged with `target: rc` often benefit from additional testing in an RC release. +Therefore PR authors and caretakers should consider publishing a new `-next` release after merging +any PRs to an RC branch to support extra testing before the stable release. + Breaking changes, marked with `target: major`, can only be merged when `main` represents the next major version. diff --git a/contributing-docs/caretaking.md b/contributing-docs/caretaking.md index 31a2ff653991..c49a2c3c5ca5 100644 --- a/contributing-docs/caretaking.md +++ b/contributing-docs/caretaking.md @@ -39,7 +39,7 @@ adding a review comment that starts with `TESTED=` and then put a reason why the tested. The `requires: TGP` label is automatically added to PRs that affect files matching `separateFilePatterns` in [`.ng-dev/google-sync-config.json`](https://github.com/angular/angular/blob/main/.ng-dev/google-sync-config.json). -An example of specfying a `TESTED=` comment: +An example of specifying a `TESTED=` comment: ``` TESTED=docs only update and does not need a TGP ``` diff --git a/devtools/BUILD.bazel b/devtools/BUILD.bazel index f4003bd6d6ea..9e0065b59d36 100644 --- a/devtools/BUILD.bazel +++ b/devtools/BUILD.bazel @@ -1,4 +1,3 @@ -load("@io_bazel_rules_sass//:defs.bzl", "npm_sass_library", "sass_library") load("//tools:defaults.bzl", "ts_config") package(default_visibility = ["//visibility:public"]) @@ -8,14 +7,6 @@ exports_files([ "cypress.json", ]) -npm_sass_library( - name = "material_sass_deps", - deps = [ - "@npm//@angular/cdk", - "@npm//@angular/material", - ], -) - ts_config( name = "tsconfig_spec", src = "tsconfig.spec.json", @@ -23,9 +14,3 @@ ts_config( "//devtools:tsconfig.json", ], ) - -sass_library( - name = "global_styles", - srcs = ["styles.scss"], - deps = [":material_sass_deps"], -) diff --git a/devtools/cypress/integration/view-component-metadata.e2e.js b/devtools/cypress/integration/view-component-metadata.e2e.js index 401ac4f70f00..e61c2382f596 100644 --- a/devtools/cypress/integration/view-component-metadata.e2e.js +++ b/devtools/cypress/integration/view-component-metadata.e2e.js @@ -44,13 +44,13 @@ describe('Viewing component metadata', () => { }); it('should display correct set of inputs', () => { - cy.contains('.cy-inputs', '@Inputs'); + cy.contains('.cy-inputs', 'Inputs'); cy.contains('.cy-inputs mat-tree-node:first span:first', 'inputOne'); cy.contains('.cy-inputs mat-tree-node:last span:first', 'inputTwo'); }); it('should display correct set of outputs', () => { - cy.contains('.cy-outputs', '@Outputs'); + cy.contains('.cy-outputs', 'Outputs'); cy.contains('.cy-outputs mat-tree-node:first span:first', 'outputOne'); cy.contains('.cy-outputs mat-tree-node:last span:first', 'outputTwo'); }); diff --git a/devtools/docs/release.md b/devtools/docs/release.md index 33dd8548c5f2..86d24316bfbc 100644 --- a/devtools/docs/release.md +++ b/devtools/docs/release.md @@ -65,17 +65,23 @@ Then upload it: 1. Go to the Firefox Addons [page](https://addons.mozilla.org/developers/addons) 1. Find the email and password [on Valentine](http://valentine/#/show/1651707871496288) -1. Setup Google Authenticator with the 2FA QR code. +1. Set up Google Authenticator with the 2FA QR code. * You can find the QR code [on Valentine as well](http://valentine/#/show/1651792043556329) -The Firefox publishing process is slightly more involved than Chrome. In particular, they -require extension source code with instructions to build and run it. Since DevTools exists in -a monorepo with critical build tooling existing outside the `devtools/` directory, we need to -upload the entire monorepo. Package it without dependencies and generated files with the +The Firefox publishing process is slightly more involved than Chrome. + +Mozilla asks for a changelog, which needs to be authored manually. You can search for recent +`devtools` commits to see what has landed since the last release. + +https://github.com/search?q=repo%3Aangular%2Fangular+devtools&type=commits&s=committer-date&o=desc + +Mozilla also requires extension source code with instructions to build and run it. Since DevTools +exists in a monorepo with critical build tooling existing outside the `devtools/` directory, we +need to upload the entire monorepo. Package it without dependencies and generated files with the following command and upload it. ```shell -zip -r ~/angular-source.zip * -x ".git/*" -x "node_modules/*" -x "**/node_modules/*" -x "dist/" +rm -rf dist/ && zip -r ~/angular-source.zip * -x ".git/*" -x "node_modules/*" -x "**/node_modules/*" ``` Suggested note to reviewer: diff --git a/devtools/projects/demo-standalone/src/BUILD.bazel b/devtools/projects/demo-standalone/src/BUILD.bazel index 2ebea2d4daab..1f991e6e911a 100644 --- a/devtools/projects/demo-standalone/src/BUILD.bazel +++ b/devtools/projects/demo-standalone/src/BUILD.bazel @@ -1,8 +1,9 @@ -load("//devtools/tools:ng_module.bzl", "ng_module") -load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") +load("@aspect_bazel_lib//lib:copy_to_directory.bzl", "copy_to_directory") load("@build_bazel_rules_nodejs//:index.bzl", "pkg_web") -load("//tools:defaults.bzl", "esbuild", "http_server") +load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") +load("//devtools/tools:ng_module.bzl", "ng_module") load("//devtools/tools/esbuild:index.bzl", "LINKER_PROCESSED_FW_PACKAGES") +load("//tools:defaults.bzl", "esbuild", "http_server") package(default_visibility = ["//visibility:public"]) @@ -11,17 +12,19 @@ sass_binary( src = "styles.scss", include_paths = ["external/npm/node_modules"], sourcemap = False, - deps = ["//devtools:global_styles"], + deps = ["//devtools/projects/ng-devtools/src/styles:global"], ) -sass_binary( - name = "firefox_styles", - src = "styles/firefox_styles.scss", -) - -sass_binary( - name = "chrome_styles", - src = "styles/chrome_styles.scss", +copy_to_directory( + name = "browser_specific_styles", + srcs = [ + "//devtools/projects/ng-devtools/src/styles:chrome", + "//devtools/projects/ng-devtools/src/styles:firefox", + ], + out = "styles", + replace_prefixes = { + "devtools/projects/ng-devtools/src/styles": "", + }, ) ng_module( @@ -56,9 +59,8 @@ exports_files(["index.html"]) filegroup( name = "dev_app_static_files", srcs = [ - ":chrome_styles", + ":browser_specific_styles", ":demo_styles", - ":firefox_styles", ":index.html", "//packages/zone.js/bundles:zone.umd.js", ], diff --git a/devtools/projects/demo-standalone/src/app/devtools-app/BUILD.bazel b/devtools/projects/demo-standalone/src/app/devtools-app/BUILD.bazel index a81b0fbb4266..2d292a19b00f 100644 --- a/devtools/projects/demo-standalone/src/app/devtools-app/BUILD.bazel +++ b/devtools/projects/demo-standalone/src/app/devtools-app/BUILD.bazel @@ -7,7 +7,7 @@ ng_module( srcs = ["devtools-app.component.ts"], deps = [ "//devtools/projects/ng-devtools", - "//devtools/projects/ng-devtools/src/lib:frame_manager", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", "//devtools/projects/protocol", "//devtools/src:iframe_message_bus", "//packages/common", diff --git a/devtools/projects/demo-standalone/src/app/devtools-app/devtools-app.component.ts b/devtools/projects/demo-standalone/src/app/devtools-app/devtools-app.component.ts index adc938a4d230..d414d51d6c57 100644 --- a/devtools/projects/demo-standalone/src/app/devtools-app/devtools-app.component.ts +++ b/devtools/projects/demo-standalone/src/app/devtools-app/devtools-app.component.ts @@ -11,7 +11,7 @@ import {Events, MessageBus, PriorityAwareMessageBus} from 'protocol'; import {IFrameMessageBus} from '../../../../../src/iframe-message-bus'; import {DevToolsComponent} from 'ng-devtools'; -import {FrameManager} from '../../../../../projects/ng-devtools/src/lib/frame_manager'; +import {FrameManager} from '../../../../../projects/ng-devtools/src/lib/application-services/frame_manager'; @Component({ imports: [DevToolsComponent], diff --git a/devtools/projects/demo-standalone/src/styles.scss b/devtools/projects/demo-standalone/src/styles.scss index b5f91b71cf64..adbeab311bc5 100644 --- a/devtools/projects/demo-standalone/src/styles.scss +++ b/devtools/projects/demo-standalone/src/styles.scss @@ -1 +1 @@ -@use '../../../styles.scss' as devtools; +@use '../../../projects/ng-devtools/src/styles/global'; diff --git a/devtools/projects/demo-standalone/src/styles/chrome_styles.scss b/devtools/projects/demo-standalone/src/styles/chrome_styles.scss deleted file mode 100644 index 9959545b62fe..000000000000 --- a/devtools/projects/demo-standalone/src/styles/chrome_styles.scss +++ /dev/null @@ -1 +0,0 @@ -/** Specific style for Chrome browser */ diff --git a/devtools/projects/demo-standalone/src/styles/firefox_styles.scss b/devtools/projects/demo-standalone/src/styles/firefox_styles.scss deleted file mode 100644 index af7608ad155f..000000000000 --- a/devtools/projects/demo-standalone/src/styles/firefox_styles.scss +++ /dev/null @@ -1 +0,0 @@ -/** Specific style for Firefox browser */ diff --git a/devtools/projects/ng-devtools-backend/src/lib/client-event-subscribers.ts b/devtools/projects/ng-devtools-backend/src/lib/client-event-subscribers.ts index f7eb2b2bf48c..344d421c6340 100644 --- a/devtools/projects/ng-devtools-backend/src/lib/client-event-subscribers.ts +++ b/devtools/projects/ng-devtools-backend/src/lib/client-event-subscribers.ts @@ -155,6 +155,9 @@ const getLatestComponentExplorerViewCallback = if (state) { const {directiveProperties} = state; messageBus.emit('latestComponentExplorerView', [{forest, properties: directiveProperties}]); + } else { + // if the node is not found in the tree, we assume its gone and send the tree as is. + messageBus.emit('latestComponentExplorerView', [{forest}]); } }; diff --git a/devtools/projects/ng-devtools-backend/src/lib/highlighter.spec.ts b/devtools/projects/ng-devtools-backend/src/lib/highlighter.spec.ts index 63a733533d0f..2f35d38bb02a 100644 --- a/devtools/projects/ng-devtools-backend/src/lib/highlighter.spec.ts +++ b/devtools/projects/ng-devtools-backend/src/lib/highlighter.spec.ts @@ -100,7 +100,8 @@ describe('highlighter', () => { }); }); - describe('highlightHydrationElement', () => { + // Those test were disabled since very flaky on the CI - needs investigation before re-enabling + xdescribe('highlightHydrationElement', () => { afterEach(() => { document.body.innerHTML = ''; delete (window as any).ng; diff --git a/devtools/projects/ng-devtools-backend/src/lib/highlighter.ts b/devtools/projects/ng-devtools-backend/src/lib/highlighter.ts index da58d347a5d0..b0d4dac35c54 100644 --- a/devtools/projects/ng-devtools-backend/src/lib/highlighter.ts +++ b/devtools/projects/ng-devtools-backend/src/lib/highlighter.ts @@ -39,7 +39,7 @@ function createOverlay(color: RgbColor): {overlay: HTMLElement; overlayContent: const overlay = document.createElement('div'); overlay.className = 'ng-devtools-overlay'; overlay.style.backgroundColor = toCSSColor(...color, 0.35); - overlay.style.position = 'fixed'; + overlay.style.position = 'absolute'; overlay.style.zIndex = '2147483647'; overlay.style.pointerEvents = 'none'; overlay.style.display = 'flex'; @@ -196,8 +196,8 @@ function showOverlay( const {width, height, top, left} = dimensions; overlay.style.width = ~~width + 'px'; overlay.style.height = ~~height + 'px'; - overlay.style.top = ~~top + 'px'; - overlay.style.left = ~~left + 'px'; + overlay.style.top = ~~top + window.scrollY + 'px'; + overlay.style.left = ~~left + window.scrollX + 'px'; positionOverlayContent(overlayContent, dimensions, labelPosition); overlayContent.replaceChildren(); diff --git a/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts b/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts index 7f474baea23f..c9e05625fedb 100644 --- a/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts +++ b/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts @@ -43,7 +43,7 @@ export class NgProfiler extends Profiler { private _initialize(): void { ngDebugClient().ɵsetProfiler( - (event: ɵProfilerEvent, instanceOrLView: {} | null, hookOrListener: any) => + (event: ɵProfilerEvent, instanceOrLView: {} | null = null, hookOrListener: any) => this._callbacks.forEach((cb) => cb(event, instanceOrLView, hookOrListener)), ); } diff --git a/devtools/projects/ng-devtools/src/lib/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/BUILD.bazel index 052e8cd15bf3..a944a6d1e7a3 100644 --- a/devtools/projects/ng-devtools/src/lib/BUILD.bazel +++ b/devtools/projects/ng-devtools/src/lib/BUILD.bazel @@ -1,7 +1,7 @@ -load("//devtools/tools:ng_module.bzl", "ng_module") load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") -load("//devtools/tools:typescript.bzl", "ts_test_library") load("//devtools/tools:defaults.bzl", "karma_web_test_suite") +load("//devtools/tools:ng_module.bzl", "ng_module") +load("//devtools/tools:typescript.bzl", "ts_test_library") package(default_visibility = ["//visibility:public"]) @@ -15,8 +15,6 @@ ng_module( srcs = glob( include = ["*.ts"], exclude = [ - "theme-service.ts", - "frame_manager.ts", "*_spec.ts", ], ), @@ -25,12 +23,13 @@ ng_module( ":devtools_component_styles", ], deps = [ - ":frame_manager", - ":theme", + "//devtools/projects/ng-devtools/src/lib/application-providers:window", + "//devtools/projects/ng-devtools/src/lib/application-services:browser_styles", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", + "//devtools/projects/ng-devtools/src/lib/application-services:theme", "//devtools/projects/ng-devtools/src/lib/devtools-tabs", "//devtools/projects/protocol", "//packages/animations", - "//packages/common", "//packages/core", "//packages/forms", "//packages/platform-browser-dynamic", @@ -45,8 +44,8 @@ ts_test_library( name = "devtools_test", srcs = ["devtools_spec.ts"], deps = [ - ":frame_manager", ":lib", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", "//devtools/projects/ng-devtools/src/lib/devtools-tabs", "//devtools/projects/protocol", "//packages/core", @@ -60,47 +59,3 @@ karma_web_test_suite( ":devtools_test", ], ) - -ng_module( - name = "frame_manager", - srcs = glob( - include = ["frame_manager.ts"], - ), - deps = [ - "//devtools/projects/ng-devtools/src/lib/application-environment", - "//devtools/projects/protocol", - "//packages/core", - ], -) - -ts_test_library( - name = "test_frame_manager_lib", - srcs = [ - "frame_manager_spec.ts", - ], - deps = [ - ":frame_manager", - "//devtools/projects/ng-devtools/src/lib/application-environment", - "//devtools/projects/protocol", - "//packages/core/testing", - ], -) - -karma_web_test_suite( - name = "test_frame_manager", - deps = [ - ":test_frame_manager_lib", - ], -) - -ng_module( - name = "theme", - srcs = glob( - include = ["theme-service.ts"], - ), - deps = [ - "//packages/core", - "@npm//@types", - "@npm//rxjs", - ], -) diff --git a/devtools/projects/ng-devtools/src/lib/application-providers/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/application-providers/BUILD.bazel new file mode 100644 index 000000000000..f4c3db266c8a --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/application-providers/BUILD.bazel @@ -0,0 +1,11 @@ +load("//devtools/tools:ng_module.bzl", "ng_module") + +package(default_visibility = ["//visibility:public"]) + +ng_module( + name = "window", + srcs = ["window_provider.ts"], + deps = [ + "//packages/core", + ], +) diff --git a/devtools/projects/ng-devtools/src/lib/application-providers/window_provider.ts b/devtools/projects/ng-devtools/src/lib/application-providers/window_provider.ts new file mode 100644 index 000000000000..764d14ea3d80 --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/application-providers/window_provider.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {InjectionToken, Provider} from '@angular/core'; + +export const WINDOW = new InjectionToken('WINDOW'); + +export const WINDOW_PROVIDER: Provider = { + provide: WINDOW, + useValue: window, +}; diff --git a/devtools/projects/ng-devtools/src/lib/application-services/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/application-services/BUILD.bazel new file mode 100644 index 000000000000..ada3c0e7e2ff --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/application-services/BUILD.bazel @@ -0,0 +1,60 @@ +load("//devtools/tools:defaults.bzl", "karma_web_test_suite") +load("//devtools/tools:ng_module.bzl", "ng_module") +load("//devtools/tools:typescript.bzl", "ts_test_library") + +package(default_visibility = ["//visibility:public"]) + +ng_module( + name = "browser_styles", + srcs = ["browser_styles_service.ts"], + deps = [ + "//packages/common", + "//packages/core", + "@npm//@angular/cdk", + ], +) + +ng_module( + name = "frame_manager", + srcs = ["frame_manager.ts"], + deps = [ + "//devtools/projects/ng-devtools/src/lib/application-environment", + "//devtools/projects/protocol", + "//packages/core", + ], +) + +ng_module( + name = "theme", + srcs = ["theme_service.ts"], + deps = [ + "//devtools/projects/ng-devtools/src/lib/application-providers:window", + "//packages/common", + "//packages/core", + "@npm//@types", + "@npm//rxjs", + ], +) + +ts_test_library( + name = "test_application_services_lib", + srcs = glob(["*_spec.ts"]), + deps = [ + ":browser_styles", + ":frame_manager", + ":theme", + "//devtools/projects/ng-devtools/src/lib/application-environment", + "//devtools/projects/ng-devtools/src/lib/application-providers:window", + "//devtools/projects/protocol", + "//packages/common", + "//packages/core/testing", + "@npm//@angular/cdk", + ], +) + +karma_web_test_suite( + name = "test_application_services", + deps = [ + ":test_application_services_lib", + ], +) diff --git a/devtools/projects/ng-devtools/src/lib/application-services/browser_styles_service.ts b/devtools/projects/ng-devtools/src/lib/application-services/browser_styles_service.ts new file mode 100644 index 000000000000..2a2f1d8ea344 --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/application-services/browser_styles_service.ts @@ -0,0 +1,76 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {inject, Injectable, RendererFactory2} from '@angular/core'; +import {DOCUMENT} from '@angular/common'; +import {Platform} from '@angular/cdk/platform'; + +// Update for with newly supported browser +export type Browser = 'chrome' | 'firefox' | 'unknown'; + +// If for some reason we are unable to properly +// detect the browser, we are defaulting +// to Chrome's styles. + +// Keep class names in sync with _theme.scss and _browser.scss +const BROWSER_CLASS_NAME: {[key in Browser]: string} = { + 'chrome': 'chrome-ui', + 'firefox': 'firefox-ui', + 'unknown': 'chrome-ui', +}; + +const BROWSER_STYLES: {[key in Browser]: string} = { + 'chrome': 'chrome.css', + 'firefox': 'firefox.css', + 'unknown': 'chrome.css', +}; + +@Injectable({ + providedIn: 'root', +}) +export class BrowserStylesService { + private readonly doc = inject(DOCUMENT); + private readonly rendererFactory = inject(RendererFactory2); + private readonly renderer = this.rendererFactory.createRenderer(null, null); + private readonly platform = inject(Platform); + + private readonly browser = this.detectBrowser(); + + initBrowserSpecificStyles() { + this.addBrowserUiClass(); + this.loadBrowserStyle(); + } + + /** Add the browser class to the document body */ + private addBrowserUiClass() { + const browserClass = BROWSER_CLASS_NAME[this.browser]; + this.renderer.addClass(this.doc.body, browserClass); + } + + /** Load browser-specific styles */ + private loadBrowserStyle() { + const fileName = BROWSER_STYLES[this.browser]; + const head = this.doc.getElementsByTagName('head')[0]; + + const style = this.renderer.createElement('link'); + style.rel = 'stylesheet'; + style.href = `./styles/${fileName}`; + + head.appendChild(style); + } + + private detectBrowser(): Browser { + if (this.platform.BLINK) { + return 'chrome'; + } + if (this.platform.FIREFOX) { + return 'firefox'; + } + return 'unknown'; + } +} diff --git a/devtools/projects/ng-devtools/src/lib/application-services/browser_styles_service_spec.ts b/devtools/projects/ng-devtools/src/lib/application-services/browser_styles_service_spec.ts new file mode 100644 index 000000000000..a8062c9ffeb4 --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/application-services/browser_styles_service_spec.ts @@ -0,0 +1,77 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {TestBed} from '@angular/core/testing'; +import {DOCUMENT} from '@angular/common'; +import {Platform} from '@angular/cdk/platform'; +import {Browser, BrowserStylesService} from './browser_styles_service'; + +function configureTestingModuleWithPlatformMock(mock: Partial) { + TestBed.configureTestingModule({ + providers: [ + { + provide: Platform, + useValue: mock, + }, + ], + }); +} + +function checkForBrowserSpecificStyles(browser: Browser) { + const doc = TestBed.inject(DOCUMENT); + + // Keep in sync with the service. + return { + hasClass: doc.body.classList.contains(browser + '-ui'), + hasStylesheet: !!doc.head.querySelector(`link[href="./styles/${browser}.css"]`), + }; +} + +describe('BrowserStylesService', () => { + it('should initialize browser-specific styles for Chrome', () => { + configureTestingModuleWithPlatformMock({ + BLINK: true, + }); + + const service = TestBed.inject(BrowserStylesService); + service.initBrowserSpecificStyles(); + + const {hasClass, hasStylesheet} = checkForBrowserSpecificStyles('chrome'); + + expect(hasClass).toBeTrue(); + expect(hasStylesheet).toBeTrue(); + }); + + it('should initialize browser-specific styles for Firefox', () => { + configureTestingModuleWithPlatformMock({ + FIREFOX: true, + }); + + const service = TestBed.inject(BrowserStylesService); + service.initBrowserSpecificStyles(); + + const {hasClass, hasStylesheet} = checkForBrowserSpecificStyles('firefox'); + + expect(hasClass).toBeTrue(); + expect(hasStylesheet).toBeTrue(); + }); + + it('should default to Chrome UI, if the browser is not supported', () => { + configureTestingModuleWithPlatformMock({ + WEBKIT: true, + }); + + const service = TestBed.inject(BrowserStylesService); + service.initBrowserSpecificStyles(); + + const {hasClass, hasStylesheet} = checkForBrowserSpecificStyles('chrome'); + + expect(hasClass).toBeTrue(); + expect(hasStylesheet).toBeTrue(); + }); +}); diff --git a/devtools/projects/ng-devtools/src/lib/frame_manager.ts b/devtools/projects/ng-devtools/src/lib/application-services/frame_manager.ts similarity index 98% rename from devtools/projects/ng-devtools/src/lib/frame_manager.ts rename to devtools/projects/ng-devtools/src/lib/application-services/frame_manager.ts index 1825a0c7447b..7eb81cdfbba1 100644 --- a/devtools/projects/ng-devtools/src/lib/frame_manager.ts +++ b/devtools/projects/ng-devtools/src/lib/application-services/frame_manager.ts @@ -9,7 +9,7 @@ import {Injectable, inject, signal, computed} from '@angular/core'; import {Events, MessageBus} from 'protocol'; -import {Frame, TOP_LEVEL_FRAME_ID} from './application-environment'; +import {Frame, TOP_LEVEL_FRAME_ID} from '../application-environment'; @Injectable() export class FrameManager { diff --git a/devtools/projects/ng-devtools/src/lib/frame_manager_spec.ts b/devtools/projects/ng-devtools/src/lib/application-services/frame_manager_spec.ts similarity index 99% rename from devtools/projects/ng-devtools/src/lib/frame_manager_spec.ts rename to devtools/projects/ng-devtools/src/lib/application-services/frame_manager_spec.ts index 9d983a4d75c8..62d4954ce285 100644 --- a/devtools/projects/ng-devtools/src/lib/frame_manager_spec.ts +++ b/devtools/projects/ng-devtools/src/lib/application-services/frame_manager_spec.ts @@ -9,7 +9,7 @@ import {Events, MessageBus} from 'protocol'; import {FrameManager} from './frame_manager'; import {TestBed} from '@angular/core/testing'; -import {Frame} from './application-environment'; +import {Frame} from '../application-environment'; describe('FrameManager', () => { let frameManager: FrameManager; diff --git a/devtools/projects/ng-devtools/src/lib/application-services/theme_service.ts b/devtools/projects/ng-devtools/src/lib/application-services/theme_service.ts new file mode 100644 index 000000000000..479aa6caef19 --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/application-services/theme_service.ts @@ -0,0 +1,48 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {inject, Injectable, Renderer2, RendererFactory2, signal} from '@angular/core'; +import {DOCUMENT} from '@angular/common'; +import {WINDOW} from '../application-providers/window_provider'; + +export type Theme = 'dark-theme' | 'light-theme'; + +// Keep class names in sync with _theme.scss and _global.scss +const DARK_THEME_CLASS = 'dark-theme'; +const LIGHT_THEME_CLASS = 'light-theme'; + +@Injectable() +export class ThemeService { + private win = inject(WINDOW); + private doc = inject(DOCUMENT); + private renderer: Renderer2; + readonly currentTheme = signal(LIGHT_THEME_CLASS); + + constructor(private _rendererFactory: RendererFactory2) { + this.renderer = this._rendererFactory.createRenderer(null, null); + this.toggleDarkMode(this.prefersDarkMode); + } + + private get prefersDarkMode(): boolean { + return this.win.matchMedia && this.win.matchMedia('(prefers-color-scheme: dark)').matches; + } + + toggleDarkMode(isDark: boolean): void { + const removeClass = isDark ? LIGHT_THEME_CLASS : DARK_THEME_CLASS; + const addClass = !isDark ? LIGHT_THEME_CLASS : DARK_THEME_CLASS; + this.renderer.removeClass(this.doc.body, removeClass); + this.renderer.addClass(this.doc.body, addClass); + this.currentTheme.set(addClass); + } + + initializeThemeWatcher(): void { + this.win.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => { + this.toggleDarkMode(this.prefersDarkMode); + }); + } +} diff --git a/devtools/projects/ng-devtools/src/lib/application-services/theme_service_spec.ts b/devtools/projects/ng-devtools/src/lib/application-services/theme_service_spec.ts new file mode 100644 index 000000000000..d443df19ec20 --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/application-services/theme_service_spec.ts @@ -0,0 +1,109 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {TestBed} from '@angular/core/testing'; +import {DOCUMENT} from '@angular/common'; +import {ThemeService} from './theme_service'; +import {WINDOW} from '../application-providers/window_provider'; + +function configureTestingModuleWithWindowMock(mock: Partial) { + TestBed.configureTestingModule({ + providers: [ + { + provide: WINDOW, + useValue: mock, + }, + ThemeService, + ], + }); +} + +function mockSystemTheme(initialTheme: 'light' | 'dark' = 'light') { + // Set the initial theme. + let currMediaString = `(prefers-color-scheme: ${initialTheme})`; + let matchMediaListener: (() => void) | null = null; + + return { + /** Alter the system theme */ + switchTheme: (theme: 'light' | 'dark') => { + currMediaString = `(prefers-color-scheme: ${theme})`; + if (matchMediaListener) { + matchMediaListener(); + } + }, + /** matchMedia mock */ + matchMedia: (mediaString: string): MediaQueryList => + ({ + matches: mediaString === currMediaString, + addEventListener: (e: string, cb: () => {}) => { + matchMediaListener = cb; + }, + }) as MediaQueryList, + }; +} + +describe('ThemeService', () => { + it(`should enable light mode, if it's the preferred/system one`, () => { + configureTestingModuleWithWindowMock({ + matchMedia: mockSystemTheme('light').matchMedia, + }); + + const service = TestBed.inject(ThemeService); + const doc = TestBed.inject(DOCUMENT); + + expect(service.currentTheme()).toEqual('light-theme'); + expect(doc.body.classList.contains('light-theme')).toBeTrue(); + }); + + it(`should enable dark mode, if it's the preferred/system one`, () => { + configureTestingModuleWithWindowMock({ + matchMedia: mockSystemTheme('dark').matchMedia, + }); + + const service = TestBed.inject(ThemeService); + const doc = TestBed.inject(DOCUMENT); + + expect(service.currentTheme()).toEqual('dark-theme'); + expect(doc.body.classList.contains('dark-theme')).toBeTrue(); + }); + + it('should toggle dark mode', () => { + configureTestingModuleWithWindowMock({ + matchMedia: mockSystemTheme('light').matchMedia, + }); + + const service = TestBed.inject(ThemeService); + // Toggle dark mode. + service.toggleDarkMode(true); + + const doc = TestBed.inject(DOCUMENT); + + expect(service.currentTheme()).toEqual('dark-theme'); + expect(doc.body.classList.contains('dark-theme')).toBeTrue(); + }); + + it('should update the theme automatically, if the system one changes', () => { + const {switchTheme, matchMedia} = mockSystemTheme('light'); + configureTestingModuleWithWindowMock({matchMedia}); + + const service = TestBed.inject(ThemeService); + // Initialize the watcher. + service.initializeThemeWatcher(); + + const docClassList = TestBed.inject(DOCUMENT).body.classList; + + expect(service.currentTheme()).toEqual('light-theme'); + expect(docClassList.contains('light-theme')).toBeTrue(); + + // This should simulate a system theme change, as if the user did it on OS level. + switchTheme('dark'); + + expect(service.currentTheme()).toEqual('dark-theme'); + expect(docClassList.contains('dark-theme')).toBeTrue(); + }); +}); diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/devtools-tabs/BUILD.bazel index 8b7f7e589767..751c31e7825b 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/BUILD.bazel +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/BUILD.bazel @@ -1,7 +1,7 @@ -load("//devtools/tools:ng_module.bzl", "ng_module") load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") -load("//devtools/tools:typescript.bzl", "ts_test_library") load("//devtools/tools:defaults.bzl", "karma_web_test_suite") +load("//devtools/tools:ng_module.bzl", "ng_module") +load("//devtools/tools:typescript.bzl", "ts_test_library") package(default_visibility = ["//visibility:public"]) @@ -20,9 +20,9 @@ ng_module( ":devtools_tabs_component_styles", ], deps = [ - "//devtools/projects/ng-devtools/src/lib:frame_manager", - "//devtools/projects/ng-devtools/src/lib:theme", "//devtools/projects/ng-devtools/src/lib/application-environment", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", + "//devtools/projects/ng-devtools/src/lib/application-services:theme", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree:injector_tree", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler", @@ -43,9 +43,9 @@ ts_test_library( srcs = ["devtools-tabs.spec.ts"], deps = [ ":devtools-tabs", - "//devtools/projects/ng-devtools/src/lib:frame_manager", - "//devtools/projects/ng-devtools/src/lib:theme", "//devtools/projects/ng-devtools/src/lib/application-environment", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", + "//devtools/projects/ng-devtools/src/lib/application-services:theme", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/tab-update", "//devtools/projects/protocol", diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.scss index 88c57007802d..4a3bc09ea12c 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.scss +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.scss @@ -36,14 +36,6 @@ ng-injector-tree.hidden { } } -:host-context(.dark-theme) { - #nav-buttons { - button { - color: #fff; - } - } -} - .inspector-active { color: #1a73e8 !important; } @@ -90,20 +82,6 @@ mat-icon { font-weight: 400; } -:host-context(.dark-theme) { - #version-number { - color: #5caace; - - &.unsupported-version { - color: red; - } - } - - .inspector-active { - color: #4688f1 !important; - } -} - @media only screen and (max-width: 700px) { #app-angular-version { max-width: 135px; @@ -145,4 +123,26 @@ mat-icon { background-color: #464646; color: #fff; } + + #app-angular-version { + color: #fff; + } + + #nav-buttons { + button { + color: #fff; + } + } + + #version-number { + color: #5caace; + + &.unsupported-version { + color: red; + } + } + + .inspector-active { + color: #4688f1 !important; + } } diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.ts index 7a014a2542cc..2fe50a0a0cf2 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.ts @@ -15,8 +15,8 @@ import {MatTooltip} from '@angular/material/tooltip'; import {Events, MessageBus, Route} from 'protocol'; import {ApplicationEnvironment, Frame, TOP_LEVEL_FRAME_ID} from '../application-environment/index'; -import {FrameManager} from '../frame_manager'; -import {ThemeService} from '../theme-service'; +import {FrameManager} from '../application-services/frame_manager'; +import {ThemeService} from '../application-services/theme_service'; import {DirectiveExplorerComponent} from './directive-explorer/directive-explorer.component'; import {InjectorTreeComponent} from './injector-tree/injector-tree.component'; diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.spec.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.spec.ts index 8c981ab89916..f27d9ab3de96 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.spec.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.spec.ts @@ -14,12 +14,12 @@ import {Events, MessageBus} from 'protocol'; import {Subject} from 'rxjs'; import {ApplicationEnvironment} from '../application-environment'; -import {Theme, ThemeService} from '../theme-service'; +import {Theme, ThemeService} from '../application-services/theme_service'; import {DevToolsTabsComponent} from './devtools-tabs.component'; import {TabUpdate} from './tab-update/index'; import {DirectiveExplorerComponent} from './directive-explorer/directive-explorer.component'; -import {FrameManager} from '../frame_manager'; +import {FrameManager} from '../application-services/frame_manager'; @Component({ selector: 'ng-directive-explorer', diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/BUILD.bazel index 46147c6d67b5..75ec58788897 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/BUILD.bazel +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/BUILD.bazel @@ -1,7 +1,7 @@ -load("//devtools/tools:ng_module.bzl", "ng_module") load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") -load("//devtools/tools:typescript.bzl", "ts_test_library") load("//devtools/tools:defaults.bzl", "karma_web_test_suite") +load("//devtools/tools:ng_module.bzl", "ng_module") +load("//devtools/tools:typescript.bzl", "ts_test_library") package(default_visibility = ["//visibility:public"]) @@ -43,8 +43,8 @@ ts_test_library( srcs = ["directive-explorer.spec.ts"], deps = [ ":directive-explorer", - "//devtools/projects/ng-devtools/src/lib:frame_manager", "//devtools/projects/ng-devtools/src/lib/application-operations", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest/breadcrumbs", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest/index-forest", diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.component.ts index 3f0e07979a72..c5d2711a01db 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.component.ts @@ -31,7 +31,7 @@ import { import {SplitComponent} from '../../../lib/vendor/angular-split/public_api'; import {ApplicationOperations} from '../../application-operations/index'; -import {FrameManager} from '../../frame_manager'; +import {FrameManager} from '../../application-services/frame_manager'; import {BreadcrumbsComponent} from './directive-forest/breadcrumbs/breadcrumbs.component'; import {FlatNode} from './directive-forest/component-data-source'; diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.spec.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.spec.ts index ad0d0bc31119..3a2ca28c3197 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.spec.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.spec.ts @@ -17,7 +17,7 @@ import {IndexedNode} from './directive-forest/index-forest'; import SpyObj = jasmine.SpyObj; import {By} from '@angular/platform-browser'; -import {FrameManager} from '../../frame_manager'; +import {FrameManager} from '../../application-services/frame_manager'; import {Component, CUSTOM_ELEMENTS_SCHEMA, output, input} from '@angular/core'; import {ElementPropertyResolver, FlatNode} from './property-resolver/element-property-resolver'; import {BreadcrumbsComponent} from './directive-forest/breadcrumbs/breadcrumbs.component'; diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest/directive-forest.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest/directive-forest.component.ts index 49382e0da64b..cfbccc4376ce 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest/directive-forest.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest/directive-forest.component.ts @@ -82,6 +82,7 @@ export class DirectiveForestComponent { readonly itemHeight = 18; private _initialized = false; + private _forestRoot: FlatNode | null = null; private resizeObserver: ResizeObserver; private _tabUpdate = inject(TabUpdate); @@ -111,7 +112,8 @@ export class DirectiveForestComponent { const result = this.updateForestResult(); const changed = result.movedItems.length || result.newItems.length || result.removedItems.length; - if (this.currentSelectedElement() && changed) { + + if (changed) { this._reselectNodeOnUpdate(); } }); @@ -196,6 +198,8 @@ export class DirectiveForestComponent { ); if (nodeThatStillExists) { this.select(nodeThatStillExists); + } else if (this._forestRoot) { + this.select(this._forestRoot); } else { this.clearSelectedNode(); } @@ -207,6 +211,8 @@ export class DirectiveForestComponent { removedItems: FlatNode[]; } { const result = this.dataSource.update(forest, this.showCommentNodes()); + this._forestRoot = this.dataSource.data[0]; + if (!this._initialized && forest && forest.length) { this.treeControl.expandAll(); this._initialized = true; diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.scss index b4c4d74dba76..179e7a16acd6 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.scss +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.scss @@ -43,3 +43,9 @@ } } } + +:host-context(.dark-theme) { + .element-name { + color: #ffffff; + } +} diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/BUILD.bazel index ad2c5d627694..721d0295f249 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/BUILD.bazel +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/BUILD.bazel @@ -47,8 +47,8 @@ ng_module( "property-tab-body.component.html", ] + _STYLE_LABELS, deps = [ - "//devtools/projects/ng-devtools/src/lib:frame_manager", "//devtools/projects/ng-devtools/src/lib/application-environment", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/dependency-injection:injector_tree_visualizer", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/dependency-injection:resolution_path", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest/index-forest", diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.html index a1eb37a5c557..4ff276255e91 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.html @@ -3,7 +3,7 @@
    diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.ts index 90e5965a9228..583db0f2fd38 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.ts @@ -29,9 +29,9 @@ export class PropertyTabBodyComponent { if (!selected) { return; } - const directives = selected.directives.map((d) => d.name); + const directives = [...selected.directives]; if (selected.component) { - directives.push(selected.component.name); + directives.push(selected.component); } return directives; }); diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.ts index 0a4282577b07..37b70c3dd071 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.ts @@ -57,14 +57,14 @@ export class PropertyViewBodyComponent { >(() => { return [ { - title: '@Inputs', + title: 'Inputs', hidden: this.directiveInputControls().dataSource.data.length === 0, controls: this.directiveInputControls(), documentation: 'https://angular.dev/api/core/input', class: 'cy-inputs', }, { - title: '@Outputs', + title: 'Outputs', hidden: this.directiveOutputControls().dataSource.data.length === 0, controls: this.directiveOutputControls(), documentation: 'https://angular.dev/api/core/output', diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.scss index d63bad02ea72..546a76257833 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.scss +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.scss @@ -2,7 +2,6 @@ width: 100%; display: block; overflow: auto; - height: calc(100% - 24px); mat-tree { display: table; diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.html index 0db69adf29c6..dbc5599462ce 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.html @@ -1,5 +1,5 @@ (); + readonly directive = input.required<{name: string}>(); readonly inspect = output<{node: FlatNode; directivePosition: DirectivePosition}>(); readonly viewSource = output(); private _nestedProps = inject(ElementPropertyResolver); - readonly controller = computed(() => this._nestedProps.getDirectiveController(this.directive())); + readonly controller = computed(() => + this._nestedProps.getDirectiveController(this.directive().name), + ); readonly directiveInputControls = computed(() => this.controller()?.directiveInputControls); diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/BUILD.bazel index bfc097a3e50a..942e155b4f33 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/BUILD.bazel +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/BUILD.bazel @@ -1,7 +1,7 @@ -load("//devtools/tools:ng_module.bzl", "ng_module") load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") -load("//devtools/tools:typescript.bzl", "ts_library", "ts_test_library") load("//devtools/tools:defaults.bzl", "karma_web_test_suite") +load("//devtools/tools:ng_module.bzl", "ng_module") +load("//devtools/tools:typescript.bzl", "ts_library", "ts_test_library") package(default_visibility = ["//:__subpackages__"]) @@ -20,10 +20,10 @@ ng_module( "injector-tree.component.html", ], deps = [ - ":injector_providers", ":injector_tree_fns", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/dependency-injection:injector_tree_visualizer", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/dependency-injection:resolution_path", + "//devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers", "//devtools/projects/ng-devtools/src/lib/vendor/angular-split", "//devtools/projects/protocol", "//packages/common", @@ -35,21 +35,6 @@ ng_module( ], ) -ng_module( - name = "injector_providers", - srcs = [ - "injector-providers.component.ts", - ], - deps = [ - "//devtools/projects/ng-devtools/src/lib/devtools-tabs/dependency-injection:resolution_path", - "//devtools/projects/protocol", - "//packages/animations", - "//packages/common", - "//packages/core", - "@npm//@angular/material", - ], -) - karma_web_test_suite( name = "test", deps = [ diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts deleted file mode 100644 index 02cae9ee2e0b..000000000000 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts +++ /dev/null @@ -1,199 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {Component, computed, inject, input, signal} from '@angular/core'; -import {MatOption} from '@angular/material/core'; -import {MatFormField, MatLabel} from '@angular/material/form-field'; -import {MatIcon} from '@angular/material/icon'; -import {MatInput} from '@angular/material/input'; -import {MatSelect} from '@angular/material/select'; -import {MatTableModule} from '@angular/material/table'; -import {MatTooltip} from '@angular/material/tooltip'; -import {Events, MessageBus, SerializedInjector, SerializedProviderRecord} from 'protocol'; - -@Component({ - selector: 'ng-injector-providers', - template: ` -

    Providers for {{ injector()?.name }}

    - @if (injector()) { -
    - - Search by token - - close - - - Search by type - - None - @for (type of providerTypes; track type) { - {{ $any(providerTypeToLabel)[type] }} - } - - - @if (visibleProviders().length > 0) { - - - - - - - - - - - - - - - - - - - -

    Token

    {{ provider.token }}

    Type

    - @if (provider.type === 'multi') { multi (x{{ provider.index.length }}) } @else { - {{ $any(providerTypeToLabel)[provider.type] }} - } -

    Is View Provider

    - {{ provider.isViewProvider ? 'check_circle' : 'cancel' }} -

    - send -
    - } -
    - } - `, - styles: [ - ` - .select { - cursor: pointer; - } - - :host { - display: block; - padding: 16px; - } - - .form-field-spacer { - margin: 0 4px 0 4px; - } - - table { - width: 100%; - } - - .column-title { - margin: 0; - } - - tr.example-detail-row { - height: 0; - } - - .example-element-row td { - border-bottom-width: 0; - cursor: pointer; - } - - .example-element-detail { - overflow: hidden; - display: flex; - } - - .example-element-diagram { - min-width: 80px; - border: 2px solid black; - padding: 8px; - font-weight: lighter; - margin: 8px 0; - height: 104px; - } - - .example-element-symbol { - font-weight: bold; - font-size: 40px; - line-height: normal; - } - - .example-element-description { - padding: 16px; - } - - .example-element-description-attribution { - opacity: 0.5; - } - `, - ], - imports: [ - MatTableModule, - MatIcon, - MatTooltip, - MatInput, - MatSelect, - MatFormField, - MatLabel, - MatOption, - ], -}) -export class InjectorProvidersComponent { - readonly injector = input.required(); - readonly providers = input([]); - - readonly searchToken = signal(''); - readonly searchType = signal(''); - readonly visibleProviders = computed(() => { - const searchToken = this.searchToken().toLowerCase(); - const searchType = this.searchType(); - - const predicates: ((provider: SerializedProviderRecord) => boolean)[] = []; - searchToken && - predicates.push((provider) => provider.token.toLowerCase().includes(searchToken)); - searchType && predicates.push((provider) => provider.type === searchType); - - return this.providers().filter((provider) => - predicates.every((predicate) => predicate(provider)), - ); - }); - - providerTypeToLabel = { - type: 'Type', - existing: 'useExisting', - factory: 'useFactory', - class: 'useClass', - value: 'useValue', - }; - - providerTypes = Object.keys(this.providerTypeToLabel); - - messageBus = inject>(MessageBus); - - select(row: SerializedProviderRecord) { - const {id, type, name} = this.injector(); - this.messageBus.emit('logProvider', [{id, type, name}, row]); - } - - get displayedColumns(): string[] { - if (this.injector()?.type === 'element') { - return ['token', 'type', 'isViewProvider', 'log']; - } - return ['token', 'type', 'log']; - } -} diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/BUILD.bazel new file mode 100644 index 000000000000..27204f4d5f5a --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/BUILD.bazel @@ -0,0 +1,32 @@ +load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") +load("//devtools/tools:ng_module.bzl", "ng_module") + +package(default_visibility = ["//visibility:public"]) + +sass_binary( + name = "injector_providers_component_styles", + src = "injector-providers.component.scss", + include_paths = [ + "external/npm/node_modules", + ], + deps = ["//devtools/projects/ng-devtools/src/styles:material_sass_deps"], +) + +ng_module( + name = "injector-providers", + srcs = [ + "injector-providers.component.ts", + ], + angular_assets = [ + "injector-providers.component.html", + ":injector_providers_component_styles", + ], + deps = [ + "//devtools/projects/ng-devtools/src/lib/devtools-tabs/dependency-injection:resolution_path", + "//devtools/projects/protocol", + "//packages/animations", + "//packages/common", + "//packages/core", + "@npm//@angular/material", + ], +) diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.html new file mode 100644 index 000000000000..aa022c8ea8c3 --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.html @@ -0,0 +1,65 @@ +

    Providers for {{ injector()?.name }}

    +@if (injector()) { +
    +
    + + Search by token + + close + + + Search by type + + None + @for (type of providerTypes; track type) { + {{ $any(providerTypeToLabel)[type] }} + } + + +
    + @if (visibleProviders().length > 0) { + + + + + + + + + + + + + + + + + + + +

    Token

    {{ provider.token }}

    Type

    + @if (provider.type === 'multi') { + multi (x{{ provider.index.length }}) + } @else { + {{ $any(providerTypeToLabel)[provider.type] }} + } +

    Is View Provider

    + {{ provider.isViewProvider ? 'check_circle' : 'cancel' }} +

    + send +
    + } +
    +} diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.scss new file mode 100644 index 000000000000..a5867686b199 --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.scss @@ -0,0 +1,89 @@ +@use '@angular/material' as mat; + +h2 { + font-size: 0.875rem; +} + +.select { + cursor: pointer; +} + +:host { + display: block; + padding: 16px; +} + +.filter { + display: flex; + gap: 0.5rem; + + mat-form-field { + @include mat.form-field-density(-5); + @include mat.form-field-overrides( + ( + container-text-size: 0.8rem, + outlined-label-text-size: 0.8rem, + ) + ); + + &:first-child { + flex: 1; + } + } +} + +table { + width: 100%; + --mat-table-row-item-label-text-size: 0.8rem; + --mat-table-header-container-height: 42px; + --mat-table-row-item-container-height: 42px; +} + +.column-title { + margin: 0; + font-size: 0.8rem; + font-weight: bold; +} + +tr.example-detail-row { + height: 0; +} + +.example-element-row td { + border-bottom-width: 0; + cursor: pointer; +} + +.example-element-detail { + overflow: hidden; + display: flex; +} + +.example-element-diagram { + min-width: 80px; + border: 2px solid black; + padding: 8px; + font-weight: lighter; + margin: 8px 0; + height: 104px; +} + +.example-element-symbol { + font-weight: bold; + font-size: 40px; + line-height: normal; +} + +.example-element-description { + padding: 16px; +} + +.example-element-description-attribution { + opacity: 0.5; +} + +:host-context(.dark-theme) { + .providers-title { + color: #ffffff; + } +} diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.ts new file mode 100644 index 000000000000..1299a2c4ad5b --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.ts @@ -0,0 +1,77 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {Component, computed, inject, input, signal} from '@angular/core'; +import {MatOption} from '@angular/material/core'; +import {MatFormField, MatLabel} from '@angular/material/form-field'; +import {MatIcon} from '@angular/material/icon'; +import {MatInput} from '@angular/material/input'; +import {MatSelect} from '@angular/material/select'; +import {MatTableModule} from '@angular/material/table'; +import {MatTooltip} from '@angular/material/tooltip'; +import {Events, MessageBus, SerializedInjector, SerializedProviderRecord} from 'protocol'; + +@Component({ + selector: 'ng-injector-providers', + templateUrl: './injector-providers.component.html', + styleUrl: './injector-providers.component.scss', + imports: [ + MatTableModule, + MatIcon, + MatTooltip, + MatInput, + MatSelect, + MatFormField, + MatLabel, + MatOption, + ], +}) +export class InjectorProvidersComponent { + readonly injector = input.required(); + readonly providers = input([]); + + readonly searchToken = signal(''); + readonly searchType = signal(''); + readonly visibleProviders = computed(() => { + const searchToken = this.searchToken().toLowerCase(); + const searchType = this.searchType(); + + const predicates: ((provider: SerializedProviderRecord) => boolean)[] = []; + searchToken && + predicates.push((provider) => provider.token.toLowerCase().includes(searchToken)); + searchType && predicates.push((provider) => provider.type === searchType); + + return this.providers().filter((provider) => + predicates.every((predicate) => predicate(provider)), + ); + }); + + providerTypeToLabel = { + type: 'Type', + existing: 'useExisting', + factory: 'useFactory', + class: 'useClass', + value: 'useValue', + }; + + providerTypes = Object.keys(this.providerTypeToLabel); + + messageBus = inject>(MessageBus); + + select(row: SerializedProviderRecord) { + const {id, type, name} = this.injector(); + this.messageBus.emit('logProvider', [{id, type, name}, row]); + } + + get displayedColumns(): string[] { + if (this.injector()?.type === 'element') { + return ['token', 'type', 'isViewProvider', 'log']; + } + return ['token', 'type', 'log']; + } +} diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.html index 45cbbaacb832..a044dc3676ba 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.html @@ -11,10 +11,14 @@ [disabled]="true" > - - Hide injectors with no providers - - Hide framework injectors +
    + + Hide injectors with no providers + + + Hide framework injectors + +
    @@ -23,7 +27,7 @@

    - Environment Hierarchy + Environment Hierarchy

    - Element Hierarchy + Element Hierarchy = LAST_SUPPORTED_VERSION || majorVersion === 0) && this.ivy(); }); - private readonly _firefoxStyleName = 'firefox_styles.css'; - private readonly _chromeStyleName = 'chrome_styles.css'; private readonly _messageBus = inject>(MessageBus); private readonly _themeService = inject(ThemeService); - private readonly _platform = inject(Platform); - private readonly _document = inject(DOCUMENT); private readonly _frameManager = inject(FrameManager); + private readonly _browserStyles = inject(BrowserStylesService); private _interval$ = interval(500).subscribe((attempt) => { if (attempt === DETECT_ANGULAR_ATTEMPTS) { @@ -95,6 +94,7 @@ export class DevToolsComponent implements OnInit, OnDestroy { ngOnInit(): void { this._themeService.initializeThemeWatcher(); + this._browserStyles.initBrowserSpecificStyles(); this._messageBus.once('ngAvailability', ({version, devMode, ivy, hydration}) => { this.angularStatus.set(version ? AngularStatus.EXISTS : AngularStatus.DOES_NOT_EXIST); @@ -104,22 +104,6 @@ export class DevToolsComponent implements OnInit, OnDestroy { this._interval$.unsubscribe(); this.hydration.set(hydration); }); - - const browserStyleName = this._platform.FIREFOX - ? this._firefoxStyleName - : this._chromeStyleName; - this._loadStyle(browserStyleName); - } - - /** Add a style file in header based on fileName */ - private _loadStyle(styleName: string) { - const head = this._document.getElementsByTagName('head')[0]; - - const style = this._document.createElement('link'); - style.rel = 'stylesheet'; - style.href = `./styles/${styleName}`; - - head.appendChild(style); } ngOnDestroy(): void { diff --git a/devtools/projects/ng-devtools/src/lib/devtools_spec.ts b/devtools/projects/ng-devtools/src/lib/devtools_spec.ts index 6005ce7f7523..c48f7e0843c6 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools_spec.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools_spec.ts @@ -8,7 +8,7 @@ import {Component} from '@angular/core'; import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {FrameManager} from './frame_manager'; +import {FrameManager} from './application-services/frame_manager'; import {DevToolsComponent} from './devtools.component'; import {DevToolsTabsComponent} from './devtools-tabs/devtools-tabs.component'; import {MessageBus} from 'protocol'; diff --git a/devtools/projects/ng-devtools/src/lib/theme-service.ts b/devtools/projects/ng-devtools/src/lib/theme-service.ts deleted file mode 100644 index d7c485a547fc..000000000000 --- a/devtools/projects/ng-devtools/src/lib/theme-service.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {Injectable, Renderer2, RendererFactory2, signal} from '@angular/core'; - -export type Theme = 'dark-theme' | 'light-theme'; - -@Injectable({ - providedIn: 'root', -}) -export class ThemeService { - private renderer: Renderer2; - readonly currentTheme = signal('light-theme'); - - constructor(private _rendererFactory: RendererFactory2) { - this.renderer = this._rendererFactory.createRenderer(null, null); - this.toggleDarkMode(this._prefersDarkMode); - } - - toggleDarkMode(isDark: boolean): void { - const removeClass = isDark ? 'light-theme' : 'dark-theme'; - const addClass = !isDark ? 'light-theme' : 'dark-theme'; - this.renderer.removeClass(document.body, removeClass); - this.renderer.addClass(document.body, addClass); - this.currentTheme.set(addClass); - } - - initializeThemeWatcher(): void { - window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => { - this.toggleDarkMode(this._prefersDarkMode); - }); - } - - private get _prefersDarkMode(): boolean { - return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; - } -} diff --git a/devtools/projects/ng-devtools/src/styles/BUILD.bazel b/devtools/projects/ng-devtools/src/styles/BUILD.bazel new file mode 100644 index 000000000000..d834265d052b --- /dev/null +++ b/devtools/projects/ng-devtools/src/styles/BUILD.bazel @@ -0,0 +1,42 @@ +load("@io_bazel_rules_sass//:defs.bzl", "npm_sass_library", "sass_binary", "sass_library") + +package(default_visibility = ["//visibility:public"]) + +npm_sass_library( + name = "material_sass_deps", + deps = [ + "@npm//@angular/cdk", + "@npm//@angular/material", + ], +) + +sass_library( + name = "global", + srcs = ["_global.scss"], + deps = [":material_sass_deps"], +) + +sass_library( + name = "theme", + srcs = ["_theme.scss"], +) + +sass_library( + name = "browser", + srcs = ["_browser.scss"], +) + +sass_library( + name = "colors", + srcs = ["_colors.scss"], +) + +sass_binary( + name = "firefox", + src = "firefox.scss", +) + +sass_binary( + name = "chrome", + src = "chrome.scss", +) diff --git a/devtools/projects/ng-devtools/src/styles/_browser.scss b/devtools/projects/ng-devtools/src/styles/_browser.scss new file mode 100644 index 000000000000..98a5963424b3 --- /dev/null +++ b/devtools/projects/ng-devtools/src/styles/_browser.scss @@ -0,0 +1,15 @@ +/* Keep class names in sync with ThemeService */ + +/* Default. Target Chrome */ +@mixin chrome { + :host-context(.chrome-ui) { + @content; + } +} + +/* Target Firefox */ +@mixin firefox { + :host-context(.firefox-ui) { + @content; + } +} diff --git a/devtools/projects/ng-devtools/src/styles/_colors.scss b/devtools/projects/ng-devtools/src/styles/_colors.scss new file mode 100644 index 000000000000..334e90df56dc --- /dev/null +++ b/devtools/projects/ng-devtools/src/styles/_colors.scss @@ -0,0 +1 @@ +$dummy: #f00; diff --git a/devtools/styles.scss b/devtools/projects/ng-devtools/src/styles/_global.scss similarity index 88% rename from devtools/styles.scss rename to devtools/projects/ng-devtools/src/styles/_global.scss index c6c789e2ccea..5a74158c7aa7 100644 --- a/devtools/styles.scss +++ b/devtools/projects/ng-devtools/src/styles/_global.scss @@ -1,3 +1,5 @@ +/* Global styles imported in the main styles.scss of the app wrapper (shell, demo apps). */ + @use 'sass:map'; @use 'external/npm/node_modules/@angular/material/index' as mat; @include mat.all-component-typographies(); @@ -39,6 +41,7 @@ $dark-theme: map.deep-merge( ) ); +/* Keep class name in sync with ThemeService */ .light-theme { @include mat.all-component-themes($light-theme); @@ -47,6 +50,7 @@ $dark-theme: map.deep-merge( } } +/* Keep class name in sync with ThemeService */ .dark-theme { color-scheme: dark; background: #202124; diff --git a/devtools/projects/ng-devtools/src/styles/_theme.scss b/devtools/projects/ng-devtools/src/styles/_theme.scss new file mode 100644 index 000000000000..ce075843c2d5 --- /dev/null +++ b/devtools/projects/ng-devtools/src/styles/_theme.scss @@ -0,0 +1,30 @@ +/* Keep class names in sync with ThemeService */ +$_dark-theme-class: 'dark-theme'; +$_light-theme-class: 'light-theme'; + +/* $browser expects 'chrome', 'firefox' or 'safari' */ +@mixin _theme($theme, $browser: '') { + @if $browser == '' { + :host-context(body.#{$theme}) { + @content; + } + } @else { + /* Keep browser class name in sync with BrowserService. */ + $browser-class: $browser + '-ui'; + :host-context(body.#{$theme}.#{$browser-class}) { + @content; + } + } +} + +@mixin dark-theme($browser: '') { + @include _theme($_dark-theme-class, $browser) { + @content; + } +} + +@mixin light-theme($browser: '') { + @include _theme($_light-theme-class, $browser) { + @content; + } +} diff --git a/devtools/projects/ng-devtools/src/styles/chrome.scss b/devtools/projects/ng-devtools/src/styles/chrome.scss new file mode 100644 index 000000000000..8b1524d5c5bd --- /dev/null +++ b/devtools/projects/ng-devtools/src/styles/chrome.scss @@ -0,0 +1 @@ +/* Chrome-specific global styles */ diff --git a/devtools/projects/ng-devtools/src/styles/firefox.scss b/devtools/projects/ng-devtools/src/styles/firefox.scss new file mode 100644 index 000000000000..a338892ff93e --- /dev/null +++ b/devtools/projects/ng-devtools/src/styles/firefox.scss @@ -0,0 +1 @@ +/* Firefox-specific global styles */ diff --git a/devtools/projects/shell-browser/src/BUILD.bazel b/devtools/projects/shell-browser/src/BUILD.bazel index 9c946c6476c8..2250080a7149 100644 --- a/devtools/projects/shell-browser/src/BUILD.bazel +++ b/devtools/projects/shell-browser/src/BUILD.bazel @@ -1,10 +1,11 @@ -load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") +load("@aspect_bazel_lib//lib:copy_to_directory.bzl", "copy_to_directory") +load("@bazel_skylib//rules:common_settings.bzl", "string_flag") load("@build_bazel_rules_nodejs//:index.bzl", "js_library", "pkg_web") +load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") load("//devtools/tools:ng_module.bzl", "ng_module") load("//devtools/tools:typescript.bzl", "ts_library") -load("//tools:defaults.bzl", "esbuild") load("//devtools/tools/esbuild:index.bzl", "LINKER_PROCESSED_FW_PACKAGES") -load("@bazel_skylib//rules:common_settings.bzl", "string_flag") +load("//tools:defaults.bzl", "esbuild") package(default_visibility = ["//visibility:public"]) @@ -13,17 +14,19 @@ sass_binary( src = "styles.scss", include_paths = ["external/npm/node_modules"], sourcemap = False, - deps = ["//devtools:global_styles"], + deps = ["//devtools/projects/ng-devtools/src/styles:global"], ) -sass_binary( - name = "shell_firefox_styles", - src = "styles/firefox_styles.scss", -) - -sass_binary( - name = "shell_chrome_styles", - src = "styles/chrome_styles.scss", +copy_to_directory( + name = "browser_specific_styles", + srcs = [ + "//devtools/projects/ng-devtools/src/styles:chrome", + "//devtools/projects/ng-devtools/src/styles:firefox", + ], + out = "styles", + replace_prefixes = { + "devtools/projects/ng-devtools/src/styles": "", + }, ) ts_library( @@ -95,10 +98,9 @@ exports_files(["index.html"]) filegroup( name = "prod_app_static_files", srcs = [ + ":browser_specific_styles", ":index.html", - ":shell_chrome_styles", ":shell_common_styles", - ":shell_firefox_styles", "//packages/zone.js/bundles:zone.umd.js", ], ) diff --git a/devtools/projects/shell-browser/src/app/app.config.ts b/devtools/projects/shell-browser/src/app/app.config.ts index a0b6673e9ea9..d5c37fda24c8 100644 --- a/devtools/projects/shell-browser/src/app/app.config.ts +++ b/devtools/projects/shell-browser/src/app/app.config.ts @@ -14,7 +14,7 @@ import {ChromeApplicationEnvironment} from './chrome-application-environment'; import {ChromeApplicationOperations} from './chrome-application-operations'; import {ZoneAwareChromeMessageBus} from './zone-aware-chrome-message-bus'; import {Events, MessageBus, PriorityAwareMessageBus} from 'protocol'; -import {FrameManager} from '../../../ng-devtools/src/lib/frame_manager'; +import {FrameManager} from '../../../ng-devtools/src/lib/application-services/frame_manager'; export const appConfig: ApplicationConfig = { providers: [ diff --git a/devtools/projects/shell-browser/src/manifest/manifest.chrome.json b/devtools/projects/shell-browser/src/manifest/manifest.chrome.json index bc7f82ca9b78..b328f5c05467 100644 --- a/devtools/projects/shell-browser/src/manifest/manifest.chrome.json +++ b/devtools/projects/shell-browser/src/manifest/manifest.chrome.json @@ -3,8 +3,8 @@ "short_name": "Angular DevTools", "name": "Angular DevTools", "description": "Angular DevTools extends Chrome DevTools adding Angular specific debugging and profiling capabilities.", - "version": "1.0.19", - "version_name": "1.0.19", + "version": "1.0.23", + "version_name": "1.0.23", "minimum_chrome_version": "102", "content_security_policy": { "extension_pages": "script-src 'self'; object-src 'self'" diff --git a/devtools/projects/shell-browser/src/manifest/manifest.firefox.json b/devtools/projects/shell-browser/src/manifest/manifest.firefox.json index 9e00df987b39..4c6231480f5d 100644 --- a/devtools/projects/shell-browser/src/manifest/manifest.firefox.json +++ b/devtools/projects/shell-browser/src/manifest/manifest.firefox.json @@ -3,7 +3,7 @@ "short_name": "Angular DevTools", "name": "Angular DevTools", "description": "Angular DevTools extends Firefox DevTools adding Angular specific debugging and profiling capabilities.", - "version": "1.0.19", + "version": "1.0.23", "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", "icons": { "16": "assets/icon16.png", diff --git a/devtools/projects/shell-browser/src/styles.scss b/devtools/projects/shell-browser/src/styles.scss index 7bc3816635c1..3c0d3a127593 100644 --- a/devtools/projects/shell-browser/src/styles.scss +++ b/devtools/projects/shell-browser/src/styles.scss @@ -1,4 +1,4 @@ -@use '../../../styles.scss' as devtools; +@use '../../../projects/ng-devtools/src/styles/global'; body, html { diff --git a/devtools/projects/shell-browser/src/styles/chrome_styles.scss b/devtools/projects/shell-browser/src/styles/chrome_styles.scss deleted file mode 100644 index 9959545b62fe..000000000000 --- a/devtools/projects/shell-browser/src/styles/chrome_styles.scss +++ /dev/null @@ -1 +0,0 @@ -/** Specific style for Chrome browser */ diff --git a/devtools/projects/shell-browser/src/styles/firefox_styles.scss b/devtools/projects/shell-browser/src/styles/firefox_styles.scss deleted file mode 100644 index af7608ad155f..000000000000 --- a/devtools/projects/shell-browser/src/styles/firefox_styles.scss +++ /dev/null @@ -1 +0,0 @@ -/** Specific style for Firefox browser */ diff --git a/devtools/src/BUILD.bazel b/devtools/src/BUILD.bazel index ccca6207b5b9..f5ba71ab6b15 100644 --- a/devtools/src/BUILD.bazel +++ b/devtools/src/BUILD.bazel @@ -1,8 +1,9 @@ -load("//devtools/tools:ng_module.bzl", "ng_module") -load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") +load("@aspect_bazel_lib//lib:copy_to_directory.bzl", "copy_to_directory") load("@build_bazel_rules_nodejs//:index.bzl", "pkg_web") -load("//tools:defaults.bzl", "esbuild", "http_server") +load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") +load("//devtools/tools:ng_module.bzl", "ng_module") load("//devtools/tools/esbuild:index.bzl", "LINKER_PROCESSED_FW_PACKAGES") +load("//tools:defaults.bzl", "esbuild", "http_server") package(default_visibility = ["//visibility:public"]) @@ -11,17 +12,19 @@ sass_binary( src = "styles.scss", include_paths = ["external/npm/node_modules"], sourcemap = False, - deps = ["//devtools:global_styles"], + deps = ["//devtools/projects/ng-devtools/src/styles:global"], ) -sass_binary( - name = "firefox_styles", - src = "styles/firefox_styles.scss", -) - -sass_binary( - name = "chrome_styles", - src = "styles/chrome_styles.scss", +copy_to_directory( + name = "browser_specific_styles", + srcs = [ + "//devtools/projects/ng-devtools/src/styles:chrome", + "//devtools/projects/ng-devtools/src/styles:firefox", + ], + out = "styles", + replace_prefixes = { + "devtools/projects/ng-devtools/src/styles": "", + }, ) ng_module( @@ -59,9 +62,8 @@ exports_files(["index.html"]) filegroup( name = "dev_app_static_files", srcs = [ - ":chrome_styles", + ":browser_specific_styles", ":demo_styles", - ":firefox_styles", ":index.html", "//packages/zone.js/bundles:zone.umd.js", ], diff --git a/devtools/src/app/demo-app/todo/routes/routes.component.ts b/devtools/src/app/demo-app/todo/routes/routes.component.ts index 5bbf27f9506e..4474a89163ba 100644 --- a/devtools/src/app/demo-app/todo/routes/routes.component.ts +++ b/devtools/src/app/demo-app/todo/routes/routes.component.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {Component, Injectable} from '@angular/core'; diff --git a/devtools/src/app/demo-app/todo/routes/routes.module.ts b/devtools/src/app/demo-app/todo/routes/routes.module.ts index 8a223e4678f7..4253c95af7bc 100644 --- a/devtools/src/app/demo-app/todo/routes/routes.module.ts +++ b/devtools/src/app/demo-app/todo/routes/routes.module.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {CommonModule} from '@angular/common'; diff --git a/devtools/src/app/devtools-app/BUILD.bazel b/devtools/src/app/devtools-app/BUILD.bazel index 9f5cb5689d7c..67fecc3ec09c 100644 --- a/devtools/src/app/devtools-app/BUILD.bazel +++ b/devtools/src/app/devtools-app/BUILD.bazel @@ -20,7 +20,7 @@ ng_module( ], deps = [ "//devtools/projects/ng-devtools", - "//devtools/projects/ng-devtools/src/lib:frame_manager", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", "//devtools/projects/protocol", "//devtools/src:iframe_message_bus", "//packages/common", diff --git a/devtools/src/app/devtools-app/devtools-app.routes.ts b/devtools/src/app/devtools-app/devtools-app.routes.ts index 9f4e03d7887c..8ef8b847e3b6 100644 --- a/devtools/src/app/devtools-app/devtools-app.routes.ts +++ b/devtools/src/app/devtools-app/devtools-app.routes.ts @@ -9,7 +9,7 @@ import {Routes} from '@angular/router'; import {AppDevToolsComponent} from './devtools-app.component'; -import {FrameManager} from '../../../projects/ng-devtools/src/lib/frame_manager'; +import {FrameManager} from '../../../projects/ng-devtools/src/lib/application-services/frame_manager'; import {Events, MessageBus, PriorityAwareMessageBus} from 'protocol'; import {IFrameMessageBus} from '../../iframe-message-bus'; diff --git a/devtools/src/styles.scss b/devtools/src/styles.scss index a8c02e791f07..7ce8097f55e9 100644 --- a/devtools/src/styles.scss +++ b/devtools/src/styles.scss @@ -1 +1 @@ -@use '../styles.scss' as devtools; +@use '../projects/ng-devtools/src/styles/global'; diff --git a/devtools/src/styles/chrome_styles.scss b/devtools/src/styles/chrome_styles.scss deleted file mode 100644 index 9959545b62fe..000000000000 --- a/devtools/src/styles/chrome_styles.scss +++ /dev/null @@ -1 +0,0 @@ -/** Specific style for Chrome browser */ diff --git a/devtools/src/styles/firefox_styles.scss b/devtools/src/styles/firefox_styles.scss deleted file mode 100644 index af7608ad155f..000000000000 --- a/devtools/src/styles/firefox_styles.scss +++ /dev/null @@ -1 +0,0 @@ -/** Specific style for Firefox browser */ diff --git a/goldens/README.md b/goldens/README.md index c2a44e126c79..b32b4e18d863 100644 --- a/goldens/README.md +++ b/goldens/README.md @@ -10,16 +10,3 @@ yarn public-api:check yarn public-api:update ``` -### *`packages-circular-deps.json`* - -This golden file contains a list of all circular dependencies in the project. As part of the -lint CI job we compare the current circular dependencies against this golden to ensure that -we don't add more cycles. If cycles have been fixed, this file is also updated so that we can -slowly burn down the number of cycles in the project. - -To check or update the golden, run the following commands: - -```bash -yarn ts-circular-deps:check -yarn ts-circular-deps:approve -``` diff --git a/goldens/circular-deps/packages.json b/goldens/circular-deps/packages.json deleted file mode 100644 index 0637a088a01e..000000000000 --- a/goldens/circular-deps/packages.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/goldens/public-api/common/http/errors.api.md b/goldens/public-api/common/http/errors.api.md index 29528aa7c765..312f919ff9a8 100644 --- a/goldens/public-api/common/http/errors.api.md +++ b/goldens/public-api/common/http/errors.api.md @@ -6,6 +6,8 @@ // @public export const enum RuntimeErrorCode { + // (undocumented) + CANNOT_SPECIFY_BOTH_FROM_STRING_AND_FROM_OBJECT = 2805, // (undocumented) HEADERS_ALTERED_BY_TRANSFER_CACHE = 2802, // (undocumented) @@ -15,7 +17,15 @@ export const enum RuntimeErrorCode { // (undocumented) MISSING_JSONP_MODULE = -2800, // (undocumented) - NOT_USING_FETCH_BACKEND_IN_SSR = 2801 + NOT_USING_FETCH_BACKEND_IN_SSR = 2801, + // (undocumented) + RESPONSE_IS_NOT_A_BLOB = 2807, + // (undocumented) + RESPONSE_IS_NOT_A_STRING = 2808, + // (undocumented) + RESPONSE_IS_NOT_AN_ARRAY_BUFFER = 2806, + // (undocumented) + UNHANDLED_OBSERVE_TYPE = 2809 } // (No @packageDocumentation comment for this package) diff --git a/goldens/public-api/common/http/index.api.md b/goldens/public-api/common/http/index.api.md index eb7a169a79c0..ba335014e623 100644 --- a/goldens/public-api/common/http/index.api.md +++ b/goldens/public-api/common/http/index.api.md @@ -8,9 +8,14 @@ import { EnvironmentInjector } from '@angular/core'; import { EnvironmentProviders } from '@angular/core'; import * as i0 from '@angular/core'; import { InjectionToken } from '@angular/core'; +import type { Injector } from '@angular/core'; import { ModuleWithProviders } from '@angular/core'; import { Observable } from 'rxjs'; import { Provider } from '@angular/core'; +import type { ResourceRef } from '@angular/core'; +import type { Signal } from '@angular/core'; +import type { ValueEqualityFn } from '@angular/core'; +import type { WritableResource } from '@angular/core'; import { XhrFactory } from '@angular/common'; // @public @@ -39,224 +44,160 @@ export abstract class HttpBackend implements HttpHandler { export class HttpClient { constructor(handler: HttpHandler); delete(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; body?: any | null; }): Observable; delete(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; body?: any | null; }): Observable; delete(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; body?: any | null; }): Observable; delete(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; body?: any | null; }): Observable>; delete(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; body?: any | null; }): Observable>; delete(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; body?: any | null; }): Observable>; delete(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; body?: any | null; }): Observable>; delete(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | (string | number | boolean)[]; - }; + params?: HttpParams | Record; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; body?: any | null; }): Observable>; delete(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; body?: any | null; }): Observable>; delete(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; body?: any | null; }): Observable>; delete(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; body?: any | null; }): Observable>; delete(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; body?: any | null; }): Observable>; delete(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; body?: any | null; }): Observable>; delete(url: string, options?: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; body?: any | null; }): Observable; delete(url: string, options?: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; body?: any | null; }): Observable; get(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -265,14 +206,10 @@ export class HttpClient { } | boolean; }): Observable; get(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -281,14 +218,10 @@ export class HttpClient { } | boolean; }): Observable; get(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -297,14 +230,10 @@ export class HttpClient { } | boolean; }): Observable; get(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -313,14 +242,10 @@ export class HttpClient { } | boolean; }): Observable>; get(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -329,14 +254,10 @@ export class HttpClient { } | boolean; }): Observable>; get(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -345,14 +266,10 @@ export class HttpClient { } | boolean; }): Observable>; get(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -361,14 +278,10 @@ export class HttpClient { } | boolean; }): Observable>; get(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -377,14 +290,10 @@ export class HttpClient { } | boolean; }): Observable>; get(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -393,14 +302,10 @@ export class HttpClient { } | boolean; }): Observable>; get(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -409,14 +314,10 @@ export class HttpClient { } | boolean; }): Observable>; get(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -425,14 +326,10 @@ export class HttpClient { } | boolean; }): Observable>; get(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -441,14 +338,10 @@ export class HttpClient { } | boolean; }): Observable>; get(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -457,14 +350,10 @@ export class HttpClient { } | boolean; }): Observable>; get(url: string, options?: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -473,14 +362,10 @@ export class HttpClient { } | boolean; }): Observable; get(url: string, options?: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -489,14 +374,10 @@ export class HttpClient { } | boolean; }): Observable; head(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -505,14 +386,10 @@ export class HttpClient { } | boolean; }): Observable; head(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -521,14 +398,10 @@ export class HttpClient { } | boolean; }): Observable; head(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -537,14 +410,10 @@ export class HttpClient { } | boolean; }): Observable; head(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -553,14 +422,10 @@ export class HttpClient { } | boolean; }): Observable>; head(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -569,14 +434,10 @@ export class HttpClient { } | boolean; }): Observable>; head(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -585,14 +446,10 @@ export class HttpClient { } | boolean; }): Observable>; head(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -601,14 +458,10 @@ export class HttpClient { } | boolean; }): Observable>; head(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -617,14 +470,10 @@ export class HttpClient { } | boolean; }): Observable>; head(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -633,14 +482,10 @@ export class HttpClient { } | boolean; }): Observable>; head(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -649,14 +494,10 @@ export class HttpClient { } | boolean; }): Observable>; head(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -665,14 +506,10 @@ export class HttpClient { } | boolean; }): Observable>; head(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -681,14 +518,10 @@ export class HttpClient { } | boolean; }): Observable>; head(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -697,14 +530,10 @@ export class HttpClient { } | boolean; }): Observable>; head(url: string, options?: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -713,14 +542,10 @@ export class HttpClient { } | boolean; }): Observable; head(url: string, options?: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -731,404 +556,280 @@ export class HttpClient { jsonp(url: string, callbackParam: string): Observable; jsonp(url: string, callbackParam: string): Observable; options(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; }): Observable; options(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; }): Observable; options(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; }): Observable; options(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; }): Observable>; options(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; }): Observable>; options(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; }): Observable>; options(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable>; options(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable>; options(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; }): Observable>; options(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; }): Observable>; options(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; }): Observable>; options(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable>; options(url: string, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable>; options(url: string, options?: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable; options(url: string, options?: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable; patch(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; }): Observable; patch(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; }): Observable; patch(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; }): Observable; patch(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; }): Observable>; patch(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; }): Observable>; patch(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; }): Observable>; patch(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable>; patch(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable>; patch(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; }): Observable>; patch(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; }): Observable>; patch(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; }): Observable>; patch(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable>; patch(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable>; patch(url: string, body: any | null, options?: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable; patch(url: string, body: any | null, options?: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable; post(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -1137,14 +838,10 @@ export class HttpClient { } | boolean; }): Observable; post(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -1153,14 +850,10 @@ export class HttpClient { } | boolean; }): Observable; post(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -1169,14 +862,10 @@ export class HttpClient { } | boolean; }): Observable; post(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -1185,14 +874,10 @@ export class HttpClient { } | boolean; }): Observable>; post(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -1201,14 +886,10 @@ export class HttpClient { } | boolean; }): Observable>; post(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -1217,14 +898,10 @@ export class HttpClient { } | boolean; }): Observable>; post(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1233,14 +910,10 @@ export class HttpClient { } | boolean; }): Observable>; post(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1249,14 +922,10 @@ export class HttpClient { } | boolean; }): Observable>; post(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -1265,14 +934,10 @@ export class HttpClient { } | boolean; }): Observable>; post(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -1281,14 +946,10 @@ export class HttpClient { } | boolean; }): Observable>; post(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -1297,14 +958,10 @@ export class HttpClient { } | boolean; }): Observable>; post(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1313,14 +970,10 @@ export class HttpClient { } | boolean; }): Observable>; post(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1329,14 +982,10 @@ export class HttpClient { } | boolean; }): Observable>; post(url: string, body: any | null, options?: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1345,14 +994,10 @@ export class HttpClient { } | boolean; }): Observable; post(url: string, body: any | null, options?: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1361,196 +1006,136 @@ export class HttpClient { } | boolean; }): Observable; put(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; }): Observable; put(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; }): Observable; put(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; }): Observable; put(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; }): Observable>; put(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; }): Observable>; put(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; }): Observable>; put(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable>; put(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable>; put(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; }): Observable>; put(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; }): Observable>; put(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; }): Observable>; put(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable>; put(url: string, body: any | null, options: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable>; put(url: string, body: any | null, options?: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable; put(url: string, body: any | null, options?: { - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1558,14 +1143,10 @@ export class HttpClient { request(req: HttpRequest): Observable>; request(method: string, url: string, options: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -1575,14 +1156,10 @@ export class HttpClient { }): Observable; request(method: string, url: string, options: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -1592,14 +1169,10 @@ export class HttpClient { }): Observable; request(method: string, url: string, options: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -1609,13 +1182,9 @@ export class HttpClient { }): Observable; request(method: string, url: string, options: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; observe: 'events'; reportProgress?: boolean; responseType: 'arraybuffer'; @@ -1626,14 +1195,10 @@ export class HttpClient { }): Observable>; request(method: string, url: string, options: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -1643,14 +1208,10 @@ export class HttpClient { }): Observable>; request(method: string, url: string, options: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -1660,15 +1221,11 @@ export class HttpClient { }): Observable>; request(method: string, url: string, options: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; reportProgress?: boolean; observe: 'events'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; responseType?: 'json'; withCredentials?: boolean; transferCache?: { @@ -1677,15 +1234,11 @@ export class HttpClient { }): Observable>; request(method: string, url: string, options: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; reportProgress?: boolean; observe: 'events'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; responseType?: 'json'; withCredentials?: boolean; transferCache?: { @@ -1694,14 +1247,10 @@ export class HttpClient { }): Observable>; request(method: string, url: string, options: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -1711,14 +1260,10 @@ export class HttpClient { }): Observable>; request(method: string, url: string, options: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -1728,14 +1273,10 @@ export class HttpClient { }): Observable>; request(method: string, url: string, options: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -1745,29 +1286,21 @@ export class HttpClient { }): Observable>; request(method: string, url: string, options: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; reportProgress?: boolean; observe: 'response'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; responseType?: 'json'; withCredentials?: boolean; }): Observable>; request(method: string, url: string, options: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; reportProgress?: boolean; observe: 'response'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; responseType?: 'json'; withCredentials?: boolean; transferCache?: { @@ -1776,14 +1309,10 @@ export class HttpClient { }): Observable>; request(method: string, url: string, options?: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; responseType?: 'json'; reportProgress?: boolean; withCredentials?: boolean; @@ -1793,14 +1322,10 @@ export class HttpClient { }): Observable; request(method: string, url: string, options?: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; responseType?: 'json'; reportProgress?: boolean; withCredentials?: boolean; @@ -1810,13 +1335,9 @@ export class HttpClient { }): Observable; request(method: string, url: string, options?: { body?: any; - headers?: HttpHeaders | { - [header: string]: string | string[]; - }; + headers?: HttpHeaders | Record; context?: HttpContext; - params?: HttpParams | { - [param: string]: string | number | boolean | ReadonlyArray; - }; + params?: HttpParams | Record>; observe?: 'body' | 'events' | 'response'; reportProgress?: boolean; responseType?: 'arraybuffer' | 'blob' | 'json' | 'text'; @@ -2153,6 +1674,84 @@ export class HttpRequest { readonly withCredentials: boolean; } +// @public +export const httpResource: HttpResourceFn; + +// @public +export interface HttpResourceFn { + (url: string | (() => string | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (url: string | (() => string | undefined), options?: HttpResourceOptions): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options?: HttpResourceOptions): HttpResourceRef; + arrayBuffer: { + (url: string | (() => string | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (url: string | (() => string | undefined), options?: HttpResourceOptions): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options?: HttpResourceOptions): HttpResourceRef; + }; + blob: { + (url: string | (() => string | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (url: string | (() => string | undefined), options?: HttpResourceOptions): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options?: HttpResourceOptions): HttpResourceRef; + }; + text: { + (url: string | (() => string | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (url: string | (() => string | undefined), options?: HttpResourceOptions): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options?: HttpResourceOptions): HttpResourceRef; + }; +} + +// @public +export interface HttpResourceOptions { + defaultValue?: NoInfer; + equal?: ValueEqualityFn>; + injector?: Injector; + parse?: (value: TRaw) => TResult; +} + +// @public +export interface HttpResourceRef extends WritableResource, ResourceRef { + // (undocumented) + destroy(): void; + // (undocumented) + hasValue(): this is HttpResourceRef>; + readonly headers: Signal; + readonly progress: Signal; + readonly statusCode: Signal; +} + +// @public +export interface HttpResourceRequest { + body?: unknown; + headers?: HttpHeaders | Record>; + method?: string; + params?: HttpParams | Record>; + reportProgress?: boolean; + transferCache?: { + includeHeaders?: string[]; + } | boolean; + url: string; + withCredentials?: boolean; +} + // @public export class HttpResponse extends HttpResponseBase { constructor(init?: { diff --git a/goldens/public-api/common/index.api.md b/goldens/public-api/common/index.api.md index bc3c75b958db..8029ec7aacee 100644 --- a/goldens/public-api/common/index.api.md +++ b/goldens/public-api/common/index.api.md @@ -601,7 +601,8 @@ export abstract class NgLocalization { } // @public -export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { +export class NgOptimizedImage implements OnInit, OnChanges { + constructor(); disableOptimizedSrcset: boolean; fill: boolean; height: number | undefined; @@ -626,8 +627,6 @@ export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { // (undocumented) ngOnChanges(changes: SimpleChanges): void; // (undocumented) - ngOnDestroy(): void; - // (undocumented) ngOnInit(): void; ngSrc: string; ngSrcset: string; diff --git a/goldens/public-api/core/index.api.md b/goldens/public-api/core/index.api.md index a8c38f6f029e..4e8fde3b2ea0 100644 --- a/goldens/public-api/core/index.api.md +++ b/goldens/public-api/core/index.api.md @@ -184,6 +184,14 @@ export interface AttributeDecorator { new (name: string): Attribute; } +// @public +export interface BaseResourceOptions { + defaultValue?: NoInfer; + equal?: ValueEqualityFn; + injector?: Injector; + request?: () => R; +} + // @public export function booleanAttribute(value: unknown): boolean; @@ -1436,6 +1444,12 @@ export class PlatformRef { // @public export type Predicate = (value: T) => boolean; +// @public +export interface PromiseResourceOptions extends BaseResourceOptions { + loader: ResourceLoader; + stream?: never; +} + // @public export function provideAppInitializer(initializerFn: () => Observable | Promise | void): EnvironmentProviders; @@ -1585,17 +1599,20 @@ export function resolveForwardRef(type: T): T; // @public export interface Resource { readonly error: Signal; - hasValue(): this is Resource & { - value: Signal; - }; + hasValue(): this is Resource>; readonly isLoading: Signal; reload(): boolean; readonly status: Signal; - readonly value: Signal; + readonly value: Signal; } // @public -export function resource(options: ResourceOptions): ResourceRef; +export function resource(options: ResourceOptions & { + defaultValue: NoInfer; +}): ResourceRef; + +// @public +export function resource(options: ResourceOptions): ResourceRef; // @public export type ResourceLoader = (param: ResourceLoaderParams) => PromiseLike; @@ -1612,17 +1629,14 @@ export interface ResourceLoaderParams { request: Exclude, undefined>; } -// @public -export interface ResourceOptions { - equal?: ValueEqualityFn; - injector?: Injector; - loader: ResourceLoader; - request?: () => R; -} +// @public (undocumented) +export type ResourceOptions = PromiseResourceOptions | StreamingResourceOptions; // @public export interface ResourceRef extends WritableResource { destroy(): void; + // (undocumented) + hasValue(): this is ResourceRef>; } // @public @@ -1635,6 +1649,16 @@ export enum ResourceStatus { Resolved = 4 } +// @public +export type ResourceStreamingLoader = (param: ResourceLoaderParams) => PromiseLike>>; + +// @public (undocumented) +export type ResourceStreamItem = { + value: T; +} | { + error: unknown; +}; + // @public export const RESPONSE_INIT: InjectionToken; @@ -1749,6 +1773,12 @@ export interface StaticClassSansProvider { // @public export type StaticProvider = ValueProvider | ExistingProvider | StaticClassProvider | ConstructorProvider | FactoryProvider | any[]; +// @public +export interface StreamingResourceOptions extends BaseResourceOptions { + loader?: never; + stream: ResourceStreamingLoader; +} + // @public export abstract class TemplateRef { abstract createEmbeddedView(context: C, injector?: Injector): EmbeddedViewRef; @@ -1984,13 +2014,11 @@ export interface WritableResource extends Resource { // (undocumented) asReadonly(): Resource; // (undocumented) - hasValue(): this is WritableResource & { - value: WritableSignal; - }; - set(value: T | undefined): void; - update(updater: (value: T | undefined) => T | undefined): void; + hasValue(): this is WritableResource>; + set(value: T): void; + update(updater: (value: T) => T): void; // (undocumented) - readonly value: WritableSignal; + readonly value: WritableSignal; } // @public diff --git a/goldens/public-api/core/primitives/signals/index.api.md b/goldens/public-api/core/primitives/signals/index.api.md index 55839c369336..ec12c218d206 100644 --- a/goldens/public-api/core/primitives/signals/index.api.md +++ b/goldens/public-api/core/primitives/signals/index.api.md @@ -4,6 +4,12 @@ ```ts +// @public +export type ComputationFn = (source: S, previous?: { + source: S; + value: D; +}) => D; + // @public export interface ComputedNode extends ReactiveNode { computation: () => T; @@ -31,6 +37,9 @@ export function consumerPollProducersForChange(node: ReactiveNode): boolean; // @public export function createComputed(computation: () => T): ComputedGetter; +// @public (undocumented) +export function createLinkedSignal(sourceFn: () => S, computationFn: ComputationFn, equalityFn?: ValueEqualityFn): LinkedSignalGetter; + // @public export function createSignal(initialValue: T): SignalGetter; @@ -49,6 +58,28 @@ export function isInNotificationPhase(): boolean; // @public (undocumented) export function isReactive(value: unknown): value is Reactive; +// @public (undocumented) +export type LinkedSignalGetter = (() => D) & { + [SIGNAL]: LinkedSignalNode; +}; + +// @public (undocumented) +export interface LinkedSignalNode extends ReactiveNode { + computation: ComputationFn; + // (undocumented) + equal: ValueEqualityFn; + error: unknown; + source: () => S; + sourceValue: S; + value: D; +} + +// @public (undocumented) +export function linkedSignalSetFn(node: LinkedSignalNode, newValue: D): void; + +// @public (undocumented) +export function linkedSignalUpdateFn(node: LinkedSignalNode, updater: (value: D) => D): void; + // @public export function producerAccessed(node: ReactiveNode): void; @@ -113,7 +144,7 @@ export function setAlternateWeakRefImpl(impl: unknown): void; export function setPostSignalSetFn(fn: (() => void) | null): (() => void) | null; // @public (undocumented) -export function setThrowInvalidWriteToSignalError(fn: () => never): void; +export function setThrowInvalidWriteToSignalError(fn: (node: SignalNode) => never): void; // @public export const SIGNAL: unique symbol; diff --git a/goldens/public-api/core/rxjs-interop/index.api.md b/goldens/public-api/core/rxjs-interop/index.api.md index 272442ad7774..02ff5112de8b 100644 --- a/goldens/public-api/core/rxjs-interop/index.api.md +++ b/goldens/public-api/core/rxjs-interop/index.api.md @@ -4,6 +4,7 @@ ```ts +import { BaseResourceOptions } from '@angular/core'; import { DestroyRef } from '@angular/core'; import { Injector } from '@angular/core'; import { MonoTypeOperatorFunction } from 'rxjs'; @@ -11,7 +12,6 @@ import { Observable } from 'rxjs'; import { OutputOptions } from '@angular/core'; import { OutputRef } from '@angular/core'; import { ResourceLoaderParams } from '@angular/core'; -import { ResourceOptions } from '@angular/core'; import { ResourceRef } from '@angular/core'; import { Signal } from '@angular/core'; import { Subscribable } from 'rxjs'; @@ -27,10 +27,15 @@ export function outputToObservable(ref: OutputRef): Observable; export function pendingUntilEvent(injector?: Injector): MonoTypeOperatorFunction; // @public -export function rxResource(opts: RxResourceOptions): ResourceRef; +export function rxResource(opts: RxResourceOptions & { + defaultValue: NoInfer; +}): ResourceRef; // @public -export interface RxResourceOptions extends Omit, 'loader'> { +export function rxResource(opts: RxResourceOptions): ResourceRef; + +// @public +export interface RxResourceOptions extends BaseResourceOptions { // (undocumented) loader: (params: ResourceLoaderParams) => Observable; } diff --git a/goldens/public-api/forms/index.api.md b/goldens/public-api/forms/index.api.md index 4c54cd86d0f2..52d149b932fa 100644 --- a/goldens/public-api/forms/index.api.md +++ b/goldens/public-api/forms/index.api.md @@ -556,7 +556,7 @@ export interface FormRecord { emitEvent?: boolean; }): void; setValue(value: { - [key: string]: ɵValue; + [key: string]: ɵRawValue; }, options?: { onlySelf?: boolean; emitEvent?: boolean; diff --git a/goldens/public-api/platform-browser/index.api.md b/goldens/public-api/platform-browser/index.api.md index 2b6b6a090066..5cd1b53f0145 100644 --- a/goldens/public-api/platform-browser/index.api.md +++ b/goldens/public-api/platform-browser/index.api.md @@ -33,9 +33,9 @@ export function bootstrapApplication(rootComponent: Type, options?: App // @public export class BrowserModule { - constructor(providersAlreadyPresent: boolean | null); + constructor(); // (undocumented) - static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵfac: i0.ɵɵFactoryDeclaration; // (undocumented) static ɵinj: i0.ɵɵInjectorDeclaration; // (undocumented) diff --git a/goldens/public-api/platform-server/index.api.md b/goldens/public-api/platform-server/index.api.md index c59b942becff..210b2c933819 100644 --- a/goldens/public-api/platform-server/index.api.md +++ b/goldens/public-api/platform-server/index.api.md @@ -7,8 +7,7 @@ import { ApplicationRef } from '@angular/core'; import { EnvironmentProviders } from '@angular/core'; import * as i0 from '@angular/core'; -import * as i1 from '@angular/platform-browser/animations'; -import * as i2 from '@angular/platform-browser'; +import * as i1 from '@angular/platform-browser'; import { InjectionToken } from '@angular/core'; import { PlatformRef } from '@angular/core'; import { Provider } from '@angular/core'; @@ -66,7 +65,7 @@ export class ServerModule { // (undocumented) static ɵinj: i0.ɵɵInjectorDeclaration; // (undocumented) - static ɵmod: i0.ɵɵNgModuleDeclaration; + static ɵmod: i0.ɵɵNgModuleDeclaration; } // @public (undocumented) diff --git a/goldens/public-api/platform-server/testing/index.api.md b/goldens/public-api/platform-server/testing/index.api.md index 4ef4c87f99fb..69d91c19c9be 100644 --- a/goldens/public-api/platform-server/testing/index.api.md +++ b/goldens/public-api/platform-server/testing/index.api.md @@ -5,8 +5,7 @@ ```ts import * as i0 from '@angular/core'; -import * as i1 from '@angular/platform-browser/animations'; -import * as i2 from '@angular/platform-browser-dynamic/testing'; +import * as i1 from '@angular/platform-browser-dynamic/testing'; import { PlatformRef } from '@angular/core'; import { StaticProvider } from '@angular/core'; @@ -20,7 +19,7 @@ export class ServerTestingModule { // (undocumented) static ɵinj: i0.ɵɵInjectorDeclaration; // (undocumented) - static ɵmod: i0.ɵɵNgModuleDeclaration; + static ɵmod: i0.ɵɵNgModuleDeclaration; } // (No @packageDocumentation comment for this package) diff --git a/goldens/public-api/router/index.api.md b/goldens/public-api/router/index.api.md index 51d17fc9fdf1..083eb4fe69a9 100644 --- a/goldens/public-api/router/index.api.md +++ b/goldens/public-api/router/index.api.md @@ -861,11 +861,11 @@ export class RouterLinkActive implements OnChanges, OnDestroy, AfterContentInit // @public export class RouterModule { - constructor(guard: any); + constructor(); static forChild(routes: Routes): ModuleWithProviders; static forRoot(routes: Routes, config?: ExtraOptions): ModuleWithProviders; // (undocumented) - static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵfac: i0.ɵɵFactoryDeclaration; // (undocumented) static ɵinj: i0.ɵɵInjectorDeclaration; // (undocumented) diff --git a/integration/typings_test_ts58/BUILD.bazel b/integration/typings_test_ts58/BUILD.bazel new file mode 100644 index 000000000000..8c3ee7710f11 --- /dev/null +++ b/integration/typings_test_ts58/BUILD.bazel @@ -0,0 +1,9 @@ +load("//integration:index.bzl", "ng_integration_test") + +ng_integration_test( + name = "test", + # Special case for `typings_test_ts58` test as we want to pin + # `typescript` at version 5.8.x for that test and not link to the + # root @npm//typescript package. + pinned_npm_packages = ["typescript"], +) diff --git a/integration/typings_test_ts58/include-all.ts b/integration/typings_test_ts58/include-all.ts new file mode 100644 index 000000000000..fd94c30afbf5 --- /dev/null +++ b/integration/typings_test_ts58/include-all.ts @@ -0,0 +1,67 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import * as animations from '@angular/animations'; +import * as animationsBrowser from '@angular/animations/browser'; +import * as animationsBrowserTesting from '@angular/animations/browser/testing'; +import * as common from '@angular/common'; +import * as commonHttp from '@angular/common/http'; +import * as commonTesting from '@angular/common/testing'; +import * as commonHttpTesting from '@angular/common/http/testing'; +import * as compiler from '@angular/compiler'; +import * as core from '@angular/core'; +import * as coreTesting from '@angular/core/testing'; +import * as elements from '@angular/elements'; +import * as forms from '@angular/forms'; +import * as localize from '@angular/localize'; +import * as platformBrowser from '@angular/platform-browser'; +import * as platformBrowserDynamic from '@angular/platform-browser-dynamic'; +import * as platformBrowserDynamicTesting from '@angular/platform-browser-dynamic/testing'; +import * as platformBrowserAnimations from '@angular/platform-browser/animations'; +import * as platformBrowserTesting from '@angular/platform-browser/testing'; +import * as platformServer from '@angular/platform-server'; +import * as platformServerInit from '@angular/platform-server/init'; +import * as platformServerTesting from '@angular/platform-server/testing'; +import * as router from '@angular/router'; +import * as routerTesting from '@angular/router/testing'; +import * as routerUpgrade from '@angular/router/upgrade'; +import * as serviceWorker from '@angular/service-worker'; +import * as upgrade from '@angular/upgrade'; +import * as upgradeStatic from '@angular/upgrade/static'; +import * as upgradeTesting from '@angular/upgrade/static/testing'; + +export default { + animations, + animationsBrowser, + animationsBrowserTesting, + common, + commonTesting, + commonHttp, + commonHttpTesting, + compiler, + core, + coreTesting, + elements, + forms, + localize, + platformBrowser, + platformBrowserTesting, + platformBrowserDynamic, + platformBrowserDynamicTesting, + platformBrowserAnimations, + platformServer, + platformServerInit, + platformServerTesting, + router, + routerTesting, + routerUpgrade, + serviceWorker, + upgrade, + upgradeStatic, + upgradeTesting, +}; diff --git a/integration/typings_test_ts58/package.json b/integration/typings_test_ts58/package.json new file mode 100644 index 000000000000..a5f6f78462c6 --- /dev/null +++ b/integration/typings_test_ts58/package.json @@ -0,0 +1,29 @@ +{ + "name": "angular-integration", + "description": "Assert that users with TypeScript 5.8 can type-check an Angular application", + "version": "0.0.0", + "license": "MIT", + "dependencies": { + "@angular/animations": "file:../../dist/packages-dist/animations", + "@angular/common": "file:../../dist/packages-dist/common", + "@angular/compiler": "file:../../dist/packages-dist/compiler", + "@angular/compiler-cli": "file:../../dist/packages-dist/compiler-cli", + "@angular/core": "file:../../dist/packages-dist/core", + "@angular/elements": "file:../../dist/packages-dist/elements", + "@angular/forms": "file:../../dist/packages-dist/forms", + "@angular/localize": "file:../../dist/packages-dist/localize", + "@angular/platform-browser": "file:../../dist/packages-dist/platform-browser", + "@angular/platform-browser-dynamic": "file:../../dist/packages-dist/platform-browser-dynamic", + "@angular/platform-server": "file:../../dist/packages-dist/platform-server", + "@angular/router": "file:../../dist/packages-dist/router", + "@angular/service-worker": "file:../../dist/packages-dist/service-worker", + "@angular/upgrade": "file:../../dist/packages-dist/upgrade", + "@types/jasmine": "file:../../node_modules/@types/jasmine", + "rxjs": "file:../../node_modules/rxjs", + "typescript": "5.8.1-rc", + "zone.js": "0.14.10" + }, + "scripts": { + "test": "tsc" + } +} diff --git a/integration/typings_test_ts58/tsconfig.json b/integration/typings_test_ts58/tsconfig.json new file mode 100644 index 000000000000..9305a8c949c0 --- /dev/null +++ b/integration/typings_test_ts58/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "experimentalDecorators": true, + "module": "commonjs", + "moduleResolution": "node", + "outDir": "./dist/out-tsc", + "rootDir": ".", + "target": "ES2020", + "lib": [ + "es5", + "dom", + "es2015.collection", + "es2015.iterable", + "es2015.promise" + ], + "types": [], + }, + "files": [ + "include-all.ts", + "node_modules/@types/jasmine/index.d.ts" + ] +} diff --git a/integration/typings_test_ts58/yarn.lock b/integration/typings_test_ts58/yarn.lock new file mode 100644 index 000000000000..eb8068719632 --- /dev/null +++ b/integration/typings_test_ts58/yarn.lock @@ -0,0 +1,704 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@angular/animations@file:../../dist/packages-dist/animations": + version "19.2.0-next.2" + dependencies: + tslib "^2.3.0" + +"@angular/common@file:../../dist/packages-dist/common": + version "19.2.0-next.2" + dependencies: + tslib "^2.3.0" + +"@angular/compiler-cli@file:../../dist/packages-dist/compiler-cli": + version "19.2.0-next.2" + dependencies: + "@babel/core" "7.26.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + chokidar "^4.0.0" + convert-source-map "^1.5.1" + reflect-metadata "^0.2.0" + semver "^7.0.0" + tslib "^2.3.0" + yargs "^17.2.1" + +"@angular/compiler@file:../../dist/packages-dist/compiler": + version "19.2.0-next.2" + dependencies: + tslib "^2.3.0" + +"@angular/core@file:../../dist/packages-dist/core": + version "19.2.0-next.2" + dependencies: + tslib "^2.3.0" + +"@angular/elements@file:../../dist/packages-dist/elements": + version "19.2.0-next.2" + dependencies: + tslib "^2.3.0" + +"@angular/forms@file:../../dist/packages-dist/forms": + version "19.2.0-next.2" + dependencies: + tslib "^2.3.0" + +"@angular/localize@file:../../dist/packages-dist/localize": + version "19.2.0-next.2" + dependencies: + "@babel/core" "7.26.0" + "@types/babel__core" "7.20.5" + fast-glob "3.3.3" + yargs "^17.2.1" + +"@angular/platform-browser-dynamic@file:../../dist/packages-dist/platform-browser-dynamic": + version "19.2.0-next.2" + dependencies: + tslib "^2.3.0" + +"@angular/platform-browser@file:../../dist/packages-dist/platform-browser": + version "19.2.0-next.2" + dependencies: + tslib "^2.3.0" + +"@angular/platform-server@file:../../dist/packages-dist/platform-server": + version "19.2.0-next.2" + dependencies: + tslib "^2.3.0" + xhr2 "^0.2.0" + +"@angular/router@file:../../dist/packages-dist/router": + version "19.2.0-next.2" + dependencies: + tslib "^2.3.0" + +"@angular/service-worker@file:../../dist/packages-dist/service-worker": + version "19.2.0-next.2" + dependencies: + tslib "^2.3.0" + +"@angular/upgrade@file:../../dist/packages-dist/upgrade": + version "19.2.0-next.2" + dependencies: + tslib "^2.3.0" + +"@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/compat-data@^7.25.9": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" + integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== + +"@babel/core@7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.25.9", "@babel/generator@^7.26.0": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" + integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== + dependencies: + "@babel/parser" "^7.26.2" + "@babel/types" "^7.26.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== + dependencies: + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" + +"@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" + integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== + dependencies: + "@babel/types" "^7.26.0" + +"@babel/template@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + +"@babel/types@^7.25.9", "@babel/types@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" + integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@types/babel__core@7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/jasmine@file:../../node_modules/@types/jasmine": + version "5.1.5" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.24.0: + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== + dependencies: + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" + node-releases "^2.0.18" + update-browserslist-db "^1.1.1" + +caniuse-lite@^1.0.30001669: + version "1.0.30001684" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz#0eca437bab7d5f03452ff0ef9de8299be6b08e16" + integrity sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ== + +chokidar@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" + integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== + dependencies: + readdirp "^4.0.1" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + 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== + +convert-source-map@^1.5.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +debug@^4.1.0, debug@^4.3.1: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +electron-to-chromium@^1.5.41: + version "1.5.64" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.64.tgz#ac8c4c89075d35a1514b620f47dfe48a71ec3697" + integrity sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +fast-glob@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +gensync@^1.0.0-beta.2: + version "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-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" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + +picocolors@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + +picocolors@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +readdirp@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== + +reflect-metadata@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +"rxjs@file:../../node_modules/rxjs": + version "7.8.1" + dependencies: + tslib "^2.1.0" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.0.0: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +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" + +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" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tslib@^2.1.0, tslib@^2.3.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + +typescript@5.8.1-rc: + version "5.8.1-rc" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.1-rc.tgz#678b7586bf1d7fdec0dbf35708ab7bb39ce13c3d" + integrity sha512-D8IlSOUk1E08jpFdK81reYkA1a/4XtEdV6MElOGdbu/uOy1RpEDqNO/onWmqUaLkTyeHmmU/QlWvjcM9cqF85g== + +update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.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" + +xhr2@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.2.1.tgz#4e73adc4f9cfec9cbd2157f73efdce3a5f108a93" + integrity sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.2.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +zone.js@0.14.10: + version "0.14.10" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.14.10.tgz#23b8b29687c6bffece996e5ee5b854050e7775c8" + integrity sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ== diff --git a/modules/ssr-benchmarks/run-benchmark.ts b/modules/ssr-benchmarks/run-benchmark.ts index 365c05beac55..102cec292215 100644 --- a/modules/ssr-benchmarks/run-benchmark.ts +++ b/modules/ssr-benchmarks/run-benchmark.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ /* tslint:disable:no-console */ diff --git a/modules/ssr-benchmarks/src/app/app.component.ts b/modules/ssr-benchmarks/src/app/app.component.ts index 543082cde329..ab4d151a3716 100644 --- a/modules/ssr-benchmarks/src/app/app.component.ts +++ b/modules/ssr-benchmarks/src/app/app.component.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {Component} from '@angular/core'; diff --git a/modules/ssr-benchmarks/src/app/app.config.server.ts b/modules/ssr-benchmarks/src/app/app.config.server.ts index af527d9da5f0..5fd016867059 100644 --- a/modules/ssr-benchmarks/src/app/app.config.server.ts +++ b/modules/ssr-benchmarks/src/app/app.config.server.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {mergeApplicationConfig, ApplicationConfig} from '@angular/core'; diff --git a/modules/ssr-benchmarks/src/app/app.config.ts b/modules/ssr-benchmarks/src/app/app.config.ts index 3f6c574850ed..58298b051145 100644 --- a/modules/ssr-benchmarks/src/app/app.config.ts +++ b/modules/ssr-benchmarks/src/app/app.config.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ApplicationConfig, provideExperimentalZonelessChangeDetection} from '@angular/core'; diff --git a/modules/ssr-benchmarks/src/main.server.ts b/modules/ssr-benchmarks/src/main.server.ts index c14f2b60f45b..c2a6866f6c74 100644 --- a/modules/ssr-benchmarks/src/main.server.ts +++ b/modules/ssr-benchmarks/src/main.server.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ɵenableProfiling} from '@angular/core'; diff --git a/modules/ssr-benchmarks/src/main.ts b/modules/ssr-benchmarks/src/main.ts index b337fc19dc4b..348737c14b36 100644 --- a/modules/ssr-benchmarks/src/main.ts +++ b/modules/ssr-benchmarks/src/main.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {bootstrapApplication} from '@angular/platform-browser'; diff --git a/modules/ssr-benchmarks/test-data.ts b/modules/ssr-benchmarks/test-data.ts index 57b5ae432b9d..003d374d63ce 100644 --- a/modules/ssr-benchmarks/test-data.ts +++ b/modules/ssr-benchmarks/test-data.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ let data: {name: string; id: string}[] = []; diff --git a/package.json b/package.json index 9cfcc9ba7899..2a640fe34b92 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-srcs", - "version": "19.1.0-next.4", + "version": "19.2.0", "private": true, "description": "Angular - a web framework for modern web apps", "homepage": "https://github.com/angular/angular", @@ -35,7 +35,6 @@ "symbol-extractor:check": "node tools/symbol-extractor/run_all_symbols_extractor_tests.js test", "symbol-extractor:update": "node tools/symbol-extractor/run_all_symbols_extractor_tests.js accept", "ts-circular-deps:check": "yarn -s ng-dev ts-circular-deps check --config ./packages/circular-deps-test.conf.js", - "ts-circular-deps:approve": "yarn -s ng-dev ts-circular-deps approve --config ./packages/circular-deps-test.conf.js", "check-tooling-setup": "yarn tsc --project .ng-dev/tsconfig.json && yarn tsc --project scripts/tsconfig.json", "devtools:devserver": "ibazel run //devtools/src:devserver", "devtools:devserver:demo-standalone": "ibazel run //devtools/projects/demo-standalone/src:devserver", @@ -48,17 +47,17 @@ }, "// 1": "dependencies are used locally and by bazel", "dependencies": { - "@angular-devkit/build-angular": "19.1.0-next.2", - "@angular-devkit/core": "19.1.0-next.2", - "@angular-devkit/schematics": "19.1.0-next.2", - "@angular/build": "19.1.0-next.2", - "@angular/cdk": "19.1.0-next.3", - "@angular/cli": "19.1.0-next.2", - "@angular/material": "19.1.0-next.3", - "@angular/ssr": "19.1.0-next.2", + "@angular-devkit/build-angular": "19.2.0-next.2", + "@angular-devkit/core": "19.2.0-next.2", + "@angular-devkit/schematics": "19.2.0-next.2", + "@angular/build": "19.2.0-next.2", + "@angular/cdk": "19.2.0-next.4", + "@angular/cli": "19.2.0-next.2", + "@angular/material": "19.2.0-next.4", + "@angular/ssr": "19.2.0-next.2", "@babel/cli": "7.26.4", - "@babel/core": "7.26.0", - "@babel/generator": "7.26.3", + "@babel/core": "7.26.9", + "@babel/generator": "7.26.9", "@bazel/concatjs": "5.8.1", "@bazel/esbuild": "5.8.1", "@bazel/jasmine": "5.8.1", @@ -72,13 +71,13 @@ "@rollup/plugin-babel": "^6.0.0", "@rollup/plugin-commonjs": "^28.0.0", "@rollup/plugin-node-resolve": "^13.0.4", - "@schematics/angular": "19.1.0-next.2", + "@schematics/angular": "19.2.0-next.2", "@stackblitz/sdk": "^1.11.0", "@types/angular": "^1.6.47", "@types/babel__core": "7.20.5", "@types/babel__generator": "7.6.8", "@types/bluebird": "^3.5.27", - "@types/chrome": "^0.0.290", + "@types/chrome": "^0.0.306", "@types/convert-source-map": "^2.0.0", "@types/diff": "^7.0.0", "@types/dom-view-transitions": "^1.0.1", @@ -114,7 +113,7 @@ "domino": "https://github.com/angular/domino.git#8f228f8862540c6ccd14f76b5a1d9bb5458618af", "hammerjs": "~2.0.8", "http-server": "^14.0.0", - "jasmine": "~5.5.0", + "jasmine": "~5.6.0", "jasmine-ajax": "^4.0.0", "jasmine-core": "^5.0.0", "karma": "~6.4.0", @@ -136,7 +135,7 @@ "rollup-plugin-sourcemaps": "^0.6.3", "rxjs": "^7.0.0", "selenium-webdriver": "3.5.0", - "selenium-webdriver4": "npm:selenium-webdriver@4.27.0", + "selenium-webdriver4": "npm:selenium-webdriver@4.29.0", "semver-dsl": "^1.0.1", "shelljs": "^0.8.5", "source-map": "0.7.4", @@ -148,7 +147,7 @@ "tslib": "^2.3.0", "tslint": "6.1.3", "tsx": "^4.7.2", - "typescript": "5.7.2", + "typescript": "5.8.1-rc", "webtreemap": "^2.0.1", "ws": "^8.15.0", "xhr2": "0.2.1", @@ -156,16 +155,17 @@ }, "// 2": "devDependencies are not used under Bazel. Many can be removed after test.sh is deleted.", "devDependencies": { + "@babel/plugin-proposal-async-generator-functions": "7.20.7", "@actions/core": "^1.10.0", "@actions/github": "^6.0.0", - "@angular-devkit/architect-cli": "0.1901.0-next.2", - "@angular/animations": "^19.1.0-next", - "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#0850ed7e3d784457d3ecac29d48a3241c6eb7da0", - "@angular/core": "^19.1.0-next", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#d300539f8ebeadaa46e6cb8ed36e4748ac6d303a", + "@angular-devkit/architect-cli": "0.1902.0-next.2", + "@angular/animations": "^19.2.0-next", + "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#ce04ec6cf7604014191821a637e60964a1a3bb4a", + "@angular/core": "^19.2.0-next", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#252589f7bc8fe6ca13b31e02d506ec52e826cdd2", "@bazel/bazelisk": "^1.7.5", - "@bazel/buildifier": "^7.0.0", - "@bazel/ibazel": "^0.25.0", + "@bazel/buildifier": "^8.0.0", + "@bazel/ibazel": "0.16.2", "@codemirror/autocomplete": "^6.11.1", "@codemirror/commands": "^6.3.2", "@codemirror/lang-angular": "^0.1.2", @@ -192,21 +192,20 @@ "@webcontainer/api": "^1.3.0-internal.2", "@yarnpkg/lockfile": "^1.1.0", "adm-zip": "^0.5.10", - "angular-split": "^18.0.0", + "angular-split": "^19.0.0", "check-side-effects": "0.0.23", - "cldr": "7.6.0", + "cldr": "7.7.0", "cldrjs": "0.5.5", "conventional-changelog": "^6.0.0", "emoji-regex": "^10.3.0", "fast-glob": "3.3.3", "fflate": "^0.8.2", "firebase-tools": "^13.0.0", - "gsap": "^3.12.3", "gulp": "^5.0.0", "gulp-conventional-changelog": "^5.0.0", "html-entities": "^2.5.2", "husky": "9.1.7", - "jsdom": "^25.0.0", + "jsdom": "^26.0.0", "karma-coverage": "^2.2.1", "karma-jasmine-html-reporter": "^2.1.0", "karma-sauce-launcher": "^4.3.6", @@ -214,14 +213,13 @@ "madge": "^8.0.0", "marked": "^15.0.0", "mermaid": "^11.0.0", - "ogl": "^1.0.3", "patch-package": "^7.0.0", "playwright-core": "^1.41.2", "preact": "^10.17.1", "preact-render-to-string": "^6.2.1", "prettier": "^3.0.0", "semver": "^7.3.5", - "shiki": "^1.11.1", + "shiki": "^3.0.0", "tmp": "^0.2.3", "ts-node": "^10.9.1", "tsec": "0.2.8", @@ -235,6 +233,6 @@ "// 4": "Ensure that a single instance of the `saucelabs` package is used. Protractor and the Karma sauce launcher pull this package as dependency. A single instance allows for e.g. easier patching in the Karma config.", "resolutions": { "**/https-proxy-agent": "7.0.6", - "**/saucelabs": "8.0.0" + "**/saucelabs": "9.0.2" } } diff --git a/packages/animations/browser/src/dsl/animation.ts b/packages/animations/browser/src/dsl/animation.ts index 7f82f5595372..4abb823b2a8e 100644 --- a/packages/animations/browser/src/dsl/animation.ts +++ b/packages/animations/browser/src/dsl/animation.ts @@ -35,8 +35,10 @@ export class Animation { if (errors.length) { throw validationFailed(errors); } - if (warnings.length) { - warnValidation(warnings); + if (typeof ngDevMode === 'undefined' || ngDevMode) { + if (warnings.length) { + warnValidation(warnings); + } } this._animationAst = ast; } diff --git a/packages/animations/browser/src/render/animation_engine_next.ts b/packages/animations/browser/src/render/animation_engine_next.ts index 8cec1571a828..08b31f941f20 100644 --- a/packages/animations/browser/src/render/animation_engine_next.ts +++ b/packages/animations/browser/src/render/animation_engine_next.ts @@ -61,8 +61,10 @@ export class AnimationEngine { if (errors.length) { throw triggerBuildFailed(name, errors); } - if (warnings.length) { - warnTriggerBuild(name, warnings); + if (typeof ngDevMode === 'undefined' || ngDevMode) { + if (warnings.length) { + warnTriggerBuild(name, warnings); + } } trigger = buildTrigger(name, ast, this._normalizer); this._triggerCache[cacheKey] = trigger; diff --git a/packages/animations/browser/src/render/animation_renderer.ts b/packages/animations/browser/src/render/animation_renderer.ts index 6c13d9d51f60..8139f6bb597d 100644 --- a/packages/animations/browser/src/render/animation_renderer.ts +++ b/packages/animations/browser/src/render/animation_renderer.ts @@ -138,6 +138,8 @@ export class AnimationRendererFactory implements RendererFactory2 { * @param componentId ID of the component that is being replaced. */ protected componentReplaced(componentId: string) { + // Flush the engine since the renderer destruction waits for animations to be done. + this.engine.flush(); (this.delegate as {componentReplaced?: (id: string) => void}).componentReplaced?.(componentId); } } diff --git a/packages/animations/browser/src/render/timeline_animation_engine.ts b/packages/animations/browser/src/render/timeline_animation_engine.ts index 6ac2fb888b2f..92bca59acb05 100644 --- a/packages/animations/browser/src/render/timeline_animation_engine.ts +++ b/packages/animations/browser/src/render/timeline_animation_engine.ts @@ -58,8 +58,10 @@ export class TimelineAnimationEngine { if (errors.length) { throw registerFailed(errors); } else { - if (warnings.length) { - warnRegister(warnings); + if (typeof ngDevMode === 'undefined' || ngDevMode) { + if (warnings.length) { + warnRegister(warnings); + } } this._animations.set(id, ast); } diff --git a/packages/animations/browser/src/warning_helpers.ts b/packages/animations/browser/src/warning_helpers.ts index 08e459c20e76..77ffba89c722 100644 --- a/packages/animations/browser/src/warning_helpers.ts +++ b/packages/animations/browser/src/warning_helpers.ts @@ -15,31 +15,27 @@ function createListOfWarnings(warnings: string[]): string { } export function warnValidation(warnings: string[]): void { - (typeof ngDevMode === 'undefined' || ngDevMode) && - console.warn(`animation validation warnings:${createListOfWarnings(warnings)}`); + console.warn(`animation validation warnings:${createListOfWarnings(warnings)}`); } export function warnTriggerBuild(name: string, warnings: string[]): void { - (typeof ngDevMode === 'undefined' || ngDevMode) && - console.warn( - `The animation trigger "${name}" has built with the following warnings:${createListOfWarnings( - warnings, - )}`, - ); + console.warn( + `The animation trigger "${name}" has built with the following warnings:${createListOfWarnings( + warnings, + )}`, + ); } export function warnRegister(warnings: string[]): void { - (typeof ngDevMode === 'undefined' || ngDevMode) && - console.warn(`Animation built with the following warnings:${createListOfWarnings(warnings)}`); + console.warn(`Animation built with the following warnings:${createListOfWarnings(warnings)}`); } export function triggerParsingWarnings(name: string, warnings: string[]): void { - (typeof ngDevMode === 'undefined' || ngDevMode) && - console.warn( - `Animation parsing for the ${name} trigger presents the following warnings:${createListOfWarnings( - warnings, - )}`, - ); + console.warn( + `Animation parsing for the ${name} trigger presents the following warnings:${createListOfWarnings( + warnings, + )}`, + ); } export function pushUnrecognizedPropertiesWarning(warnings: string[], props: string[]): void { diff --git a/packages/bazel/package.json b/packages/bazel/package.json index 478a44e83cfa..6c9897676cd0 100644 --- a/packages/bazel/package.json +++ b/packages/bazel/package.json @@ -35,7 +35,7 @@ "rollup": "^2.56.3", "rollup-plugin-sourcemaps": "^0.6.3", "terser": "^5.9.0", - "typescript": ">=5.5 <5.8" + "typescript": ">=5.5 <5.9" }, "peerDependenciesMeta": { "terser": { diff --git a/packages/benchpress/src/reporter/console_reporter.ts b/packages/benchpress/src/reporter/console_reporter.ts index 4f81a57b9ab2..8986d540916d 100644 --- a/packages/benchpress/src/reporter/console_reporter.ts +++ b/packages/benchpress/src/reporter/console_reporter.ts @@ -32,7 +32,7 @@ export class ConsoleReporter extends Reporter { }, ]; - private textReporter = new TextReporterBase(this._columnWidth, this._sampleDescription); + private textReporter: TextReporterBase; constructor( @Inject(COLUMN_WIDTH) private _columnWidth: number, @@ -40,6 +40,7 @@ export class ConsoleReporter extends Reporter { @Inject(ConsoleReporter.PRINT) private _print: Function, ) { super(); + this.textReporter = new TextReporterBase(this._columnWidth, this._sampleDescription); this._print(this.textReporter.description()); } diff --git a/packages/benchpress/src/reporter/json_file_reporter.ts b/packages/benchpress/src/reporter/json_file_reporter.ts index 01a24e4c7f91..20e9b2a66b69 100644 --- a/packages/benchpress/src/reporter/json_file_reporter.ts +++ b/packages/benchpress/src/reporter/json_file_reporter.ts @@ -46,9 +46,11 @@ export class JsonFileReporter extends Reporter { @Inject(Options.NOW) private _now: Function, ) { super(); + + this.textReporter = new TextReporterBase(this._columnWidth, this._description); } - private textReporter = new TextReporterBase(this._columnWidth, this._description); + private textReporter: TextReporterBase; override reportMeasureValues(measureValues: MeasureValues): Promise { return Promise.resolve(null); diff --git a/packages/circular-deps-test.conf.js b/packages/circular-deps-test.conf.js index ed6ca9f43b2d..c4dd5d798f2e 100644 --- a/packages/circular-deps-test.conf.js +++ b/packages/circular-deps-test.conf.js @@ -10,10 +10,7 @@ const path = require('path'); module.exports = { baseDir: '../', - goldenFile: '../goldens/circular-deps/packages.json', glob: `./**/*.ts`, - // Command that will be displayed if the golden needs to be updated. - approveCommand: 'yarn ts-circular-deps:approve', resolveModule: resolveModule, ignoreTypeOnlyChecks: true, }; diff --git a/packages/common/BUILD.bazel b/packages/common/BUILD.bazel index 225d3f7699fb..e00ee26fdfcf 100644 --- a/packages/common/BUILD.bazel +++ b/packages/common/BUILD.bazel @@ -30,6 +30,7 @@ ng_module( ), deps = [ "//packages/core", + "//packages/core/primitives/dom-navigation", "@npm//rxjs", ], ) diff --git a/packages/common/http/public_api.ts b/packages/common/http/public_api.ts index e40149cab142..332e1ff454c2 100644 --- a/packages/common/http/public_api.ts +++ b/packages/common/http/public_api.ts @@ -54,6 +54,8 @@ export { HttpUploadProgressEvent, HttpUserEvent, } from './src/response'; +export {HttpResourceRef, HttpResourceOptions, HttpResourceRequest} from './src/resource_api'; +export {httpResource, HttpResourceFn} from './src/resource'; export { HttpTransferCacheOptions, withHttpTransferCache as ɵwithHttpTransferCache, diff --git a/packages/common/http/src/client.ts b/packages/common/http/src/client.ts index ec6d38de0bbb..82f6b28b7d5c 100644 --- a/packages/common/http/src/client.ts +++ b/packages/common/http/src/client.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {Injectable} from '@angular/core'; +import {Injectable, ɵRuntimeError as RuntimeError} from '@angular/core'; import {Observable, of} from 'rxjs'; import {concatMap, filter, map} from 'rxjs/operators'; @@ -16,6 +16,7 @@ import {HttpHeaders} from './headers'; import {HttpParams, HttpParamsOptions} from './params'; import {HttpRequest} from './request'; import {HttpEvent, HttpResponse} from './response'; +import {RuntimeErrorCode} from './errors'; /** * Constructs an instance of `HttpRequestOptions` from a source `HttpMethodOptions` and @@ -29,12 +30,12 @@ import {HttpEvent, HttpResponse} from './response'; */ function addBody( options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body' | 'events' | 'response'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'arraybuffer' | 'blob' | 'json' | 'text'; withCredentials?: boolean; @@ -65,8 +66,7 @@ function addBody( * single data type of the response. * A single overload version of the method handles each response type. * The value of `responseType` cannot be a union, as the combined signature could imply. - - * TODO(adev): review + * * @usageNotes * * ### HTTP Request Example @@ -136,12 +136,12 @@ export class HttpClient { url: string, options: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -164,12 +164,12 @@ export class HttpClient { url: string, options: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -192,12 +192,12 @@ export class HttpClient { url: string, options: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -221,11 +221,11 @@ export class HttpClient { url: string, options: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; observe: 'events'; reportProgress?: boolean; responseType: 'arraybuffer'; @@ -250,12 +250,12 @@ export class HttpClient { url: string, options: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -279,12 +279,12 @@ export class HttpClient { url: string, options: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -308,13 +308,13 @@ export class HttpClient { url: string, options: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; reportProgress?: boolean; observe: 'events'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; responseType?: 'json'; withCredentials?: boolean; transferCache?: {includeHeaders?: string[]} | boolean; @@ -337,13 +337,13 @@ export class HttpClient { url: string, options: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; reportProgress?: boolean; observe: 'events'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; responseType?: 'json'; withCredentials?: boolean; transferCache?: {includeHeaders?: string[]} | boolean; @@ -365,12 +365,12 @@ export class HttpClient { url: string, options: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -392,12 +392,12 @@ export class HttpClient { url: string, options: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -420,12 +420,12 @@ export class HttpClient { url: string, options: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -449,13 +449,13 @@ export class HttpClient { url: string, options: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; reportProgress?: boolean; observe: 'response'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; responseType?: 'json'; withCredentials?: boolean; }, @@ -476,13 +476,13 @@ export class HttpClient { url: string, options: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; reportProgress?: boolean; observe: 'response'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; responseType?: 'json'; withCredentials?: boolean; transferCache?: {includeHeaders?: string[]} | boolean; @@ -504,12 +504,12 @@ export class HttpClient { url: string, options?: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; responseType?: 'json'; reportProgress?: boolean; withCredentials?: boolean; @@ -532,12 +532,12 @@ export class HttpClient { url: string, options?: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; responseType?: 'json'; reportProgress?: boolean; withCredentials?: boolean; @@ -559,11 +559,11 @@ export class HttpClient { url: string, options?: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; observe?: 'body' | 'events' | 'response'; reportProgress?: boolean; responseType?: 'arraybuffer' | 'blob' | 'json' | 'text'; @@ -603,12 +603,12 @@ export class HttpClient { url?: string, options: { body?: any; - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body' | 'events' | 'response'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'arraybuffer' | 'blob' | 'json' | 'text'; withCredentials?: boolean; @@ -693,7 +693,10 @@ export class HttpClient { map((res: HttpResponse) => { // Validate that the body is an ArrayBuffer. if (res.body !== null && !(res.body instanceof ArrayBuffer)) { - throw new Error('Response is not an ArrayBuffer.'); + throw new RuntimeError( + RuntimeErrorCode.RESPONSE_IS_NOT_AN_ARRAY_BUFFER, + ngDevMode && 'Response is not an ArrayBuffer.', + ); } return res.body; }), @@ -703,7 +706,10 @@ export class HttpClient { map((res: HttpResponse) => { // Validate that the body is a Blob. if (res.body !== null && !(res.body instanceof Blob)) { - throw new Error('Response is not a Blob.'); + throw new RuntimeError( + RuntimeErrorCode.RESPONSE_IS_NOT_A_BLOB, + ngDevMode && 'Response is not a Blob.', + ); } return res.body; }), @@ -713,7 +719,10 @@ export class HttpClient { map((res: HttpResponse) => { // Validate that the body is a string. if (res.body !== null && typeof res.body !== 'string') { - throw new Error('Response is not a string.'); + throw new RuntimeError( + RuntimeErrorCode.RESPONSE_IS_NOT_A_STRING, + ngDevMode && 'Response is not a string.', + ); } return res.body; }), @@ -728,7 +737,10 @@ export class HttpClient { return res$; default: // Guard against new future observe types being added. - throw new Error(`Unreachable: unhandled observe type ${options.observe}}`); + throw new RuntimeError( + RuntimeErrorCode.UNHANDLED_OBSERVE_TYPE, + ngDevMode && `Unreachable: unhandled observe type ${options.observe}}`, + ); } } @@ -744,12 +756,12 @@ export class HttpClient { delete( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -769,12 +781,12 @@ export class HttpClient { delete( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -794,12 +806,12 @@ export class HttpClient { delete( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -820,12 +832,12 @@ export class HttpClient { delete( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -846,12 +858,12 @@ export class HttpClient { delete( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -872,12 +884,12 @@ export class HttpClient { delete( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -898,12 +910,12 @@ export class HttpClient { delete( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -924,12 +936,12 @@ export class HttpClient { delete( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | (string | number | boolean)[]}; + | Record; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -949,12 +961,12 @@ export class HttpClient { delete( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -974,12 +986,12 @@ export class HttpClient { delete( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -999,12 +1011,12 @@ export class HttpClient { delete( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -1025,12 +1037,12 @@ export class HttpClient { delete( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1050,12 +1062,12 @@ export class HttpClient { delete( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1075,12 +1087,12 @@ export class HttpClient { delete( url: string, options?: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1100,12 +1112,12 @@ export class HttpClient { delete( url: string, options?: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1125,12 +1137,12 @@ export class HttpClient { delete( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body' | 'events' | 'response'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'arraybuffer' | 'blob' | 'json' | 'text'; withCredentials?: boolean; @@ -1152,12 +1164,12 @@ export class HttpClient { get( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -1177,12 +1189,12 @@ export class HttpClient { get( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -1202,12 +1214,12 @@ export class HttpClient { get( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -1228,12 +1240,12 @@ export class HttpClient { get( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -1253,12 +1265,12 @@ export class HttpClient { get( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -1278,12 +1290,12 @@ export class HttpClient { get( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -1303,12 +1315,12 @@ export class HttpClient { get( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1328,12 +1340,12 @@ export class HttpClient { get( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1354,12 +1366,12 @@ export class HttpClient { get( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -1380,12 +1392,12 @@ export class HttpClient { get( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -1406,12 +1418,12 @@ export class HttpClient { get( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -1432,12 +1444,12 @@ export class HttpClient { get( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1458,12 +1470,12 @@ export class HttpClient { get( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1484,12 +1496,12 @@ export class HttpClient { get( url: string, options?: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1509,12 +1521,12 @@ export class HttpClient { get( url: string, options?: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1530,12 +1542,12 @@ export class HttpClient { get( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body' | 'events' | 'response'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'arraybuffer' | 'blob' | 'json' | 'text'; withCredentials?: boolean; @@ -1557,12 +1569,12 @@ export class HttpClient { head( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -1583,12 +1595,12 @@ export class HttpClient { head( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -1608,12 +1620,12 @@ export class HttpClient { head( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -1634,12 +1646,12 @@ export class HttpClient { head( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -1660,12 +1672,12 @@ export class HttpClient { head( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -1686,12 +1698,12 @@ export class HttpClient { head( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -1712,12 +1724,12 @@ export class HttpClient { head( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1738,12 +1750,12 @@ export class HttpClient { head( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1764,12 +1776,12 @@ export class HttpClient { head( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -1790,12 +1802,12 @@ export class HttpClient { head( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -1816,12 +1828,12 @@ export class HttpClient { head( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -1842,12 +1854,12 @@ export class HttpClient { head( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1868,12 +1880,12 @@ export class HttpClient { head( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1894,12 +1906,12 @@ export class HttpClient { head( url: string, options?: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1920,12 +1932,12 @@ export class HttpClient { head( url: string, options?: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -1943,12 +1955,12 @@ export class HttpClient { head( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body' | 'events' | 'response'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'arraybuffer' | 'blob' | 'json' | 'text'; withCredentials?: boolean; @@ -2020,12 +2032,12 @@ export class HttpClient { options( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -2044,12 +2056,12 @@ export class HttpClient { options( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -2068,12 +2080,12 @@ export class HttpClient { options( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -2093,12 +2105,12 @@ export class HttpClient { options( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -2118,12 +2130,12 @@ export class HttpClient { options( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -2143,12 +2155,12 @@ export class HttpClient { options( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -2168,12 +2180,12 @@ export class HttpClient { options( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -2193,12 +2205,12 @@ export class HttpClient { options( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -2218,12 +2230,12 @@ export class HttpClient { options( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -2243,12 +2255,12 @@ export class HttpClient { options( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -2268,12 +2280,12 @@ export class HttpClient { options( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -2293,12 +2305,12 @@ export class HttpClient { options( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -2318,12 +2330,12 @@ export class HttpClient { options( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -2343,12 +2355,12 @@ export class HttpClient { options( url: string, options?: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -2367,12 +2379,12 @@ export class HttpClient { options( url: string, options?: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -2389,12 +2401,12 @@ export class HttpClient { options( url: string, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body' | 'events' | 'response'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'arraybuffer' | 'blob' | 'json' | 'text'; withCredentials?: boolean; @@ -2417,12 +2429,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -2443,12 +2455,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -2469,12 +2481,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -2497,12 +2509,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -2524,12 +2536,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -2551,12 +2563,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -2578,12 +2590,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -2605,12 +2617,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -2632,12 +2644,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -2659,12 +2671,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -2686,12 +2698,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -2713,12 +2725,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -2740,12 +2752,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -2767,12 +2779,12 @@ export class HttpClient { url: string, body: any | null, options?: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -2794,12 +2806,12 @@ export class HttpClient { url: string, body: any | null, options?: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -2815,12 +2827,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body' | 'events' | 'response'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'arraybuffer' | 'blob' | 'json' | 'text'; withCredentials?: boolean; @@ -2843,12 +2855,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -2870,12 +2882,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -2897,12 +2909,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -2925,12 +2937,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -2952,12 +2964,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -2980,12 +2992,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -3008,12 +3020,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -3036,12 +3048,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -3064,12 +3076,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -3092,12 +3104,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -3120,12 +3132,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -3148,12 +3160,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -3177,12 +3189,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -3204,12 +3216,12 @@ export class HttpClient { url: string, body: any | null, options?: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -3232,12 +3244,12 @@ export class HttpClient { url: string, body: any | null, options?: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -3255,12 +3267,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body' | 'events' | 'response'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'arraybuffer' | 'blob' | 'json' | 'text'; withCredentials?: boolean; @@ -3284,12 +3296,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -3310,12 +3322,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -3336,12 +3348,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -3363,12 +3375,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -3390,12 +3402,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -3417,12 +3429,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -3444,12 +3456,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -3471,12 +3483,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'events'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -3498,12 +3510,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'arraybuffer'; withCredentials?: boolean; @@ -3525,12 +3537,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'blob'; withCredentials?: boolean; @@ -3552,12 +3564,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType: 'text'; withCredentials?: boolean; @@ -3579,12 +3591,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -3606,12 +3618,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; observe: 'response'; context?: HttpContext; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -3632,12 +3644,12 @@ export class HttpClient { url: string, body: any | null, options?: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -3658,12 +3670,12 @@ export class HttpClient { url: string, body: any | null, options?: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; @@ -3680,12 +3692,12 @@ export class HttpClient { url: string, body: any | null, options: { - headers?: HttpHeaders | {[header: string]: string | string[]}; + headers?: HttpHeaders | Record; context?: HttpContext; observe?: 'body' | 'events' | 'response'; params?: | HttpParams - | {[param: string]: string | number | boolean | ReadonlyArray}; + | Record>; reportProgress?: boolean; responseType?: 'arraybuffer' | 'blob' | 'json' | 'text'; withCredentials?: boolean; diff --git a/packages/common/http/src/errors.ts b/packages/common/http/src/errors.ts index e480c83b0b4c..0d7d1de0d96d 100644 --- a/packages/common/http/src/errors.ts +++ b/packages/common/http/src/errors.ts @@ -16,4 +16,9 @@ export const enum RuntimeErrorCode { HEADERS_ALTERED_BY_TRANSFER_CACHE = 2802, HTTP_ORIGIN_MAP_USED_IN_CLIENT = 2803, HTTP_ORIGIN_MAP_CONTAINS_PATH = 2804, + CANNOT_SPECIFY_BOTH_FROM_STRING_AND_FROM_OBJECT = 2805, + RESPONSE_IS_NOT_AN_ARRAY_BUFFER = 2806, + RESPONSE_IS_NOT_A_BLOB = 2807, + RESPONSE_IS_NOT_A_STRING = 2808, + UNHANDLED_OBSERVE_TYPE = 2809, } diff --git a/packages/common/http/src/fetch.ts b/packages/common/http/src/fetch.ts index 4262be85839b..c1a82ca8cf39 100644 --- a/packages/common/http/src/fetch.ts +++ b/packages/common/http/src/fetch.ts @@ -6,12 +6,18 @@ * found in the LICENSE file at https://angular.dev/license */ -import {inject, Injectable, NgZone} from '@angular/core'; +import {inject, Injectable, InjectionToken, NgZone} from '@angular/core'; import {Observable, Observer} from 'rxjs'; import {HttpBackend} from './backend'; import {HttpHeaders} from './headers'; -import {HttpRequest} from './request'; +import { + ACCEPT_HEADER, + ACCEPT_HEADER_VALUE, + CONTENT_TYPE_HEADER, + HttpRequest, + X_REQUEST_URL_HEADER, +} from './request'; import { HTTP_STATUS_CODE_OK, HttpDownloadProgressEvent, @@ -24,8 +30,6 @@ import { const XSSI_PREFIX = /^\)\]\}',?\n/; -const REQUEST_URL_HEADER = `X-Request-URL`; - /** * Determine an appropriate URL for the response, by checking either * response url or the X-Request-URL header. @@ -35,10 +39,18 @@ function getResponseUrl(response: Response): string | null { return response.url; } // stored as lowercase in the map - const xRequestUrl = REQUEST_URL_HEADER.toLocaleLowerCase(); + const xRequestUrl = X_REQUEST_URL_HEADER.toLocaleLowerCase(); return response.headers.get(xRequestUrl); } +/** + * An internal injection token to reference `FetchBackend` implementation + * in a tree-shakable way. + */ +export const FETCH_BACKEND = new InjectionToken( + typeof ngDevMode === 'undefined' || ngDevMode ? 'FETCH_BACKEND' : '', +); + /** * Uses `fetch` to send requests to a backend server. * @@ -168,7 +180,7 @@ export class FetchBackend implements HttpBackend { // Combine all chunks. const chunksAll = this.concatChunks(chunks, receivedLength); try { - const contentType = response.headers.get('Content-Type') ?? ''; + const contentType = response.headers.get(CONTENT_TYPE_HEADER) ?? ''; body = this.parseBody(request, chunksAll, contentType); } catch (error) { // Body loading or parsing failed @@ -252,16 +264,16 @@ export class FetchBackend implements HttpBackend { req.headers.forEach((name, values) => (headers[name] = values.join(','))); // Add an Accept header if one isn't present already. - if (!req.headers.has('Accept')) { - headers['Accept'] = 'application/json, text/plain, */*'; + if (!req.headers.has(ACCEPT_HEADER)) { + headers[ACCEPT_HEADER] = ACCEPT_HEADER_VALUE; } // Auto-detect the Content-Type header if one isn't present already. - if (!req.headers.has('Content-Type')) { + if (!req.headers.has(CONTENT_TYPE_HEADER)) { const detectedType = req.detectContentTypeHeader(); // Sometimes Content-Type detection fails. if (detectedType !== null) { - headers['Content-Type'] = detectedType; + headers[CONTENT_TYPE_HEADER] = detectedType; } } diff --git a/packages/common/http/src/params.ts b/packages/common/http/src/params.ts index eb97af256b7d..4dc0a6b31806 100644 --- a/packages/common/http/src/params.ts +++ b/packages/common/http/src/params.ts @@ -6,6 +6,10 @@ * found in the LICENSE file at https://angular.dev/license */ +import {ɵRuntimeError as RuntimeError} from '@angular/core'; + +import {RuntimeErrorCode} from './errors'; + /** * A codec for encoding and decoding parameters in URLs. * @@ -159,9 +163,12 @@ export class HttpParams { constructor(options: HttpParamsOptions = {} as HttpParamsOptions) { this.encoder = options.encoder || new HttpUrlEncodingCodec(); - if (!!options.fromString) { - if (!!options.fromObject) { - throw new Error(`Cannot specify both fromString and fromObject.`); + if (options.fromString) { + if (options.fromObject) { + throw new RuntimeError( + RuntimeErrorCode.CANNOT_SPECIFY_BOTH_FROM_STRING_AND_FROM_OBJECT, + ngDevMode && 'Cannot specify both fromString and fromObject.', + ); } this.map = paramParser(options.fromString, this.encoder); } else if (!!options.fromObject) { diff --git a/packages/common/http/src/provider.ts b/packages/common/http/src/provider.ts index 3390c12d54f1..be6806acd3c5 100644 --- a/packages/common/http/src/provider.ts +++ b/packages/common/http/src/provider.ts @@ -16,7 +16,7 @@ import { import {HttpBackend, HttpHandler} from './backend'; import {HttpClient} from './client'; -import {FetchBackend} from './fetch'; +import {FETCH_BACKEND, FetchBackend} from './fetch'; import { HTTP_INTERCEPTOR_FNS, HttpInterceptorFn, @@ -128,7 +128,7 @@ export function provideHttpClient( { provide: HttpBackend, useFactory: () => { - return inject(FetchBackend, {optional: true}) ?? inject(HttpXhrBackend); + return inject(FETCH_BACKEND, {optional: true}) ?? inject(HttpXhrBackend); }, }, { @@ -305,6 +305,7 @@ export function withRequestsMadeViaParent(): HttpFeature { return makeHttpFeature(HttpFeatureKind.Fetch, [ FetchBackend, + {provide: FETCH_BACKEND, useExisting: FetchBackend}, {provide: HttpBackend, useExisting: FetchBackend}, ]); } diff --git a/packages/common/http/src/request.ts b/packages/common/http/src/request.ts index fe900d36d150..45e7a4457125 100644 --- a/packages/common/http/src/request.ts +++ b/packages/common/http/src/request.ts @@ -77,6 +77,47 @@ function isUrlSearchParams(value: any): value is URLSearchParams { return typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams; } +/** + * `Content-Type` is an HTTP header used to indicate the media type + * (also known as MIME type) of the resource being sent to the client + * or received from the server. + */ +export const CONTENT_TYPE_HEADER = 'Content-Type'; + +/** + * The `Accept` header is an HTTP request header that indicates the media types + * (or content types) the client is willing to receive from the server. + */ +export const ACCEPT_HEADER = 'Accept'; + +/** + * `X-Request-URL` is a custom HTTP header used in older browser versions, + * including Firefox (< 32), Chrome (< 37), Safari (< 8), and Internet Explorer, + * to include the full URL of the request in cross-origin requests. + */ +export const X_REQUEST_URL_HEADER = 'X-Request-URL'; + +/** + * `text/plain` is a content type used to indicate that the content being + * sent is plain text with no special formatting or structured data + * like HTML, XML, or JSON. + */ +export const TEXT_CONTENT_TYPE = 'text/plain'; + +/** + * `application/json` is a content type used to indicate that the content + * being sent is in the JSON format. + */ +export const JSON_CONTENT_TYPE = 'application/json'; + +/** + * `application/json, text/plain, *\/*` is a content negotiation string often seen in the + * Accept header of HTTP requests. It indicates the types of content the client is willing + * to accept from the server, with a preference for `application/json` and `text/plain`, + * but also accepting any other type (*\/*). + */ +export const ACCEPT_HEADER_VALUE = `${JSON_CONTENT_TYPE}, ${TEXT_CONTENT_TYPE}, */*`; + /** * An outgoing HTTP request with an optional typed body. * @@ -142,7 +183,7 @@ export class HttpRequest { * To pass a string representation of HTTP parameters in the URL-query-string format, * the `HttpParamsOptions`' `fromString` may be used. For example: * - * ``` + * ```ts * new HttpParams({fromString: 'angular=awesome'}) * ``` */ @@ -413,7 +454,7 @@ export class HttpRequest { // Technically, strings could be a form of JSON data, but it's safe enough // to assume they're plain strings. if (typeof this.body === 'string') { - return 'text/plain'; + return TEXT_CONTENT_TYPE; } // `HttpUrlEncodedParams` has its own content-type. if (this.body instanceof HttpParams) { @@ -425,7 +466,7 @@ export class HttpRequest { typeof this.body === 'number' || typeof this.body === 'boolean' ) { - return 'application/json'; + return JSON_CONTENT_TYPE; } // No type could be inferred. return null; diff --git a/packages/common/http/src/resource.ts b/packages/common/http/src/resource.ts new file mode 100644 index 000000000000..e7f37021d706 --- /dev/null +++ b/packages/common/http/src/resource.ts @@ -0,0 +1,421 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { + Injector, + Signal, + ɵResourceImpl as ResourceImpl, + inject, + linkedSignal, + assertInInjectionContext, + signal, + ResourceStatus, + computed, + Resource, + WritableSignal, + ResourceStreamItem, +} from '@angular/core'; +import {Subscription} from 'rxjs'; + +import {HttpRequest} from './request'; +import {HttpClient} from './client'; +import {HttpEventType, HttpProgressEvent, HttpResponseBase} from './response'; +import {HttpHeaders} from './headers'; +import {HttpParams} from './params'; +import {HttpResourceRef, HttpResourceOptions, HttpResourceRequest} from './resource_api'; + +/** + * Type for the `httpRequest` top-level function, which includes the call signatures for the JSON- + * based `httpRequest` as well as sub-functions for `ArrayBuffer`, `Blob`, and `string` type + * requests. + * + * @experimental + */ +export interface HttpResourceFn { + /** + * Create a `Resource` that fetches data with an HTTP GET request to the given URL. + * + * If a reactive function is passed for the URL, the resource will update when the URL changes via + * signals. + * + * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features + * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of + * `httpResource`, such as `httpResource.text()`, to parse the response differently. + * + * @experimental + */ + ( + url: string | (() => string | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + /** + * Create a `Resource` that fetches data with an HTTP GET request to the given URL. + * + * If a reactive function is passed for the URL, the resource will update when the URL changes via + * signals. + * + * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features + * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of + * `httpResource`, such as `httpResource.text()`, to parse the response differently. + * + * @experimental + */ + ( + url: string | (() => string | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + + /** + * Create a `Resource` that fetches data with the configured HTTP request. + * + * If a reactive function is passed for the request, the resource will update when the request + * changes via signals. + * + * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features + * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of + * `httpResource`, such as `httpResource.text()`, to parse the response differently. + * + * @experimental + */ + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + /** + * Create a `Resource` that fetches data with the configured HTTP request. + * + * If a reactive function is passed for the request, the resource will update when the request + * changes via signals. + * + * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features + * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of + * `httpResource`, such as `httpResource.text()`, to parse the response differently. + * + * @experimental + */ + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + + /** + * Create a `Resource` that fetches data with the configured HTTP request. + * + * If a reactive function is passed for the URL or request, the resource will update when the + * URL or request changes via signals. + * + * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features + * of the `HttpClient` API. Data is parsed into an `ArrayBuffer`. + * + * @experimental + */ + arrayBuffer: { + ( + url: string | (() => string | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + ( + url: string | (() => string | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + }; + + /** + * Create a `Resource` that fetches data with the configured HTTP request. + * + * If a reactive function is passed for the URL or request, the resource will update when the + * URL or request changes via signals. + * + * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features + * of the `HttpClient` API. Data is parsed into a `Blob`. + * + * @experimental + */ + blob: { + ( + url: string | (() => string | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + ( + url: string | (() => string | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + }; + + /** + * Create a `Resource` that fetches data with the configured HTTP request. + * + * If a reactive function is passed for the URL or request, the resource will update when the + * URL or request changes via signals. + * + * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features + * of the `HttpClient` API. Data is parsed as a `string`. + * + * @experimental + */ + text: { + ( + url: string | (() => string | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + ( + url: string | (() => string | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + }; +} + +/** + * `httpResource` makes a reactive HTTP request and exposes the request status and response value as + * a `WritableResource`. By default, it assumes that the backend will return JSON data. To make a + * request that expects a different kind of data, you can use a sub-constructor of `httpResource`, + * such as `httpResource.text`. + * + * @experimental + * @initializerApiFunction + */ +export const httpResource: HttpResourceFn = (() => { + const jsonFn = makeHttpResourceFn('json') as HttpResourceFn; + jsonFn.arrayBuffer = makeHttpResourceFn('arraybuffer'); + jsonFn.blob = makeHttpResourceFn('blob'); + jsonFn.text = makeHttpResourceFn('text'); + return jsonFn; +})(); + +type RawRequestType = + | string + | (() => string | undefined) + | HttpResourceRequest + | (() => HttpResourceRequest | undefined); + +function makeHttpResourceFn(responseType: 'arraybuffer' | 'blob' | 'json' | 'text') { + return function httpResourceRef( + request: RawRequestType, + options?: HttpResourceOptions, + ): HttpResourceRef { + options?.injector || assertInInjectionContext(httpResource); + const injector = options?.injector ?? inject(Injector); + return new HttpResourceImpl( + injector, + () => normalizeRequest(request, responseType), + options?.defaultValue, + options?.parse as (value: unknown) => TResult, + ) as HttpResourceRef; + }; +} + +function normalizeRequest( + request: RawRequestType, + responseType: 'arraybuffer' | 'blob' | 'json' | 'text', +): HttpRequest | undefined { + let unwrappedRequest = typeof request === 'function' ? request() : request; + if (unwrappedRequest === undefined) { + return undefined; + } else if (typeof unwrappedRequest === 'string') { + unwrappedRequest = {url: unwrappedRequest}; + } + + const headers = + unwrappedRequest.headers instanceof HttpHeaders + ? unwrappedRequest.headers + : new HttpHeaders( + unwrappedRequest.headers as + | Record> + | undefined, + ); + + const params = + unwrappedRequest.params instanceof HttpParams + ? unwrappedRequest.params + : new HttpParams({fromObject: unwrappedRequest.params}); + + return new HttpRequest( + unwrappedRequest.method ?? 'GET', + unwrappedRequest.url, + unwrappedRequest.body ?? null, + { + headers, + params, + reportProgress: unwrappedRequest.reportProgress, + withCredentials: unwrappedRequest.withCredentials, + responseType, + }, + ); +} +class HttpResourceImpl + extends ResourceImpl | undefined> + implements HttpResourceRef +{ + private client!: HttpClient; + private _headers = linkedSignal({ + source: this.extRequest, + computation: () => undefined as HttpHeaders | undefined, + }); + private _progress = linkedSignal({ + source: this.extRequest, + computation: () => undefined as HttpProgressEvent | undefined, + }); + private _statusCode = linkedSignal({ + source: this.extRequest, + computation: () => undefined as number | undefined, + }); + + readonly headers = computed(() => + this.status() === ResourceStatus.Resolved || this.status() === ResourceStatus.Error + ? this._headers() + : undefined, + ); + readonly progress = this._progress.asReadonly(); + readonly statusCode = this._statusCode.asReadonly(); + + constructor( + injector: Injector, + request: () => HttpRequest | undefined, + defaultValue: T, + parse?: (value: unknown) => T, + ) { + super( + request, + ({request, abortSignal}) => { + let sub: Subscription; + + // Track the abort listener so it can be removed if the Observable completes (as a memory + // optimization). + const onAbort = () => sub.unsubscribe(); + abortSignal.addEventListener('abort', onAbort); + + // Start off stream as undefined. + const stream = signal>({value: undefined as T}); + let resolve: ((value: Signal>) => void) | undefined; + const promise = new Promise>>((r) => (resolve = r)); + + const send = (value: ResourceStreamItem): void => { + stream.set(value); + resolve?.(stream); + resolve = undefined; + }; + + sub = this.client.request(request!).subscribe({ + next: (event) => { + switch (event.type) { + case HttpEventType.Response: + this._headers.set(event.headers); + this._statusCode.set(event.status); + try { + send({value: parse ? parse(event.body) : (event.body as T)}); + } catch (error) { + send({error}); + } + break; + case HttpEventType.DownloadProgress: + this._progress.set(event); + break; + } + }, + error: (error) => send({error}), + complete: () => { + if (resolve) { + send({error: new Error('Resource completed before producing a value')}); + } + abortSignal.removeEventListener('abort', onAbort); + }, + }); + + return promise; + }, + defaultValue, + undefined, + injector, + ); + this.client = injector.get(HttpClient); + } + + override hasValue(): this is HttpResourceRef> { + return super.hasValue(); + } +} + +/** + * A `Resource` of the `HttpResponse` meant for use in `HttpResource` if we decide to go this route. + * + * TODO(alxhub): delete this if we decide we don't want it. + */ +class HttpResponseResource implements Resource { + readonly status: Signal; + readonly value: WritableSignal; + readonly error: Signal; + readonly isLoading: Signal; + + constructor( + private parent: Resource, + request: Signal, + ) { + this.status = computed(() => { + // There are two kinds of errors which can occur in an HTTP request: HTTP errors or normal JS + // errors. Since we have a response for HTTP errors, we report `Resolved` status even if the + // overall request is considered to be in an Error state. + if (parent.status() === ResourceStatus.Error) { + return this.value() !== undefined ? ResourceStatus.Resolved : ResourceStatus.Error; + } + return parent.status(); + }); + this.error = computed(() => { + // Filter out HTTP errors. + return this.value() === undefined ? parent.error() : undefined; + }); + this.value = linkedSignal({ + source: request, + computation: () => undefined as HttpResponseBase | undefined, + }); + this.isLoading = parent.isLoading; + } + + hasValue(): this is Resource { + return this.value() !== undefined; + } + + reload(): boolean { + // TODO: should you be able to reload this way? + return this.parent.reload(); + } +} diff --git a/packages/common/http/src/resource_api.ts b/packages/common/http/src/resource_api.ts new file mode 100644 index 000000000000..3b5219a35a6b --- /dev/null +++ b/packages/common/http/src/resource_api.ts @@ -0,0 +1,138 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import type {Injector, ResourceRef, Signal, ValueEqualityFn, WritableResource} from '@angular/core'; +import type {HttpHeaders} from './headers'; +import type {HttpParams} from './params'; +import type {HttpProgressEvent} from './response'; + +/** + * The structure of an `httpResource` request which will be sent to the backend. + * + * @experimental + */ +export interface HttpResourceRequest { + /** + * URL of the request. + * + * This URL should not include query parameters. Instead, specify query parameters through the + * `params` field. + */ + url: string; + + /** + * HTTP method of the request, which defaults to GET if not specified. + */ + method?: string; + + /** + * Body to send with the request, if there is one. + * + * If no Content-Type header is specified by the user, Angular will attempt to set one based on + * the type of `body`. + */ + body?: unknown; + + /** + * Dictionary of query parameters which will be appeneded to the request URL. + */ + params?: + | HttpParams + | Record>; + + /** + * Dictionary of headers to include with the outgoing request. + */ + headers?: HttpHeaders | Record>; + + /** + * If `true`, progress events will be enabled for the request and delivered through the + * `HttpResource.progress` signal. + */ + reportProgress?: boolean; + + /** + * Specifies whether the `withCredentials` flag should be set on the outgoing request. + * + * This flag causes the browser to send cookies and other authentication information along with + * the request. + */ + withCredentials?: boolean; + + /** + * Configures the server-side rendering transfer cache for this request. + * + * See the documentation on the transfer cache for more information. + */ + transferCache?: {includeHeaders?: string[]} | boolean; +} + +/** + * Options for creating an `httpResource`. + * + * @experimental + */ +export interface HttpResourceOptions { + /** + * Transform the result of the HTTP request before it's delivered to the resource. + * + * `parse` receives the value from the HTTP layer as its raw type (e.g. as `unknown` for JSON data). + * It can be used to validate or transform the type of the resource, and return a more specific + * type. This is also useful for validating backend responses using a runtime schema validation + * library such as Zod. + */ + parse?: (value: TRaw) => TResult; + + /** + * Value that the resource will take when in Idle, Loading, or Error states. + * + * If not set, the resource will use `undefined` as its default value. + */ + defaultValue?: NoInfer; + + /** + * The `Injector` in which to create the `httpResource`. + * + * If this is not provided, the current [injection context](guide/di/dependency-injection-context) + * will be used instead (via `inject`). + */ + injector?: Injector; + + /** + * A comparison function which defines equality for the response value. + */ + equal?: ValueEqualityFn>; +} + +/** + * A `WritableResource` that represents the results of a reactive HTTP request. + * + * `HttpResource`s are backed by `HttpClient`, including support for interceptors, testing, and the + * other features of the `HttpClient` API. + * + * @experimental + */ +export interface HttpResourceRef extends WritableResource, ResourceRef { + /** + * Signal of the response headers, when available. + */ + readonly headers: Signal; + + /** + * Signal of the response status code, when available. + */ + readonly statusCode: Signal; + + /** + * Signal of the latest progress update, if the request was made with `reportProgress: true`. + */ + readonly progress: Signal; + + hasValue(): this is HttpResourceRef>; + destroy(): void; +} diff --git a/packages/common/http/src/transfer_cache.ts b/packages/common/http/src/transfer_cache.ts index 09d37e2e85bc..9aa24dd43838 100644 --- a/packages/common/http/src/transfer_cache.ts +++ b/packages/common/http/src/transfer_cache.ts @@ -12,7 +12,6 @@ import { inject, InjectionToken, makeStateKey, - PLATFORM_ID, Provider, StateKey, TransferState, @@ -21,7 +20,6 @@ import { ɵtruncateMiddle as truncateMiddle, ɵRuntimeError as RuntimeError, } from '@angular/core'; -import {isPlatformServer} from '@angular/common'; import {Observable, of} from 'rxjs'; import {tap} from 'rxjs/operators'; @@ -149,8 +147,8 @@ export function transferCacheInterceptorFn( const originMap: Record | null = inject(HTTP_TRANSFER_CACHE_ORIGIN_MAP, { optional: true, }); - const isServer = isPlatformServer(inject(PLATFORM_ID)); - if (originMap && !isServer) { + + if (typeof ngServerMode !== 'undefined' && !ngServerMode && originMap) { throw new RuntimeError( RuntimeErrorCode.HTTP_ORIGIN_MAP_USED_IN_CLIENT, ngDevMode && @@ -160,7 +158,10 @@ export function transferCacheInterceptorFn( ); } - const requestUrl = isServer && originMap ? mapRequestOriginUrl(req.url, originMap) : req.url; + const requestUrl = + typeof ngServerMode !== 'undefined' && ngServerMode && originMap + ? mapRequestOriginUrl(req.url, originMap) + : req.url; const storeKey = makeCacheKey(req, requestUrl); const response = transferState.get(storeKey, null); @@ -217,7 +218,7 @@ export function transferCacheInterceptorFn( // Request not found in cache. Make the request and cache it if on the server. return next(req).pipe( tap((event: HttpEvent) => { - if (event instanceof HttpResponse && isServer) { + if (event instanceof HttpResponse && typeof ngServerMode !== 'undefined' && ngServerMode) { transferState.set(storeKey, { [BODY]: event.body, [HEADERS]: getFilteredHeaders(event.headers, headersToInclude), @@ -327,7 +328,6 @@ export function withHttpTransferCache(cacheOptions: HttpTransferCacheOptions): P provide: HTTP_ROOT_INTERCEPTOR_FNS, useValue: transferCacheInterceptorFn, multi: true, - deps: [TransferState, CACHE_OPTIONS], }, { provide: APP_BOOTSTRAP_LISTENER, diff --git a/packages/common/http/src/xhr.ts b/packages/common/http/src/xhr.ts index d6896793cd43..71c115591f36 100644 --- a/packages/common/http/src/xhr.ts +++ b/packages/common/http/src/xhr.ts @@ -14,7 +14,13 @@ import {switchMap} from 'rxjs/operators'; import {HttpBackend} from './backend'; import {RuntimeErrorCode} from './errors'; import {HttpHeaders} from './headers'; -import {HttpRequest} from './request'; +import { + ACCEPT_HEADER, + ACCEPT_HEADER_VALUE, + CONTENT_TYPE_HEADER, + HttpRequest, + X_REQUEST_URL_HEADER, +} from './request'; import { HTTP_STATUS_CODE_NO_CONTENT, HTTP_STATUS_CODE_OK, @@ -30,6 +36,8 @@ import { const XSSI_PREFIX = /^\)\]\}',?\n/; +const X_REQUEST_URL_REGEXP = RegExp(`^${X_REQUEST_URL_HEADER}:`, 'm'); + /** * Determine an appropriate URL for the response, by checking either * XMLHttpRequest.responseURL or the X-Request-URL header. @@ -38,8 +46,8 @@ function getResponseUrl(xhr: any): string | null { if ('responseURL' in xhr && xhr.responseURL) { return xhr.responseURL; } - if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) { - return xhr.getResponseHeader('X-Request-URL'); + if (X_REQUEST_URL_REGEXP.test(xhr.getAllResponseHeaders())) { + return xhr.getResponseHeader(X_REQUEST_URL_HEADER); } return null; } @@ -95,16 +103,16 @@ export class HttpXhrBackend implements HttpBackend { req.headers.forEach((name, values) => xhr.setRequestHeader(name, values.join(','))); // Add an Accept header if one isn't present already. - if (!req.headers.has('Accept')) { - xhr.setRequestHeader('Accept', 'application/json, text/plain, */*'); + if (!req.headers.has(ACCEPT_HEADER)) { + xhr.setRequestHeader(ACCEPT_HEADER, ACCEPT_HEADER_VALUE); } // Auto-detect the Content-Type header if one isn't present already. - if (!req.headers.has('Content-Type')) { + if (!req.headers.has(CONTENT_TYPE_HEADER)) { const detectedType = req.detectContentTypeHeader(); // Sometimes Content-Type detection fails. if (detectedType !== null) { - xhr.setRequestHeader('Content-Type', detectedType); + xhr.setRequestHeader(CONTENT_TYPE_HEADER, detectedType); } } diff --git a/packages/common/http/test/resource_spec.ts b/packages/common/http/test/resource_spec.ts new file mode 100644 index 000000000000..4e7d629cd5a4 --- /dev/null +++ b/packages/common/http/test/resource_spec.ts @@ -0,0 +1,202 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {ApplicationRef, Injector, signal} from '@angular/core'; +import {TestBed} from '@angular/core/testing'; +import {HttpEventType, provideHttpClient, httpResource} from '@angular/common/http'; +import {HttpTestingController, provideHttpClientTesting} from '@angular/common/http/testing'; + +describe('httpResource', () => { + beforeEach(() => { + TestBed.configureTestingModule({providers: [provideHttpClient(), provideHttpClientTesting()]}); + }); + + it('should send a basic request', async () => { + const backend = TestBed.inject(HttpTestingController); + const res = httpResource('/data', {injector: TestBed.inject(Injector)}); + TestBed.flushEffects(); + const req = backend.expectOne('/data'); + req.flush([]); + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual([]); + }); + + it('should be reactive in its request URL', async () => { + const id = signal(0); + const backend = TestBed.inject(HttpTestingController); + const res = httpResource(() => `/data/${id()}`, {injector: TestBed.inject(Injector)}); + TestBed.flushEffects(); + const req1 = backend.expectOne('/data/0'); + req1.flush(0); + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual(0); + + id.set(1); + TestBed.flushEffects(); + const req2 = backend.expectOne('/data/1'); + req2.flush(1); + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual(1); + }); + + it('should not make backend requests if the request is undefined', async () => { + const id = signal(0); + const backend = TestBed.inject(HttpTestingController); + const res = httpResource(() => (id() !== 1 ? `/data/${id()}` : undefined), { + injector: TestBed.inject(Injector), + }); + TestBed.flushEffects(); + backend.expectOne('/data/0').flush(0); + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual(0); + + id.set(1); + TestBed.flushEffects(); + + // Verify no requests have been made. + backend.verify({ignoreCancelled: false}); + await TestBed.inject(ApplicationRef).whenStable(); + backend.verify({ignoreCancelled: false}); + + id.set(2); + TestBed.flushEffects(); + backend.expectOne('/data/2').flush(2); + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toBe(2); + }); + + it('should support the suite of HttpRequest APIs', async () => { + const backend = TestBed.inject(HttpTestingController); + const res = httpResource( + { + url: '/data', + method: 'POST', + body: {message: 'Hello, backend!'}, + headers: { + 'X-Special': 'true', + }, + params: { + 'fast': 'yes', + }, + withCredentials: true, + }, + {injector: TestBed.inject(Injector)}, + ); + TestBed.flushEffects(); + const req = backend.expectOne('/data?fast=yes'); + expect(req.request.method).toBe('POST'); + expect(req.request.body).toEqual({message: 'Hello, backend!'}); + expect(req.request.headers.get('X-Special')).toBe('true'); + expect(req.request.withCredentials).toBe(true); + + req.flush([]); + + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual([]); + }); + + it('should return response headers & status when resolved', async () => { + const backend = TestBed.inject(HttpTestingController); + const res = httpResource('/data', {injector: TestBed.inject(Injector)}); + TestBed.flushEffects(); + const req = backend.expectOne('/data'); + req.flush([], { + headers: { + 'X-Special': '123', + }, + }); + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual([]); + expect(res.headers()?.get('X-Special')).toBe('123'); + expect(res.statusCode()).toBe(200); + }); + + it('should support progress events', async () => { + const backend = TestBed.inject(HttpTestingController); + const res = httpResource( + { + url: '/data', + reportProgress: true, + }, + {injector: TestBed.inject(Injector)}, + ); + TestBed.flushEffects(); + const req = backend.expectOne('/data'); + req.event({ + type: HttpEventType.DownloadProgress, + loaded: 100, + total: 200, + }); + + expect(res.progress()).toEqual({ + type: HttpEventType.DownloadProgress, + loaded: 100, + total: 200, + }); + + req.flush([]); + + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual([]); + }); + + it('should allow mapping data to an arbitrary type', async () => { + const backend = TestBed.inject(HttpTestingController); + const res = httpResource( + { + url: '/data', + reportProgress: true, + }, + { + injector: TestBed.inject(Injector), + parse: (value) => JSON.stringify(value), + }, + ); + TestBed.flushEffects(); + const req = backend.expectOne('/data'); + req.flush([1, 2, 3]); + + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual('[1,2,3]'); + }); + + it('should support text responses', async () => { + const backend = TestBed.inject(HttpTestingController); + const res = httpResource.text( + { + url: '/data', + reportProgress: true, + }, + {injector: TestBed.inject(Injector)}, + ); + TestBed.flushEffects(); + const req = backend.expectOne('/data'); + req.flush('[1,2,3]'); + + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual('[1,2,3]'); + }); + + it('should support ArrayBuffer responses', async () => { + const backend = TestBed.inject(HttpTestingController); + const res = httpResource.arrayBuffer( + { + url: '/data', + reportProgress: true, + }, + {injector: TestBed.inject(Injector)}, + ); + TestBed.flushEffects(); + const req = backend.expectOne('/data'); + const buffer = new ArrayBuffer(); + req.flush(buffer); + + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toBe(buffer); + }); +}); diff --git a/packages/common/http/test/transfer_cache_spec.ts b/packages/common/http/test/transfer_cache_spec.ts index e0e22368be6e..dc882e95a2de 100644 --- a/packages/common/http/test/transfer_cache_spec.ts +++ b/packages/common/http/test/transfer_cache_spec.ts @@ -88,6 +88,14 @@ describe('TransferCache', () => { return response; } + beforeEach(() => { + globalThis['ngServerMode'] = true; + }); + + afterEach(() => { + globalThis['ngServerMode'] = undefined; + }); + beforeEach( withBody('', () => { TestBed.resetTestingModule(); @@ -323,6 +331,14 @@ describe('TransferCache', () => { }); describe('caching in browser context', () => { + beforeEach(() => { + globalThis['ngServerMode'] = false; + }); + + afterEach(() => { + globalThis['ngServerMode'] = undefined; + }); + beforeEach( withBody('', () => { TestBed.resetTestingModule(); diff --git a/packages/common/src/directives/ng_class.ts b/packages/common/src/directives/ng_class.ts index ddc81c9c154e..80db9c3da8dd 100644 --- a/packages/common/src/directives/ng_class.ts +++ b/packages/common/src/directives/ng_class.ts @@ -10,8 +10,6 @@ import { DoCheck, ElementRef, Input, - IterableDiffers, - KeyValueDiffers, Renderer2, ɵstringify as stringify, } from '@angular/core'; @@ -43,17 +41,23 @@ interface CssClassState { * * @usageNotes * ```html - * ... + * ... * - * ... + * ... + * ``` + * + * For more simple use cases you can use the [class bindings](/guide/templates/binding#css-class-and-style-property-bindings) directly. + * It doesn't require importing a directive. * - * ... + * ```html + * ... * - * ... + * ... * - * ... - * ``` + * ... * + * ... + * ``` * @description * * Adds and removes CSS classes on an HTML element. @@ -64,6 +68,9 @@ interface CssClassState { * - `Object` - keys are CSS classes that get added when the expression given in the value * evaluates to a truthy value, otherwise they are removed. * + * + * @see [Class bindings](/guide/templates/binding#css-class-and-style-property-bindings) + * * @publicApi */ @Directive({ diff --git a/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts b/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts index 6a822176371d..d63440640afc 100644 --- a/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts +++ b/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts @@ -16,9 +16,7 @@ import { NgZone, numberAttribute, OnChanges, - OnDestroy, OnInit, - PLATFORM_ID, Renderer2, SimpleChanges, ɵformatRuntimeError as formatRuntimeError, @@ -31,10 +29,10 @@ import { ɵunwrapSafeValue as unwrapSafeValue, ChangeDetectorRef, ApplicationRef, + DestroyRef, } from '@angular/core'; import {RuntimeErrorCode} from '../../errors'; -import {isPlatformServer} from '../../platform_id'; import {imgDirectiveDetails} from './error_helper'; import {cloudinaryLoaderInfo} from './image_loaders/cloudinary_loader'; @@ -284,17 +282,16 @@ export interface ImagePlaceholderConfig { '[style.filter]': `placeholder && shouldBlurPlaceholder(placeholderConfig) ? "blur(${PLACEHOLDER_BLUR_AMOUNT}px)" : null`, }, }) -export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { +export class NgOptimizedImage implements OnInit, OnChanges { private imageLoader = inject(IMAGE_LOADER); private config: ImageConfig = processConfig(inject(IMAGE_CONFIG)); private renderer = inject(Renderer2); private imgElement: HTMLImageElement = inject(ElementRef).nativeElement; private injector = inject(Injector); - private readonly isServer = isPlatformServer(inject(PLATFORM_ID)); - private readonly preloadLinkCreator = inject(PreloadLinkCreator); - // a LCP image observer - should be injected only in the dev mode - private lcpObserver = ngDevMode ? this.injector.get(LCPImageObserver) : null; + // An LCP image observer should be injected only in development mode. + // Do not assign it to `null` to avoid having a redundant property in the production bundle. + private lcpObserver?: LCPImageObserver; /** * Calculate the rewritten `src` once and store it. @@ -317,7 +314,7 @@ export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { * descriptors to generate the final `srcset` property of the image. * * Example: - * ``` + * ```html * => * * ``` @@ -400,6 +397,21 @@ export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { */ @Input() srcset?: string; + constructor() { + if (ngDevMode) { + this.lcpObserver = this.injector.get(LCPImageObserver); + + // Using `DestroyRef` to avoid having an empty `ngOnDestroy` method since this + // is only run in development mode. + const destroyRef = inject(DestroyRef); + destroyRef.onDestroy(() => { + if (!this.priority && this._renderedSrc !== null) { + this.lcpObserver!.unregisterImage(this._renderedSrc); + } + }); + } + } + /** @nodoc */ ngOnInit() { performanceMarkFeature('NgOptimizedImage'); @@ -444,18 +456,15 @@ export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { assertNoNgSrcsetWithoutLoader(this, this.imageLoader); assertNoLoaderParamsWithoutLoader(this, this.imageLoader); - if (this.lcpObserver !== null) { - const ngZone = this.injector.get(NgZone); - ngZone.runOutsideAngular(() => { - this.lcpObserver!.registerImage(this.getRewrittenSrc(), this.ngSrc, this.priority); - }); - } + ngZone.runOutsideAngular(() => { + this.lcpObserver!.registerImage(this.getRewrittenSrc(), this.ngSrc, this.priority); + }); if (this.priority) { const checker = this.injector.get(PreconnectLinkChecker); checker.assertPreconnect(this.getRewrittenSrc(), this.ngSrc); - if (!this.isServer) { + if (typeof ngServerMode !== 'undefined' && !ngServerMode) { const applicationRef = this.injector.get(ApplicationRef); assetPriorityCountBelowThreshold(applicationRef); } @@ -504,8 +513,9 @@ export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { } } - if (this.isServer && this.priority) { - this.preloadLinkCreator.createPreloadLinkTag( + if (typeof ngServerMode !== 'undefined' && ngServerMode && this.priority) { + const preloadLinkCreator = this.injector.get(PreloadLinkCreator); + preloadLinkCreator.createPreloadLinkTag( this.renderer, this.getRewrittenSrc(), rewrittenSrcset, @@ -532,16 +542,24 @@ export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { if (changes['ngSrc'] && !changes['ngSrc'].isFirstChange()) { const oldSrc = this._renderedSrc; this.updateSrcAndSrcset(true); - const newSrc = this._renderedSrc; - if (this.lcpObserver !== null && oldSrc && newSrc && oldSrc !== newSrc) { - const ngZone = this.injector.get(NgZone); - ngZone.runOutsideAngular(() => { - this.lcpObserver?.updateImage(oldSrc, newSrc); - }); + + if (ngDevMode) { + const newSrc = this._renderedSrc; + if (oldSrc && newSrc && oldSrc !== newSrc) { + const ngZone = this.injector.get(NgZone); + ngZone.runOutsideAngular(() => { + this.lcpObserver!.updateImage(oldSrc, newSrc); + }); + } } } - if (ngDevMode && changes['placeholder']?.currentValue && !this.isServer) { + if ( + ngDevMode && + changes['placeholder']?.currentValue && + typeof ngServerMode !== 'undefined' && + !ngServerMode + ) { assertPlaceholderDimensions(this, this.imgElement); } } @@ -709,15 +727,6 @@ export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { callOnLoadIfImageIsLoaded(img, callback); } - /** @nodoc */ - ngOnDestroy() { - if (ngDevMode) { - if (!this.priority && this._renderedSrc !== null && this.lcpObserver !== null) { - this.lcpObserver.unregisterImage(this._renderedSrc); - } - } - } - private setHostAttribute(name: string, value: string): void { this.renderer.setAttribute(this.imgElement, name, value); } diff --git a/packages/common/src/directives/ng_optimized_image/preconnect_link_checker.ts b/packages/common/src/directives/ng_optimized_image/preconnect_link_checker.ts index 413cf21dda3f..0293d461cc21 100644 --- a/packages/common/src/directives/ng_optimized_image/preconnect_link_checker.ts +++ b/packages/common/src/directives/ng_optimized_image/preconnect_link_checker.ts @@ -11,7 +11,6 @@ import { Injectable, InjectionToken, ɵformatRuntimeError as formatRuntimeError, - PLATFORM_ID, } from '@angular/core'; import {DOCUMENT} from '../../dom_tokens'; @@ -20,7 +19,6 @@ import {RuntimeErrorCode} from '../../errors'; import {assertDevMode} from './asserts'; import {imgDirectiveDetails} from './error_helper'; import {extractHostname, getUrl} from './url'; -import {isPlatformServer} from '../../platform_id'; // Set of origins that are always excluded from the preconnect checks. const INTERNAL_PRECONNECT_CHECK_BLOCKLIST = new Set(['localhost', '127.0.0.1', '0.0.0.0']); @@ -57,7 +55,6 @@ export const PRECONNECT_CHECK_BLOCKLIST = new InjectionToken tags found on this page. @@ -70,16 +67,12 @@ export class PreconnectLinkChecker { */ private alreadySeen = new Set(); - private window: Window | null = null; + private window: Window | null = this.document.defaultView; private blocklist = new Set(INTERNAL_PRECONNECT_CHECK_BLOCKLIST); constructor() { assertDevMode('preconnect link checker'); - const win = this.document.defaultView; - if (typeof win !== 'undefined') { - this.window = win; - } const blocklist = inject(PRECONNECT_CHECK_BLOCKLIST, {optional: true}); if (blocklist) { this.populateBlocklist(blocklist); @@ -104,7 +97,7 @@ export class PreconnectLinkChecker { * @param originalNgSrc ngSrc value */ assertPreconnect(rewrittenSrc: string, originalNgSrc: string): void { - if (this.isServer) return; + if (typeof ngServerMode !== 'undefined' && ngServerMode) return; const imgUrl = getUrl(rewrittenSrc, this.window!); if (this.blocklist.has(imgUrl.hostname) || this.alreadySeen.has(imgUrl.origin)) return; diff --git a/packages/common/src/directives/ng_style.ts b/packages/common/src/directives/ng_style.ts index 4a48e1a00796..5e8ef0b319d0 100644 --- a/packages/common/src/directives/ng_style.ts +++ b/packages/common/src/directives/ng_style.ts @@ -22,12 +22,6 @@ import { * * @usageNotes * - * Set the font of the containing element to the result of an expression. - * - * ```html - * ... - * ``` - * * Set the width of the containing element to a pixel value returned by an expression. * * ```html @@ -40,6 +34,15 @@ import { * ... * ``` * + * For more simple use cases you can use the [style bindings](/guide/templates/binding#css-class-and-style-property-bindings) directly. + * It doesn't require importing a directive. + * + * Set the font of the containing element to the result of an expression. + * + * ```html + * ... + * ``` + * * @description * * An attribute directive that updates styles for the containing HTML element. @@ -51,6 +54,8 @@ import { * is assigned to the given style property. * If the result of evaluation is null, the corresponding style is removed. * + * @see [Style bindings](/guide/templates/binding#css-class-and-style-property-bindings) + * * @publicApi */ @Directive({ diff --git a/packages/common/src/directives/ng_switch.ts b/packages/common/src/directives/ng_switch.ts index ae9de788273c..1ad19b45f12c 100644 --- a/packages/common/src/directives/ng_switch.ts +++ b/packages/common/src/directives/ng_switch.ts @@ -268,7 +268,3 @@ function throwNgSwitchProviderNotFoundError(attrName: string, directiveName: str `(matching "NgSwitch" directive)`, ); } - -function stringifyValue(value: unknown): string { - return typeof value === 'string' ? `'${value}'` : String(value); -} diff --git a/packages/common/src/i18n/format_date.ts b/packages/common/src/i18n/format_date.ts index 2e9ba2d7cc48..34a3e3bd2ed1 100644 --- a/packages/common/src/i18n/format_date.ts +++ b/packages/common/src/i18n/format_date.ts @@ -32,14 +32,14 @@ const NAMED_FORMATS: {[localeId: string]: {[format: string]: string}} = {}; const DATE_FORMATS_SPLIT = /((?:[^BEGHLMOSWYZabcdhmswyz']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|Y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|c{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\s\S]*)/; -enum ZoneWidth { +const enum ZoneWidth { Short, ShortGMT, Long, Extended, } -enum DateType { +const enum DateType { FullYear, Month, Date, @@ -50,7 +50,7 @@ enum DateType { Day, } -enum TranslationType { +const enum TranslationType { DayPeriods, Days, Months, diff --git a/packages/common/src/location/hash_location_strategy.ts b/packages/common/src/location/hash_location_strategy.ts index 482a6a822112..b69b76dd8613 100644 --- a/packages/common/src/location/hash_location_strategy.ts +++ b/packages/common/src/location/hash_location_strategy.ts @@ -77,18 +77,16 @@ export class HashLocationStrategy extends LocationStrategy implements OnDestroy } override pushState(state: any, title: string, path: string, queryParams: string) { - let url: string | null = this.prepareExternalUrl(path + normalizeQueryParams(queryParams)); - if (url.length == 0) { - url = this._platformLocation.pathname; - } + const url = + this.prepareExternalUrl(path + normalizeQueryParams(queryParams)) || + this._platformLocation.pathname; this._platformLocation.pushState(state, title, url); } override replaceState(state: any, title: string, path: string, queryParams: string) { - let url = this.prepareExternalUrl(path + normalizeQueryParams(queryParams)); - if (url.length == 0) { - url = this._platformLocation.pathname; - } + const url = + this.prepareExternalUrl(path + normalizeQueryParams(queryParams)) || + this._platformLocation.pathname; this._platformLocation.replaceState(state, title, url); } diff --git a/packages/common/src/location/util.ts b/packages/common/src/location/util.ts index 50b8b4b1ea66..c009de02c42e 100644 --- a/packages/common/src/location/util.ts +++ b/packages/common/src/location/util.ts @@ -15,27 +15,17 @@ * * @returns The joined URL string. */ -export function joinWithSlash(start: string, end: string): string { - if (start.length == 0) { - return end; - } - if (end.length == 0) { - return start; - } - let slashes = 0; +export function joinWithSlash(start: string, end: string) { + // If `start` is an empty string, return `end` as the result. + if (!start) return end; + // If `end` is an empty string, return `start` as the result. + if (!end) return start; + // If `start` ends with a slash, remove the leading slash from `end`. if (start.endsWith('/')) { - slashes++; - } - if (end.startsWith('/')) { - slashes++; - } - if (slashes == 2) { - return start + end.substring(1); - } - if (slashes == 1) { - return start + end; + return end.startsWith('/') ? start + end.slice(1) : start + end; } - return start + '/' + end; + // If `start` doesn't end with a slash, add one if `end` doesn't start with a slash. + return end.startsWith('/') ? start + end : `${start}/${end}`; } /** @@ -48,10 +38,13 @@ export function joinWithSlash(start: string, end: string): string { * @returns The URL string, modified if needed. */ export function stripTrailingSlash(url: string): string { - const match = url.match(/#|\?|$/); - const pathEndIdx = (match && match.index) || url.length; - const droppedSlashIdx = pathEndIdx - (url[pathEndIdx - 1] === '/' ? 1 : 0); - return url.slice(0, droppedSlashIdx) + url.slice(pathEndIdx); + // Find the index of the first occurrence of `#`, `?`, or the end of the string. + // This marks the start of the query string, fragment, or the end of the URL path. + const pathEndIdx = url.search(/#|\?|$/); + // Check if the character before `pathEndIdx` is a trailing slash. + // If it is, remove the trailing slash and return the modified URL. + // Otherwise, return the URL as is. + return url[pathEndIdx - 1] === '/' ? url.slice(0, pathEndIdx - 1) + url.slice(pathEndIdx) : url; } /** @@ -62,5 +55,5 @@ export function stripTrailingSlash(url: string): string { * @returns The normalized URL parameters string. */ export function normalizeQueryParams(params: string): string { - return params && params[0] !== '?' ? '?' + params : params; + return params && params[0] !== '?' ? `?${params}` : params; } diff --git a/packages/common/src/navigation/navigation_types.ts b/packages/common/src/navigation/navigation_types.ts deleted file mode 100644 index 37b101482aad..000000000000 --- a/packages/common/src/navigation/navigation_types.ts +++ /dev/null @@ -1,181 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -export interface NavigationEventMap { - navigate: NavigateEvent; - navigatesuccess: Event; - navigateerror: ErrorEvent; - currententrychange: NavigationCurrentEntryChangeEvent; -} - -export interface NavigationResult { - committed: Promise; - finished: Promise; -} - -export declare class Navigation extends EventTarget { - entries(): NavigationHistoryEntry[]; - readonly currentEntry: NavigationHistoryEntry | null; - updateCurrentEntry(options: NavigationUpdateCurrentEntryOptions): void; - readonly transition: NavigationTransition | null; - - readonly canGoBack: boolean; - readonly canGoForward: boolean; - - navigate(url: string, options?: NavigationNavigateOptions): NavigationResult; - reload(options?: NavigationReloadOptions): NavigationResult; - - traverseTo(key: string, options?: NavigationOptions): NavigationResult; - back(options?: NavigationOptions): NavigationResult; - forward(options?: NavigationOptions): NavigationResult; - - onnavigate: ((this: Navigation, ev: NavigateEvent) => any) | null; - onnavigatesuccess: ((this: Navigation, ev: Event) => any) | null; - onnavigateerror: ((this: Navigation, ev: ErrorEvent) => any) | null; - oncurrententrychange: ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any) | null; - - addEventListener( - type: K, - listener: (this: Navigation, ev: NavigationEventMap[K]) => any, - options?: boolean | AddEventListenerOptions, - ): void; - addEventListener( - type: string, - listener: EventListenerOrEventListenerObject, - options?: boolean | AddEventListenerOptions, - ): void; - removeEventListener( - type: K, - listener: (this: Navigation, ev: NavigationEventMap[K]) => any, - options?: boolean | EventListenerOptions, - ): void; - removeEventListener( - type: string, - listener: EventListenerOrEventListenerObject, - options?: boolean | EventListenerOptions, - ): void; -} - -export declare class NavigationTransition { - readonly navigationType: NavigationTypeString; - readonly from: NavigationHistoryEntry; - readonly finished: Promise; -} - -export interface NavigationHistoryEntryEventMap { - dispose: Event; -} - -export declare class NavigationHistoryEntry extends EventTarget { - readonly key: string; - readonly id: string; - readonly url: string | null; - readonly index: number; - readonly sameDocument: boolean; - - getState(): unknown; - - ondispose: ((this: NavigationHistoryEntry, ev: Event) => any) | null; - - addEventListener( - type: K, - listener: (this: NavigationHistoryEntry, ev: NavigationHistoryEntryEventMap[K]) => any, - options?: boolean | AddEventListenerOptions, - ): void; - addEventListener( - type: string, - listener: EventListenerOrEventListenerObject, - options?: boolean | AddEventListenerOptions, - ): void; - removeEventListener( - type: K, - listener: (this: NavigationHistoryEntry, ev: NavigationHistoryEntryEventMap[K]) => any, - options?: boolean | EventListenerOptions, - ): void; - removeEventListener( - type: string, - listener: EventListenerOrEventListenerObject, - options?: boolean | EventListenerOptions, - ): void; -} - -type NavigationTypeString = 'reload' | 'push' | 'replace' | 'traverse'; - -export interface NavigationUpdateCurrentEntryOptions { - state: unknown; -} - -export interface NavigationOptions { - info?: unknown; -} - -export interface NavigationNavigateOptions extends NavigationOptions { - state?: unknown; - history?: 'auto' | 'push' | 'replace'; -} - -export interface NavigationReloadOptions extends NavigationOptions { - state?: unknown; -} - -export declare class NavigationCurrentEntryChangeEvent extends Event { - constructor(type: string, eventInit?: NavigationCurrentEntryChangeEventInit); - - readonly navigationType: NavigationTypeString | null; - readonly from: NavigationHistoryEntry; -} - -export interface NavigationCurrentEntryChangeEventInit extends EventInit { - navigationType?: NavigationTypeString | null; - from: NavigationHistoryEntry; -} - -export declare class NavigateEvent extends Event { - constructor(type: string, eventInit?: NavigateEventInit); - - readonly navigationType: NavigationTypeString; - readonly canIntercept: boolean; - readonly userInitiated: boolean; - readonly hashChange: boolean; - readonly destination: NavigationDestination; - readonly signal: AbortSignal; - readonly formData: FormData | null; - readonly downloadRequest: string | null; - readonly info?: unknown; - - intercept(options?: NavigationInterceptOptions): void; - scroll(): void; -} - -export interface NavigateEventInit extends EventInit { - navigationType?: NavigationTypeString; - canIntercept?: boolean; - userInitiated?: boolean; - hashChange?: boolean; - destination: NavigationDestination; - signal: AbortSignal; - formData?: FormData | null; - downloadRequest?: string | null; - info?: unknown; -} - -export interface NavigationInterceptOptions { - handler?: () => Promise; - focusReset?: 'after-transition' | 'manual'; - scroll?: 'after-transition' | 'manual'; -} - -export declare class NavigationDestination { - readonly url: string; - readonly key: string | null; - readonly id: string | null; - readonly index: number; - readonly sameDocument: boolean; - - getState(): unknown; -} diff --git a/packages/common/src/navigation/platform_navigation.ts b/packages/common/src/navigation/platform_navigation.ts index 551f7e0d3a7d..bcc08d4539bd 100644 --- a/packages/common/src/navigation/platform_navigation.ts +++ b/packages/common/src/navigation/platform_navigation.ts @@ -6,20 +6,19 @@ * found in the LICENSE file at https://angular.dev/license */ -import {Injectable} from '@angular/core'; - import { - NavigateEvent, - Navigation, - NavigationCurrentEntryChangeEvent, - NavigationHistoryEntry, - NavigationNavigateOptions, - NavigationOptions, - NavigationReloadOptions, - NavigationResult, - NavigationTransition, - NavigationUpdateCurrentEntryOptions, -} from './navigation_types'; + Injectable, + ɵNavigateEvent as NavigateEvent, + ɵNavigation as Navigation, + ɵNavigationCurrentEntryChangeEvent as NavigationCurrentEntryChangeEvent, + ɵNavigationHistoryEntry as NavigationHistoryEntry, + ɵNavigationNavigateOptions as NavigationNavigateOptions, + ɵNavigationOptions as NavigationOptions, + ɵNavigationReloadOptions as NavigationReloadOptions, + ɵNavigationResult as NavigationResult, + ɵNavigationTransition as NavigationTransition, + ɵNavigationUpdateCurrentEntryOptions as NavigationUpdateCurrentEntryOptions, +} from '@angular/core'; /** * This class wraps the platform Navigation API which allows server-specific and test diff --git a/packages/common/src/pipes/keyvalue_pipe.ts b/packages/common/src/pipes/keyvalue_pipe.ts index 2dca5f94c3de..4df4f18d9b70 100644 --- a/packages/common/src/pipes/keyvalue_pipe.ts +++ b/packages/common/src/pipes/keyvalue_pipe.ts @@ -132,25 +132,26 @@ export function defaultComparator( ): number { const a = keyValueA.key; const b = keyValueB.key; - // if same exit with 0; + // If both keys are the same, return 0 (no sorting needed). if (a === b) return 0; - // make sure that undefined are at the end of the sort. - if (a === undefined) return 1; - if (b === undefined) return -1; - // make sure that nulls are at the end of the sort. - if (a === null) return 1; - if (b === null) return -1; + // If one of the keys is `null` or `undefined`, place it at the end of the sort. + if (a == null) return 1; // `a` comes after `b`. + if (b == null) return -1; // `b` comes after `a`. + // If both keys are strings, compare them lexicographically. if (typeof a == 'string' && typeof b == 'string') { return a < b ? -1 : 1; } + // If both keys are numbers, sort them numerically. if (typeof a == 'number' && typeof b == 'number') { return a - b; } + // If both keys are booleans, sort `false` before `true`. if (typeof a == 'boolean' && typeof b == 'boolean') { return a < b ? -1 : 1; } - // `a` and `b` are of different types. Compare their string values. + // Fallback case: if keys are of different types, compare their string representations. const aString = String(a); const bString = String(b); + // Compare the string representations lexicographically. return aString == bString ? 0 : aString < bString ? -1 : 1; } diff --git a/packages/common/src/pipes/slice_pipe.ts b/packages/common/src/pipes/slice_pipe.ts index 038364dd1155..567f5fc12ef9 100644 --- a/packages/common/src/pipes/slice_pipe.ts +++ b/packages/common/src/pipes/slice_pipe.ts @@ -81,14 +81,12 @@ export class SlicePipe implements PipeTransform { ): Array | string | null { if (value == null) return null; - if (!this.supports(value)) { + const supports = typeof value === 'string' || Array.isArray(value); + + if (!supports) { throw invalidPipeArgumentError(SlicePipe, value); } return value.slice(start, end); } - - private supports(obj: any): boolean { - return typeof obj === 'string' || Array.isArray(obj); - } } diff --git a/packages/common/src/viewport_scroller.ts b/packages/common/src/viewport_scroller.ts index 0aec9d69e4c4..da4f021aac53 100644 --- a/packages/common/src/viewport_scroller.ts +++ b/packages/common/src/viewport_scroller.ts @@ -6,10 +6,9 @@ * found in the LICENSE file at https://angular.dev/license */ -import {inject, PLATFORM_ID, ɵɵdefineInjectable} from '@angular/core'; +import {inject, ɵɵdefineInjectable} from '@angular/core'; import {DOCUMENT} from './dom_tokens'; -import {isPlatformBrowser} from './platform_id'; /** * Defines a scroll position manager. Implemented by `BrowserViewportScroller`. @@ -24,9 +23,9 @@ export abstract class ViewportScroller { token: ViewportScroller, providedIn: 'root', factory: () => - isPlatformBrowser(inject(PLATFORM_ID)) - ? new BrowserViewportScroller(inject(DOCUMENT), window) - : new NullViewportScroller(), + typeof ngServerMode !== 'undefined' && ngServerMode + ? new NullViewportScroller() + : new BrowserViewportScroller(inject(DOCUMENT), window), }); /** diff --git a/packages/common/test/directives/ng_optimized_image_spec.ts b/packages/common/test/directives/ng_optimized_image_spec.ts index e39c277292e3..482e0eff09d7 100644 --- a/packages/common/test/directives/ng_optimized_image_spec.ts +++ b/packages/common/test/directives/ng_optimized_image_spec.ts @@ -36,134 +36,144 @@ import {PRECONNECT_CHECK_BLOCKLIST} from '../../src/directives/ng_optimized_imag describe('Image directive', () => { describe('preload element on a server', () => { - it('should create `` element when the image priority attr is true', () => { - // Only run this test in a browser since the Node-based DOM mocks don't - // allow to override `HTMLImageElement.prototype.setAttribute` easily. - if (!isBrowser) return; - - const src = 'preload1/img.png'; - - setupTestingModule({ - extraProviders: [ - {provide: PLATFORM_ID, useValue: PLATFORM_SERVER_ID}, - { - provide: IMAGE_LOADER, - useValue: (config: ImageLoaderConfig) => - config.width - ? `https://angular.io/${config.src}?width=${config.width}` - : `https://angular.io/${config.src}`, - }, - ], + describe('server', () => { + beforeEach(() => { + globalThis['ngServerMode'] = true; }); - const template = ``; - TestBed.overrideComponent(TestComponent, {set: {template: template}}); + afterEach(() => { + globalThis['ngServerMode'] = undefined; + }); - const _document = TestBed.inject(DOCUMENT); - const _window = _document.defaultView!; - const setAttributeSpy = spyOn( - _window.HTMLLinkElement.prototype, - 'setAttribute', - ).and.callThrough(); + it('should create `` element when the image priority attr is true', () => { + // Only run this test in a browser since the Node-based DOM mocks don't + // allow to override `HTMLImageElement.prototype.setAttribute` easily. + if (!isBrowser) return; - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); + const src = 'preload1/img.png'; - const head = _document.head; + setupTestingModule({ + extraProviders: [ + {provide: PLATFORM_ID, useValue: PLATFORM_SERVER_ID}, + { + provide: IMAGE_LOADER, + useValue: (config: ImageLoaderConfig) => + config.width + ? `https://angular.io/${config.src}?width=${config.width}` + : `https://angular.io/${config.src}`, + }, + ], + }); - const rewrittenSrc = `https://angular.io/${src}`; + const template = ``; + TestBed.overrideComponent(TestComponent, {set: {template: template}}); - const preloadLink = head.querySelector(`link[href="${rewrittenSrc}"]`); + const _document = TestBed.inject(DOCUMENT); + const _window = _document.defaultView!; + const setAttributeSpy = spyOn( + _window.HTMLLinkElement.prototype, + 'setAttribute', + ).and.callThrough(); - expect(preloadLink).toBeTruthy(); + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); - const [name, value] = setAttributeSpy.calls.argsFor(0); + const head = _document.head; - expect(name).toEqual('as'); - expect(value).toEqual('image'); + const rewrittenSrc = `https://angular.io/${src}`; - expect(preloadLink!.getAttribute('rel')).toEqual('preload'); - expect(preloadLink!.getAttribute('as')).toEqual('image'); - expect(preloadLink!.getAttribute('imagesizes')).toEqual('10vw'); - expect(preloadLink!.getAttribute('imagesrcset')).toEqual(`${rewrittenSrc}?width=100 100w`); - expect(preloadLink!.getAttribute('fetchpriority')).toEqual('high'); + const preloadLink = head.querySelector(`link[href="${rewrittenSrc}"]`); - preloadLink!.remove(); - }); + expect(preloadLink).toBeTruthy(); - it('should not create a preload `` element when src is already preloaded.', () => { - // Only run this test in a browser since the Node-based DOM mocks don't - // allow to override `HTMLImageElement.prototype.setAttribute` easily. - if (!isBrowser) return; + const [name, value] = setAttributeSpy.calls.argsFor(0); - const src = `preload2/img.png`; + expect(name).toEqual('as'); + expect(value).toEqual('image'); - const rewrittenSrc = `https://angular.io/${src}`; + expect(preloadLink!.getAttribute('rel')).toEqual('preload'); + expect(preloadLink!.getAttribute('as')).toEqual('image'); + expect(preloadLink!.getAttribute('imagesizes')).toEqual('10vw'); + expect(preloadLink!.getAttribute('imagesrcset')).toEqual(`${rewrittenSrc}?width=100 100w`); + expect(preloadLink!.getAttribute('fetchpriority')).toEqual('high'); - setupTestingModule({ - extraProviders: [ - {provide: PLATFORM_ID, useValue: PLATFORM_SERVER_ID}, - { - provide: IMAGE_LOADER, - useValue: (config: ImageLoaderConfig) => `https://angular.io/${config.src}`, - }, - ], + preloadLink!.remove(); }); - const template = ``; - TestBed.overrideComponent(TestComponent, {set: {template: template}}); + it('should not create a preload `` element when src is already preloaded.', () => { + // Only run this test in a browser since the Node-based DOM mocks don't + // allow to override `HTMLImageElement.prototype.setAttribute` easily. + if (!isBrowser) return; - const _document = TestBed.inject(DOCUMENT); + const src = `preload2/img.png`; - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); + const rewrittenSrc = `https://angular.io/${src}`; - const head = _document.head; + setupTestingModule({ + extraProviders: [ + {provide: PLATFORM_ID, useValue: PLATFORM_SERVER_ID}, + { + provide: IMAGE_LOADER, + useValue: (config: ImageLoaderConfig) => `https://angular.io/${config.src}`, + }, + ], + }); - const preloadImages = TestBed.inject(PRELOADED_IMAGES); + const template = ``; + TestBed.overrideComponent(TestComponent, {set: {template: template}}); - expect(preloadImages.has(rewrittenSrc)).toBeTruthy(); + const _document = TestBed.inject(DOCUMENT); - const preloadLinks = head.querySelectorAll(`link[href="${rewrittenSrc}"]`); + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); - expect(preloadLinks.length).toEqual(1); + const head = _document.head; - preloadLinks[0]!.remove(); - }); + const preloadImages = TestBed.inject(PRELOADED_IMAGES); - it('should error when the number of preloaded images is larger than the limit', () => { - // Only run this test in a browser since the Node-based DOM mocks don't - // allow to override `HTMLImageElement.prototype.setAttribute` easily. - if (!isBrowser) return; + expect(preloadImages.has(rewrittenSrc)).toBeTruthy(); - setupTestingModule({ - extraProviders: [ - {provide: PLATFORM_ID, useValue: PLATFORM_SERVER_ID}, - { - provide: IMAGE_LOADER, - useValue: (config: ImageLoaderConfig) => `https://angular.io/${config.src}`, - }, - ], + const preloadLinks = head.querySelectorAll(`link[href="${rewrittenSrc}"]`); + + expect(preloadLinks.length).toEqual(1); + + preloadLinks[0]!.remove(); }); - const template = ` - - - - - - - - - - `; + it('should error when the number of preloaded images is larger than the limit', () => { + // Only run this test in a browser since the Node-based DOM mocks don't + // allow to override `HTMLImageElement.prototype.setAttribute` easily. + if (!isBrowser) return; - expect(() => { - const fixture = createTestComponent(template); - fixture.detectChanges(); - }).toThrowError( - 'NG02961: The `NgOptimizedImage` directive has detected that more than 5 images were marked as priority. This might negatively affect an overall performance of the page. To fix this, remove the "priority" attribute from images with less priority.', - ); + setupTestingModule({ + extraProviders: [ + {provide: PLATFORM_ID, useValue: PLATFORM_SERVER_ID}, + { + provide: IMAGE_LOADER, + useValue: (config: ImageLoaderConfig) => `https://angular.io/${config.src}`, + }, + ], + }); + + const template = ` + + + + + + + + + + `; + + expect(() => { + const fixture = createTestComponent(template); + fixture.detectChanges(); + }).toThrowError( + 'NG02961: The `NgOptimizedImage` directive has detected that more than 5 images were marked as priority. This might negatively affect an overall performance of the page. To fix this, remove the "priority" attribute from images with less priority.', + ); + }); }); it('should not hit max preload limit when not on the server', () => { @@ -878,6 +888,9 @@ describe('Image directive', () => { it( 'should log a warning if the priority attribute is used too often', withHead('', async () => { + // This test is running both on server and in the browser. + globalThis['ngServerMode'] = !isBrowser; + // We need to reset the count as previous test might have incremented it already resetImagePriorityCount(); @@ -922,6 +935,8 @@ describe('Image directive', () => { // The warning is only logged on browsers expect(consoleWarnSpy.calls.count()).toBe(0); } + + globalThis['ngServerMode'] = undefined; }), ); }); @@ -1341,36 +1356,46 @@ describe('Image directive', () => { }); if (isBrowser) { - it('should throw if the placeholder height exceeds the threshold', () => { - setUpModuleNoLoader(); + describe('browser', () => { + beforeEach(() => { + globalThis['ngServerMode'] = false; + }); + + afterEach(() => { + globalThis['ngServerMode'] = undefined; + }); - const template = ``; + it('should throw if the placeholder height exceeds the threshold', () => { + setUpModuleNoLoader(); - const consoleWarnSpy = spyOn(console, 'warn'); - const fixture = createTestComponent(template); - fixture.detectChanges(); - expect(consoleWarnSpy.calls.count()).toBe(1); - expect(consoleWarnSpy.calls.argsFor(0)[0]).toMatch( - new RegExp(`NG0${RuntimeErrorCode.PLACEHOLDER_DIMENSION_LIMIT_EXCEEDED}:`), - ); - }); + const template = ``; - it('should throw if the placeholder width exceeds the threshold', () => { - setUpModuleNoLoader(); + const consoleWarnSpy = spyOn(console, 'warn'); + const fixture = createTestComponent(template); + fixture.detectChanges(); + expect(consoleWarnSpy.calls.count()).toBe(1); + expect(consoleWarnSpy.calls.argsFor(0)[0]).toMatch( + new RegExp(`NG0${RuntimeErrorCode.PLACEHOLDER_DIMENSION_LIMIT_EXCEEDED}:`), + ); + }); - const template = ``; + it('should throw if the placeholder width exceeds the threshold', () => { + setUpModuleNoLoader(); - const consoleWarnSpy = spyOn(console, 'warn'); - const fixture = createTestComponent(template); - fixture.detectChanges(); - expect(consoleWarnSpy.calls.count()).toBe(1); - expect(consoleWarnSpy.calls.argsFor(0)[0]).toMatch( - new RegExp(`NG0${RuntimeErrorCode.PLACEHOLDER_DIMENSION_LIMIT_EXCEEDED}:`), - ); + const template = ``; + + const consoleWarnSpy = spyOn(console, 'warn'); + const fixture = createTestComponent(template); + fixture.detectChanges(); + expect(consoleWarnSpy.calls.count()).toBe(1); + expect(consoleWarnSpy.calls.argsFor(0)[0]).toMatch( + new RegExp(`NG0${RuntimeErrorCode.PLACEHOLDER_DIMENSION_LIMIT_EXCEEDED}:`), + ); + }); }); } }); diff --git a/packages/common/testing/BUILD.bazel b/packages/common/testing/BUILD.bazel index 781151bb3a53..6df726b48bb4 100644 --- a/packages/common/testing/BUILD.bazel +++ b/packages/common/testing/BUILD.bazel @@ -10,6 +10,7 @@ ng_module( deps = [ "//packages/common", "//packages/core", + "//packages/core/testing", "@npm//rxjs", ], ) diff --git a/packages/common/testing/src/navigation/fake_navigation.ts b/packages/common/testing/src/navigation/fake_navigation.ts index b84b85b96b85..c4f190f79fe4 100644 --- a/packages/common/testing/src/navigation/fake_navigation.ts +++ b/packages/common/testing/src/navigation/fake_navigation.ts @@ -6,972 +6,4 @@ * found in the LICENSE file at https://angular.dev/license */ -import { - NavigateEvent, - Navigation, - NavigationCurrentEntryChangeEvent, - NavigationDestination, - NavigationHistoryEntry, - NavigationInterceptOptions, - NavigationNavigateOptions, - NavigationOptions, - NavigationReloadOptions, - NavigationResult, - NavigationTransition, - NavigationTypeString, - NavigationUpdateCurrentEntryOptions, -} from './navigation_types'; - -/** - * Fake implementation of user agent history and navigation behavior. This is a - * high-fidelity implementation of browser behavior that attempts to emulate - * things like traversal delay. - */ -export class FakeNavigation implements Navigation { - /** - * The fake implementation of an entries array. Only same-document entries - * allowed. - */ - private readonly entriesArr: FakeNavigationHistoryEntry[] = []; - - /** - * The current active entry index into `entriesArr`. - */ - private currentEntryIndex = 0; - - /** - * The current navigate event. - */ - private navigateEvent: InternalFakeNavigateEvent | undefined = undefined; - - /** - * A Map of pending traversals, so that traversals to the same entry can be - * re-used. - */ - private readonly traversalQueue = new Map(); - - /** - * A Promise that resolves when the previous traversals have finished. Used to - * simulate the cross-process communication necessary for traversals. - */ - private nextTraversal = Promise.resolve(); - - /** - * A prospective current active entry index, which includes unresolved - * traversals. Used by `go` to determine where navigations are intended to go. - */ - private prospectiveEntryIndex = 0; - - /** - * A test-only option to make traversals synchronous, rather than emulate - * cross-process communication. - */ - private synchronousTraversals = false; - - /** Whether to allow a call to setInitialEntryForTesting. */ - private canSetInitialEntry = true; - - /** `EventTarget` to dispatch events. */ - private eventTarget: EventTarget; - - /** The next unique id for created entries. Replace recreates this id. */ - private nextId = 0; - - /** The next unique key for created entries. Replace inherits this id. */ - private nextKey = 0; - - /** Whether this fake is disposed. */ - private disposed = false; - - /** Equivalent to `navigation.currentEntry`. */ - get currentEntry(): FakeNavigationHistoryEntry { - return this.entriesArr[this.currentEntryIndex]; - } - - get canGoBack(): boolean { - return this.currentEntryIndex > 0; - } - - get canGoForward(): boolean { - return this.currentEntryIndex < this.entriesArr.length - 1; - } - - constructor( - private readonly window: Window, - startURL: `http${string}`, - ) { - this.eventTarget = this.window.document.createElement('div'); - // First entry. - this.setInitialEntryForTesting(startURL); - } - - /** - * Sets the initial entry. - */ - private setInitialEntryForTesting( - url: `http${string}`, - options: {historyState: unknown; state?: unknown} = {historyState: null}, - ) { - if (!this.canSetInitialEntry) { - throw new Error( - 'setInitialEntryForTesting can only be called before any ' + 'navigation has occurred', - ); - } - const currentInitialEntry = this.entriesArr[0]; - this.entriesArr[0] = new FakeNavigationHistoryEntry(new URL(url).toString(), { - index: 0, - key: currentInitialEntry?.key ?? String(this.nextKey++), - id: currentInitialEntry?.id ?? String(this.nextId++), - sameDocument: true, - historyState: options?.historyState, - state: options.state, - }); - } - - /** Returns whether the initial entry is still eligible to be set. */ - canSetInitialEntryForTesting(): boolean { - return this.canSetInitialEntry; - } - - /** - * Sets whether to emulate traversals as synchronous rather than - * asynchronous. - */ - setSynchronousTraversalsForTesting(synchronousTraversals: boolean) { - this.synchronousTraversals = synchronousTraversals; - } - - /** Equivalent to `navigation.entries()`. */ - entries(): FakeNavigationHistoryEntry[] { - return this.entriesArr.slice(); - } - - /** Equivalent to `navigation.navigate()`. */ - navigate(url: string, options?: NavigationNavigateOptions): FakeNavigationResult { - const fromUrl = new URL(this.currentEntry.url!); - const toUrl = new URL(url, this.currentEntry.url!); - - let navigationType: NavigationTypeString; - if (!options?.history || options.history === 'auto') { - // Auto defaults to push, but if the URLs are the same, is a replace. - if (fromUrl.toString() === toUrl.toString()) { - navigationType = 'replace'; - } else { - navigationType = 'push'; - } - } else { - navigationType = options.history; - } - - const hashChange = isHashChange(fromUrl, toUrl); - - const destination = new FakeNavigationDestination({ - url: toUrl.toString(), - state: options?.state, - sameDocument: hashChange, - historyState: null, - }); - const result = new InternalNavigationResult(); - - this.userAgentNavigate(destination, result, { - navigationType, - cancelable: true, - canIntercept: true, - // Always false for navigate(). - userInitiated: false, - hashChange, - info: options?.info, - }); - - return { - committed: result.committed, - finished: result.finished, - }; - } - - /** Equivalent to `history.pushState()`. */ - pushState(data: unknown, title: string, url?: string): void { - this.pushOrReplaceState('push', data, title, url); - } - - /** Equivalent to `history.replaceState()`. */ - replaceState(data: unknown, title: string, url?: string): void { - this.pushOrReplaceState('replace', data, title, url); - } - - private pushOrReplaceState( - navigationType: NavigationTypeString, - data: unknown, - _title: string, - url?: string, - ): void { - const fromUrl = new URL(this.currentEntry.url!); - const toUrl = url ? new URL(url, this.currentEntry.url!) : fromUrl; - - const hashChange = isHashChange(fromUrl, toUrl); - - const destination = new FakeNavigationDestination({ - url: toUrl.toString(), - sameDocument: true, - historyState: data, - }); - const result = new InternalNavigationResult(); - - this.userAgentNavigate(destination, result, { - navigationType, - cancelable: true, - canIntercept: true, - // Always false for pushState() or replaceState(). - userInitiated: false, - hashChange, - skipPopState: true, - }); - } - - /** Equivalent to `navigation.traverseTo()`. */ - traverseTo(key: string, options?: NavigationOptions): FakeNavigationResult { - const fromUrl = new URL(this.currentEntry.url!); - const entry = this.findEntry(key); - if (!entry) { - const domException = new DOMException('Invalid key', 'InvalidStateError'); - const committed = Promise.reject(domException); - const finished = Promise.reject(domException); - committed.catch(() => {}); - finished.catch(() => {}); - return { - committed, - finished, - }; - } - if (entry === this.currentEntry) { - return { - committed: Promise.resolve(this.currentEntry), - finished: Promise.resolve(this.currentEntry), - }; - } - if (this.traversalQueue.has(entry.key)) { - const existingResult = this.traversalQueue.get(entry.key)!; - return { - committed: existingResult.committed, - finished: existingResult.finished, - }; - } - - const hashChange = isHashChange(fromUrl, new URL(entry.url!, this.currentEntry.url!)); - const destination = new FakeNavigationDestination({ - url: entry.url!, - state: entry.getState(), - historyState: entry.getHistoryState(), - key: entry.key, - id: entry.id, - index: entry.index, - sameDocument: entry.sameDocument, - }); - this.prospectiveEntryIndex = entry.index; - const result = new InternalNavigationResult(); - this.traversalQueue.set(entry.key, result); - this.runTraversal(() => { - this.traversalQueue.delete(entry.key); - this.userAgentNavigate(destination, result, { - navigationType: 'traverse', - cancelable: true, - canIntercept: true, - // Always false for traverseTo(). - userInitiated: false, - hashChange, - info: options?.info, - }); - }); - return { - committed: result.committed, - finished: result.finished, - }; - } - - /** Equivalent to `navigation.back()`. */ - back(options?: NavigationOptions): FakeNavigationResult { - if (this.currentEntryIndex === 0) { - const domException = new DOMException('Cannot go back', 'InvalidStateError'); - const committed = Promise.reject(domException); - const finished = Promise.reject(domException); - committed.catch(() => {}); - finished.catch(() => {}); - return { - committed, - finished, - }; - } - const entry = this.entriesArr[this.currentEntryIndex - 1]; - return this.traverseTo(entry.key, options); - } - - /** Equivalent to `navigation.forward()`. */ - forward(options?: NavigationOptions): FakeNavigationResult { - if (this.currentEntryIndex === this.entriesArr.length - 1) { - const domException = new DOMException('Cannot go forward', 'InvalidStateError'); - const committed = Promise.reject(domException); - const finished = Promise.reject(domException); - committed.catch(() => {}); - finished.catch(() => {}); - return { - committed, - finished, - }; - } - const entry = this.entriesArr[this.currentEntryIndex + 1]; - return this.traverseTo(entry.key, options); - } - - /** - * Equivalent to `history.go()`. - * Note that this method does not actually work precisely to how Chrome - * does, instead choosing a simpler model with less unexpected behavior. - * Chrome has a few edge case optimizations, for instance with repeated - * `back(); forward()` chains it collapses certain traversals. - */ - go(direction: number): void { - const targetIndex = this.prospectiveEntryIndex + direction; - if (targetIndex >= this.entriesArr.length || targetIndex < 0) { - return; - } - this.prospectiveEntryIndex = targetIndex; - this.runTraversal(() => { - // Check again that destination is in the entries array. - if (targetIndex >= this.entriesArr.length || targetIndex < 0) { - return; - } - const fromUrl = new URL(this.currentEntry.url!); - const entry = this.entriesArr[targetIndex]; - const hashChange = isHashChange(fromUrl, new URL(entry.url!, this.currentEntry.url!)); - const destination = new FakeNavigationDestination({ - url: entry.url!, - state: entry.getState(), - historyState: entry.getHistoryState(), - key: entry.key, - id: entry.id, - index: entry.index, - sameDocument: entry.sameDocument, - }); - const result = new InternalNavigationResult(); - this.userAgentNavigate(destination, result, { - navigationType: 'traverse', - cancelable: true, - canIntercept: true, - // Always false for go(). - userInitiated: false, - hashChange, - }); - }); - } - - /** Runs a traversal synchronously or asynchronously */ - private runTraversal(traversal: () => void) { - if (this.synchronousTraversals) { - traversal(); - return; - } - - // Each traversal occupies a single timeout resolution. - // This means that Promises added to commit and finish should resolve - // before the next traversal. - this.nextTraversal = this.nextTraversal.then(() => { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - traversal(); - }); - }); - }); - } - - /** Equivalent to `navigation.addEventListener()`. */ - addEventListener( - type: string, - callback: EventListenerOrEventListenerObject, - options?: AddEventListenerOptions | boolean, - ) { - this.eventTarget.addEventListener(type, callback, options); - } - - /** Equivalent to `navigation.removeEventListener()`. */ - removeEventListener( - type: string, - callback: EventListenerOrEventListenerObject, - options?: EventListenerOptions | boolean, - ) { - this.eventTarget.removeEventListener(type, callback, options); - } - - /** Equivalent to `navigation.dispatchEvent()` */ - dispatchEvent(event: Event): boolean { - return this.eventTarget.dispatchEvent(event); - } - - /** Cleans up resources. */ - dispose() { - // Recreate eventTarget to release current listeners. - // `document.createElement` because NodeJS `EventTarget` is incompatible with Domino's `Event`. - this.eventTarget = this.window.document.createElement('div'); - this.disposed = true; - } - - /** Returns whether this fake is disposed. */ - isDisposed() { - return this.disposed; - } - - /** Implementation for all navigations and traversals. */ - private userAgentNavigate( - destination: FakeNavigationDestination, - result: InternalNavigationResult, - options: InternalNavigateOptions, - ) { - // The first navigation should disallow any future calls to set the initial - // entry. - this.canSetInitialEntry = false; - if (this.navigateEvent) { - this.navigateEvent.cancel(new DOMException('Navigation was aborted', 'AbortError')); - this.navigateEvent = undefined; - } - - const navigateEvent = createFakeNavigateEvent({ - navigationType: options.navigationType, - cancelable: options.cancelable, - canIntercept: options.canIntercept, - userInitiated: options.userInitiated, - hashChange: options.hashChange, - signal: result.signal, - destination, - info: options.info, - sameDocument: destination.sameDocument, - skipPopState: options.skipPopState, - result, - userAgentCommit: () => { - this.userAgentCommit(); - }, - }); - - this.navigateEvent = navigateEvent; - this.eventTarget.dispatchEvent(navigateEvent); - navigateEvent.dispatchedNavigateEvent(); - if (navigateEvent.commitOption === 'immediate') { - navigateEvent.commit(/* internal= */ true); - } - } - - /** Implementation to commit a navigation. */ - private userAgentCommit() { - if (!this.navigateEvent) { - return; - } - const from = this.currentEntry; - if (!this.navigateEvent.sameDocument) { - const error = new Error('Cannot navigate to a non-same-document URL.'); - this.navigateEvent.cancel(error); - throw error; - } - if ( - this.navigateEvent.navigationType === 'push' || - this.navigateEvent.navigationType === 'replace' - ) { - this.userAgentPushOrReplace(this.navigateEvent.destination, { - navigationType: this.navigateEvent.navigationType, - }); - } else if (this.navigateEvent.navigationType === 'traverse') { - this.userAgentTraverse(this.navigateEvent.destination); - } - this.navigateEvent.userAgentNavigated(this.currentEntry); - const currentEntryChangeEvent = createFakeNavigationCurrentEntryChangeEvent({ - from, - navigationType: this.navigateEvent.navigationType, - }); - this.eventTarget.dispatchEvent(currentEntryChangeEvent); - if (!this.navigateEvent.skipPopState) { - const popStateEvent = createPopStateEvent({ - state: this.navigateEvent.destination.getHistoryState(), - }); - this.window.dispatchEvent(popStateEvent); - } - } - - /** Implementation for a push or replace navigation. */ - private userAgentPushOrReplace( - destination: FakeNavigationDestination, - {navigationType}: {navigationType: NavigationTypeString}, - ) { - if (navigationType === 'push') { - this.currentEntryIndex++; - this.prospectiveEntryIndex = this.currentEntryIndex; - } - const index = this.currentEntryIndex; - const key = navigationType === 'push' ? String(this.nextKey++) : this.currentEntry.key; - const entry = new FakeNavigationHistoryEntry(destination.url, { - id: String(this.nextId++), - key, - index, - sameDocument: true, - state: destination.getState(), - historyState: destination.getHistoryState(), - }); - if (navigationType === 'push') { - this.entriesArr.splice(index, Infinity, entry); - } else { - this.entriesArr[index] = entry; - } - } - - /** Implementation for a traverse navigation. */ - private userAgentTraverse(destination: FakeNavigationDestination) { - this.currentEntryIndex = destination.index; - } - - /** Utility method for finding entries with the given `key`. */ - private findEntry(key: string) { - for (const entry of this.entriesArr) { - if (entry.key === key) return entry; - } - return undefined; - } - - set onnavigate(_handler: ((this: Navigation, ev: NavigateEvent) => any) | null) { - throw new Error('unimplemented'); - } - - get onnavigate(): ((this: Navigation, ev: NavigateEvent) => any) | null { - throw new Error('unimplemented'); - } - - set oncurrententrychange( - _handler: ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any) | null, - ) { - throw new Error('unimplemented'); - } - - get oncurrententrychange(): - | ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any) - | null { - throw new Error('unimplemented'); - } - - set onnavigatesuccess(_handler: ((this: Navigation, ev: Event) => any) | null) { - throw new Error('unimplemented'); - } - - get onnavigatesuccess(): ((this: Navigation, ev: Event) => any) | null { - throw new Error('unimplemented'); - } - - set onnavigateerror(_handler: ((this: Navigation, ev: ErrorEvent) => any) | null) { - throw new Error('unimplemented'); - } - - get onnavigateerror(): ((this: Navigation, ev: ErrorEvent) => any) | null { - throw new Error('unimplemented'); - } - - get transition(): NavigationTransition | null { - throw new Error('unimplemented'); - } - - updateCurrentEntry(_options: NavigationUpdateCurrentEntryOptions): void { - throw new Error('unimplemented'); - } - - reload(_options?: NavigationReloadOptions): NavigationResult { - throw new Error('unimplemented'); - } -} - -/** - * Fake equivalent of the `NavigationResult` interface with - * `FakeNavigationHistoryEntry`. - */ -interface FakeNavigationResult extends NavigationResult { - readonly committed: Promise; - readonly finished: Promise; -} - -/** - * Fake equivalent of `NavigationHistoryEntry`. - */ -export class FakeNavigationHistoryEntry implements NavigationHistoryEntry { - readonly sameDocument; - - readonly id: string; - readonly key: string; - readonly index: number; - private readonly state: unknown; - private readonly historyState: unknown; - - ondispose: ((this: NavigationHistoryEntry, ev: Event) => any) | null = null; - - constructor( - readonly url: string | null, - { - id, - key, - index, - sameDocument, - state, - historyState, - }: { - id: string; - key: string; - index: number; - sameDocument: boolean; - historyState: unknown; - state?: unknown; - }, - ) { - this.id = id; - this.key = key; - this.index = index; - this.sameDocument = sameDocument; - this.state = state; - this.historyState = historyState; - } - - getState(): unknown { - // Budget copy. - return this.state ? JSON.parse(JSON.stringify(this.state)) : this.state; - } - - getHistoryState(): unknown { - // Budget copy. - return this.historyState ? JSON.parse(JSON.stringify(this.historyState)) : this.historyState; - } - - addEventListener( - type: string, - callback: EventListenerOrEventListenerObject, - options?: AddEventListenerOptions | boolean, - ) { - throw new Error('unimplemented'); - } - - removeEventListener( - type: string, - callback: EventListenerOrEventListenerObject, - options?: EventListenerOptions | boolean, - ) { - throw new Error('unimplemented'); - } - - dispatchEvent(event: Event): boolean { - throw new Error('unimplemented'); - } -} - -/** `NavigationInterceptOptions` with experimental commit option. */ -export interface ExperimentalNavigationInterceptOptions extends NavigationInterceptOptions { - commit?: 'immediate' | 'after-transition'; -} - -/** `NavigateEvent` with experimental commit function. */ -export interface ExperimentalNavigateEvent extends NavigateEvent { - intercept(options?: ExperimentalNavigationInterceptOptions): void; - - commit(): void; -} - -/** - * Fake equivalent of `NavigateEvent`. - */ -export interface FakeNavigateEvent extends ExperimentalNavigateEvent { - readonly destination: FakeNavigationDestination; -} - -interface InternalFakeNavigateEvent extends FakeNavigateEvent { - readonly sameDocument: boolean; - readonly skipPopState?: boolean; - readonly commitOption: 'after-transition' | 'immediate'; - readonly result: InternalNavigationResult; - - commit(internal?: boolean): void; - cancel(reason: Error): void; - dispatchedNavigateEvent(): void; - userAgentNavigated(entry: FakeNavigationHistoryEntry): void; -} - -/** - * Create a fake equivalent of `NavigateEvent`. This is not a class because ES5 - * transpiled JavaScript cannot extend native Event. - */ -function createFakeNavigateEvent({ - cancelable, - canIntercept, - userInitiated, - hashChange, - navigationType, - signal, - destination, - info, - sameDocument, - skipPopState, - result, - userAgentCommit, -}: { - cancelable: boolean; - canIntercept: boolean; - userInitiated: boolean; - hashChange: boolean; - navigationType: NavigationTypeString; - signal: AbortSignal; - destination: FakeNavigationDestination; - info: unknown; - sameDocument: boolean; - skipPopState?: boolean; - result: InternalNavigationResult; - userAgentCommit: () => void; -}) { - const event = new Event('navigate', {bubbles: false, cancelable}) as { - -readonly [P in keyof InternalFakeNavigateEvent]: InternalFakeNavigateEvent[P]; - }; - event.canIntercept = canIntercept; - event.userInitiated = userInitiated; - event.hashChange = hashChange; - event.navigationType = navigationType; - event.signal = signal; - event.destination = destination; - event.info = info; - event.downloadRequest = null; - event.formData = null; - - event.sameDocument = sameDocument; - event.skipPopState = skipPopState; - event.commitOption = 'immediate'; - - let handlerFinished: Promise | undefined = undefined; - let interceptCalled = false; - let dispatchedNavigateEvent = false; - let commitCalled = false; - - event.intercept = function ( - this: InternalFakeNavigateEvent, - options?: ExperimentalNavigationInterceptOptions, - ): void { - interceptCalled = true; - event.sameDocument = true; - const handler = options?.handler; - if (handler) { - handlerFinished = handler(); - } - if (options?.commit) { - event.commitOption = options.commit; - } - if (options?.focusReset !== undefined || options?.scroll !== undefined) { - throw new Error('unimplemented'); - } - }; - - event.scroll = function (this: InternalFakeNavigateEvent): void { - throw new Error('unimplemented'); - }; - - event.commit = function (this: InternalFakeNavigateEvent, internal = false) { - if (!internal && !interceptCalled) { - throw new DOMException( - `Failed to execute 'commit' on 'NavigateEvent': intercept() must be ` + - `called before commit().`, - 'InvalidStateError', - ); - } - if (!dispatchedNavigateEvent) { - throw new DOMException( - `Failed to execute 'commit' on 'NavigateEvent': commit() may not be ` + - `called during event dispatch.`, - 'InvalidStateError', - ); - } - if (commitCalled) { - throw new DOMException( - `Failed to execute 'commit' on 'NavigateEvent': commit() already ` + `called.`, - 'InvalidStateError', - ); - } - commitCalled = true; - - userAgentCommit(); - }; - - // Internal only. - event.cancel = function (this: InternalFakeNavigateEvent, reason: Error) { - result.committedReject(reason); - result.finishedReject(reason); - }; - - // Internal only. - event.dispatchedNavigateEvent = function (this: InternalFakeNavigateEvent) { - dispatchedNavigateEvent = true; - if (event.commitOption === 'after-transition') { - // If handler finishes before commit, call commit. - handlerFinished?.then( - () => { - if (!commitCalled) { - event.commit(/* internal */ true); - } - }, - () => {}, - ); - } - Promise.all([result.committed, handlerFinished]).then( - ([entry]) => { - result.finishedResolve(entry); - }, - (reason) => { - result.finishedReject(reason); - }, - ); - }; - - // Internal only. - event.userAgentNavigated = function ( - this: InternalFakeNavigateEvent, - entry: FakeNavigationHistoryEntry, - ) { - result.committedResolve(entry); - }; - - return event as InternalFakeNavigateEvent; -} - -/** Fake equivalent of `NavigationCurrentEntryChangeEvent`. */ -export interface FakeNavigationCurrentEntryChangeEvent extends NavigationCurrentEntryChangeEvent { - readonly from: FakeNavigationHistoryEntry; -} - -/** - * Create a fake equivalent of `NavigationCurrentEntryChange`. This does not use - * a class because ES5 transpiled JavaScript cannot extend native Event. - */ -function createFakeNavigationCurrentEntryChangeEvent({ - from, - navigationType, -}: { - from: FakeNavigationHistoryEntry; - navigationType: NavigationTypeString; -}) { - const event = new Event('currententrychange', { - bubbles: false, - cancelable: false, - }) as { - -readonly [P in keyof NavigationCurrentEntryChangeEvent]: NavigationCurrentEntryChangeEvent[P]; - }; - event.from = from; - event.navigationType = navigationType; - return event as FakeNavigationCurrentEntryChangeEvent; -} - -/** - * Create a fake equivalent of `PopStateEvent`. This does not use a class - * because ES5 transpiled JavaScript cannot extend native Event. - */ -function createPopStateEvent({state}: {state: unknown}) { - const event = new Event('popstate', { - bubbles: false, - cancelable: false, - }) as {-readonly [P in keyof PopStateEvent]: PopStateEvent[P]}; - event.state = state; - return event as PopStateEvent; -} - -/** - * Fake equivalent of `NavigationDestination`. - */ -export class FakeNavigationDestination implements NavigationDestination { - readonly url: string; - readonly sameDocument: boolean; - readonly key: string | null; - readonly id: string | null; - readonly index: number; - - private readonly state?: unknown; - private readonly historyState: unknown; - - constructor({ - url, - sameDocument, - historyState, - state, - key = null, - id = null, - index = -1, - }: { - url: string; - sameDocument: boolean; - historyState: unknown; - state?: unknown; - key?: string | null; - id?: string | null; - index?: number; - }) { - this.url = url; - this.sameDocument = sameDocument; - this.state = state; - this.historyState = historyState; - this.key = key; - this.id = id; - this.index = index; - } - - getState(): unknown { - return this.state; - } - - getHistoryState(): unknown { - return this.historyState; - } -} - -/** Utility function to determine whether two UrlLike have the same hash. */ -function isHashChange(from: URL, to: URL): boolean { - return ( - to.hash !== from.hash && - to.hostname === from.hostname && - to.pathname === from.pathname && - to.search === from.search - ); -} - -/** Internal utility class for representing the result of a navigation. */ -class InternalNavigationResult { - committedResolve!: (entry: FakeNavigationHistoryEntry) => void; - committedReject!: (reason: Error) => void; - finishedResolve!: (entry: FakeNavigationHistoryEntry) => void; - finishedReject!: (reason: Error) => void; - readonly committed: Promise; - readonly finished: Promise; - get signal(): AbortSignal { - return this.abortController.signal; - } - private readonly abortController = new AbortController(); - - constructor() { - this.committed = new Promise((resolve, reject) => { - this.committedResolve = resolve; - this.committedReject = reject; - }); - - this.finished = new Promise(async (resolve, reject) => { - this.finishedResolve = resolve; - this.finishedReject = (reason: Error) => { - reject(reason); - this.abortController.abort(reason); - }; - }); - // All rejections are handled. - this.committed.catch(() => {}); - this.finished.catch(() => {}); - } -} - -/** Internal options for performing a navigate. */ -interface InternalNavigateOptions { - navigationType: NavigationTypeString; - cancelable: boolean; - canIntercept: boolean; - userInitiated: boolean; - hashChange: boolean; - info?: unknown; - skipPopState?: boolean; -} +export {ɵFakeNavigation as FakeNavigation} from '@angular/core/testing'; diff --git a/packages/common/testing/src/navigation/provide_fake_platform_navigation.ts b/packages/common/testing/src/navigation/provide_fake_platform_navigation.ts index 0ddb4fdfb8c4..b790809b8d33 100644 --- a/packages/common/testing/src/navigation/provide_fake_platform_navigation.ts +++ b/packages/common/testing/src/navigation/provide_fake_platform_navigation.ts @@ -6,11 +6,13 @@ * found in the LICENSE file at https://angular.dev/license */ -import {DOCUMENT, PlatformLocation} from '@angular/common'; +import { + DOCUMENT, + PlatformLocation, + ɵPlatformNavigation as PlatformNavigation, +} from '@angular/common'; import {inject, Provider} from '@angular/core'; -// @ng_package: ignore-cross-repo-import -import {PlatformNavigation} from '../../../src/navigation/platform_navigation'; import { FakeNavigationPlatformLocation, MOCK_PLATFORM_LOCATION_CONFIG, diff --git a/packages/common/testing/src/private_export.ts b/packages/common/testing/src/private_export.ts index 749e39149e1f..b1f4c6537758 100644 --- a/packages/common/testing/src/private_export.ts +++ b/packages/common/testing/src/private_export.ts @@ -7,3 +7,4 @@ */ export {provideFakePlatformNavigation as ɵprovideFakePlatformNavigation} from './navigation/provide_fake_platform_navigation'; +export {FakeNavigation as ɵFakeNavigation} from './navigation/fake_navigation'; diff --git a/packages/common/upgrade/src/location_shim.ts b/packages/common/upgrade/src/location_shim.ts index 479b2eca8c6d..5b6c7bb7ca33 100644 --- a/packages/common/upgrade/src/location_shim.ts +++ b/packages/common/upgrade/src/location_shim.ts @@ -179,7 +179,10 @@ export class $locationShim { } }); - // update browser + // Synchronize the browser's URL and state with the application. + // Note: There is no need to save the `$watch` return value (deregister listener) + // into a variable because `$scope.$$watchers` is automatically cleaned up when + // the root scope is destroyed. $rootScope.$watch(() => { if (this.initializing || this.updateBrowser) { this.updateBrowser = false; @@ -244,6 +247,14 @@ export class $locationShim { } this.$$replace = false; }); + + $rootScope.$on('$destroy', () => { + // Complete the subject to release all active observers when the root + // scope is destroyed. Before this change, we subscribed to the `urlChanges` + // subject, and the subscriber captured `this`, leading to a memory leak + // after the root scope was destroyed. + this.urlChanges.complete(); + }); } private resetBrowserUpdate() { diff --git a/packages/compiler-cli/linker/babel/src/ast/babel_ast_factory.ts b/packages/compiler-cli/linker/babel/src/ast/babel_ast_factory.ts index 500fff9cb4b5..ba0d3a1e9f71 100644 --- a/packages/compiler-cli/linker/babel/src/ast/babel_ast_factory.ts +++ b/packages/compiler-cli/linker/babel/src/ast/babel_ast_factory.ts @@ -165,13 +165,17 @@ export class BabelAstFactory implements AstFactory { createReturnStatement = t.returnStatement; createTaggedTemplate(tag: t.Expression, template: TemplateLiteral): t.Expression { + return t.taggedTemplateExpression(tag, this.createTemplateLiteral(template)); + } + + createTemplateLiteral(template: TemplateLiteral): t.TemplateLiteral { const elements = template.elements.map((element, i) => this.setSourceMapRange( t.templateElement(element, i === template.elements.length - 1), element.range, ), ); - return t.taggedTemplateExpression(tag, t.templateLiteral(elements, template.expressions)); + return t.templateLiteral(elements, template.expressions); } createThrowStatement = t.throwStatement; diff --git a/packages/compiler-cli/package.json b/packages/compiler-cli/package.json index 427ed896a2a2..e63a5ad6a321 100644 --- a/packages/compiler-cli/package.json +++ b/packages/compiler-cli/package.json @@ -43,7 +43,7 @@ } }, "dependencies": { - "@babel/core": "7.26.0", + "@babel/core": "7.26.9", "@jridgewell/sourcemap-codec": "^1.4.14", "reflect-metadata": "^0.2.0", "chokidar": "^4.0.0", @@ -54,7 +54,7 @@ }, "peerDependencies": { "@angular/compiler": "0.0.0-PLACEHOLDER", - "typescript": ">=5.5 <5.8" + "typescript": ">=5.5 <5.9" }, "repository": { "type": "git", diff --git a/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts b/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts index e677334d8816..c7e122845421 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts @@ -1222,14 +1222,30 @@ export class ComponentDecoratorHandler // Register all Directives and Pipes used at the top level (outside // of any defer blocks), which would be eagerly referenced. const eagerlyUsed = new Set(); - for (const dir of bound.getEagerlyUsedDirectives()) { - eagerlyUsed.add(dir.ref.node); - } - for (const name of bound.getEagerlyUsedPipes()) { - if (!pipes.has(name)) { - continue; + + if (this.enableHmr) { + // In HMR we need to preserve all the dependencies, because they have to remain consistent + // with the initially-generated code no matter what the template looks like. + for (const dep of dependencies) { + if (dep.ref.node !== node) { + eagerlyUsed.add(dep.ref.node); + } else { + const used = bound.getEagerlyUsedDirectives(); + if (used.some((current) => current.ref.node === node)) { + eagerlyUsed.add(node); + } + } + } + } else { + for (const dir of bound.getEagerlyUsedDirectives()) { + eagerlyUsed.add(dir.ref.node); + } + for (const name of bound.getEagerlyUsedPipes()) { + if (!pipes.has(name)) { + continue; + } + eagerlyUsed.add(pipes.get(name)!.ref.node); } - eagerlyUsed.add(pipes.get(name)!.ref.node); } // Set of Directives and Pipes used across the entire template, @@ -1643,6 +1659,7 @@ export class ComponentDecoratorHandler ? extractHmrMetatadata( node, this.reflector, + this.evaluator, this.compilerHost, this.rootDirs, def, @@ -1709,6 +1726,7 @@ export class ComponentDecoratorHandler ? extractHmrMetatadata( node, this.reflector, + this.evaluator, this.compilerHost, this.rootDirs, def, @@ -1771,6 +1789,7 @@ export class ComponentDecoratorHandler ? extractHmrMetatadata( node, this.reflector, + this.evaluator, this.compilerHost, this.rootDirs, def, @@ -1827,6 +1846,7 @@ export class ComponentDecoratorHandler ? extractHmrMetatadata( node, this.reflector, + this.evaluator, this.compilerHost, this.rootDirs, def, @@ -1868,22 +1888,32 @@ export class ComponentDecoratorHandler private resolveAllDeferredDependencies( resolution: Readonly, ): R3DeferPerComponentDependency[] { + const seenDeps = new Set(); const deferrableTypes: R3DeferPerComponentDependency[] = []; // Go over all dependencies of all defer blocks and update the value of // the `isDeferrable` flag and the `importPath` to reflect the current // state after visiting all components during the `resolve` phase. for (const [_, deps] of resolution.deferPerBlockDependencies) { for (const deferBlockDep of deps) { - const importDecl = - resolution.deferrableDeclToImportDecl.get(deferBlockDep.declaration.node) ?? null; + const node = deferBlockDep.declaration.node; + const importDecl = resolution.deferrableDeclToImportDecl.get(node) ?? null; if (importDecl !== null && this.deferredSymbolTracker.canDefer(importDecl)) { deferBlockDep.isDeferrable = true; deferBlockDep.importPath = (importDecl.moduleSpecifier as ts.StringLiteral).text; deferBlockDep.isDefaultImport = isDefaultImport(importDecl); - deferrableTypes.push(deferBlockDep as R3DeferPerComponentDependency); + + // The same dependency may be used across multiple deferred blocks. De-duplicate it + // because it can throw off other logic further down the compilation pipeline. + // Note that the logic above needs to run even if the dependency is seen before, + // because the object literals are different between each block. + if (!seenDeps.has(node)) { + seenDeps.add(node); + deferrableTypes.push(deferBlockDep as R3DeferPerComponentDependency); + } } } } + return deferrableTypes; } diff --git a/packages/compiler-cli/src/ngtsc/core/src/host.ts b/packages/compiler-cli/src/ngtsc/core/src/host.ts index 6b3f8f67cd45..2f4feb1cd280 100644 --- a/packages/compiler-cli/src/ngtsc/core/src/host.ts +++ b/packages/compiler-cli/src/ngtsc/core/src/host.ts @@ -121,7 +121,7 @@ export class DelegatingCompilerHost ): ExtendedTsCompilerHost[M] { return this.delegate[name] !== undefined ? (this.delegate[name] as any).bind(this.delegate) - : undefined; + : undefined!; } } diff --git a/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts b/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts index 0240f4d65c60..a5013d246f95 100644 --- a/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts +++ b/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts @@ -273,7 +273,7 @@ export enum ErrorCode { * The left-hand side of an assignment expression was a template variable. Effectively, the * template looked like: * - * ``` + * ```html * * * diff --git a/packages/compiler-cli/src/ngtsc/hmr/BUILD.bazel b/packages/compiler-cli/src/ngtsc/hmr/BUILD.bazel index 5e2781478862..4eedd865328a 100644 --- a/packages/compiler-cli/src/ngtsc/hmr/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/hmr/BUILD.bazel @@ -9,6 +9,7 @@ ts_library( ]), deps = [ "//packages/compiler", + "//packages/compiler-cli/src/ngtsc/partial_evaluator", "//packages/compiler-cli/src/ngtsc/reflection", "//packages/compiler-cli/src/ngtsc/transform", "//packages/compiler-cli/src/ngtsc/translator", diff --git a/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts b/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts index 0d8df658f4b1..9b17865598aa 100644 --- a/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts +++ b/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts @@ -13,9 +13,10 @@ import { R3HmrNamespaceDependency, outputAst as o, } from '@angular/compiler'; -import {DeclarationNode} from '../../reflection'; +import {DeclarationNode, ReflectionHost} from '../../reflection'; import {CompileResult} from '../../transform'; import ts from 'typescript'; +import {EnumValue, PartialEvaluator} from '../../partial_evaluator'; /** * Determines the file-level dependencies that the HMR initializer needs to capture and pass along. @@ -33,7 +34,12 @@ export function extractHmrDependencies( deferBlockMetadata: R3ComponentDeferMetadata, classMetadata: o.Statement | null, debugInfo: o.Statement | null, -): {local: string[]; external: R3HmrNamespaceDependency[]} { + reflection: ReflectionHost, + evaluator: PartialEvaluator, +): { + local: {name: string; runtimeRepresentation: o.Expression}[]; + external: R3HmrNamespaceDependency[]; +} | null { const name = ts.isClassDeclaration(node) && node.name ? node.name.text : null; const visitor = new PotentialTopLevelReadsVisitor(); const sourceFile = node.getSourceFile(); @@ -57,9 +63,26 @@ export function extractHmrDependencies( // variables inside of functions. Note that we filter out the class name since it is always // defined and it saves us having to repeat this logic wherever the locals are consumed. const availableTopLevel = getTopLevelDeclarationNames(sourceFile); + const local: {name: string; runtimeRepresentation: o.Expression}[] = []; + const seenLocals = new Set(); + + for (const readNode of visitor.allReads) { + const readName = readNode instanceof o.ReadVarExpr ? readNode.name : readNode.text; + + if (readName !== name && !seenLocals.has(readName) && availableTopLevel.has(readName)) { + const runtimeRepresentation = getRuntimeRepresentation(readNode, reflection, evaluator); + + if (runtimeRepresentation === null) { + return null; + } + + local.push({name: readName, runtimeRepresentation}); + seenLocals.add(readName); + } + } return { - local: Array.from(visitor.allReads).filter((r) => r !== name && availableTopLevel.has(r)), + local, external: Array.from(visitor.namespaceReads, (name, index) => ({ moduleName: name, assignedName: `ɵhmr${index}`, @@ -67,6 +90,54 @@ export function extractHmrDependencies( }; } +/** + * Gets a node that can be used to represent an identifier in the HMR replacement code at runtime. + */ +function getRuntimeRepresentation( + node: o.ReadVarExpr | ts.Identifier, + reflection: ReflectionHost, + evaluator: PartialEvaluator, +): o.Expression | null { + if (node instanceof o.ReadVarExpr) { + return o.variable(node.name); + } + + // Const enums can't be passed by reference, because their values are inlined. + // Pass in an object literal with all of the values instead. + if (isConstEnumReference(node, reflection)) { + const evaluated = evaluator.evaluate(node); + + if (evaluated instanceof Map) { + const members: {key: string; quoted: boolean; value: o.Expression}[] = []; + + for (const [name, value] of evaluated.entries()) { + if ( + value instanceof EnumValue && + (value.resolved == null || + typeof value.resolved === 'string' || + typeof value.resolved === 'boolean' || + typeof value.resolved === 'number') + ) { + members.push({ + key: name, + quoted: false, + value: o.literal(value.resolved), + }); + } else { + // TS is pretty restrictive about what values can be in a const enum so our evaluator + // should be able to handle them, however if we happen to hit such a case, we return null + // so the HMR update can be invalidated. + return null; + } + } + + return o.literalMap(members); + } + } + + return o.variable(node.text); +} + /** * Gets the names of all top-level declarations within the file (imports, declared classes etc). * @param sourceFile File in which to search for locals. @@ -81,8 +152,7 @@ function getTopLevelDeclarationNames(sourceFile: ts.SourceFile): Set { if ( ts.isClassDeclaration(node) || ts.isFunctionDeclaration(node) || - (ts.isEnumDeclaration(node) && - !node.modifiers?.some((m) => m.kind === ts.SyntaxKind.ConstKeyword)) + ts.isEnumDeclaration(node) ) { if (node.name) { results.add(node.name.text); @@ -157,7 +227,7 @@ function trackBindingName(node: ts.BindingName, results: Set): void { * inside functions. */ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { - readonly allReads = new Set(); + readonly allReads = new Set(); readonly namespaceReads = new Set(); override visitExternalExpr(ast: o.ExternalExpr, context: any) { @@ -168,7 +238,7 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { } override visitReadVarExpr(ast: o.ReadVarExpr, context: any) { - this.allReads.add(ast.name); + this.allReads.add(ast); super.visitReadVarExpr(ast, context); } @@ -186,7 +256,7 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { */ private addAllTopLevelIdentifiers = (node: ts.Node) => { if (ts.isIdentifier(node) && this.isTopLevelIdentifierReference(node)) { - this.allReads.add(node.text); + this.allReads.add(node); } else { ts.forEachChild(node, this.addAllTopLevelIdentifiers); } @@ -196,10 +266,11 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { * TypeScript identifiers are used both when referring to a variable (e.g. `console.log(foo)`) * and for names (e.g. `{foo: 123}`). This function determines if the identifier is a top-level * variable read, rather than a nested name. - * @param node Identifier to check. + * @param identifier Identifier to check. */ - private isTopLevelIdentifierReference(node: ts.Identifier): boolean { - const parent = node.parent; + private isTopLevelIdentifierReference(identifier: ts.Identifier): boolean { + let node = identifier as ts.Expression; + let parent = node.parent; // The parent might be undefined for a synthetic node or if `setParentNodes` is set to false // when the SourceFile was created. We can account for such cases using the type checker, at @@ -209,11 +280,17 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { return false; } + // Unwrap parenthesized identifiers, but use the closest parenthesized expression + // as the reference node so that we can check cases like `{prop: ((value))}`. + if (ts.isParenthesizedExpression(parent) && parent.expression === node) { + while (parent && ts.isParenthesizedExpression(parent)) { + node = parent; + parent = parent.parent; + } + } + // Identifier referenced at the top level. Unlikely. - if ( - ts.isSourceFile(parent) || - (ts.isExpressionStatement(parent) && parent.expression === node) - ) { + if (ts.isSourceFile(parent)) { return true; } @@ -225,6 +302,7 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { // Identifier used in a nested expression is only top-level if it's the actual expression. if ( + ts.isExpressionStatement(parent) || ts.isPropertyAccessExpression(parent) || ts.isComputedPropertyName(parent) || ts.isTemplateSpan(parent) || @@ -235,11 +313,10 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { ts.isIfStatement(parent) || ts.isDoStatement(parent) || ts.isWhileStatement(parent) || - ts.isForInStatement(parent) || - ts.isForOfStatement(parent) || ts.isSwitchStatement(parent) || ts.isCaseClause(parent) || - ts.isThrowStatement(parent) + ts.isThrowStatement(parent) || + ts.isNewExpression(parent) ) { return parent.expression === node; } @@ -249,17 +326,28 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { return parent.elements.includes(node); } - // Identifier in a property assignment is only top level if it's the initializer. - if (ts.isPropertyAssignment(parent)) { + // If the parent is an initialized node, the identifier is + // at the top level if it's the initializer itself. + if ( + ts.isPropertyAssignment(parent) || + ts.isParameter(parent) || + ts.isBindingElement(parent) || + ts.isPropertyDeclaration(parent) || + ts.isEnumMember(parent) + ) { return parent.initializer === node; } + // Identifier in a function is top level if it's either the name or the initializer. + if (ts.isVariableDeclaration(parent)) { + return parent.name === node || parent.initializer === node; + } + // Identifier in a declaration is only top level if it's the name. // In shorthand assignments the name is also the value. if ( ts.isClassDeclaration(parent) || ts.isFunctionDeclaration(parent) || - ts.isVariableDeclaration(parent) || ts.isShorthandPropertyAssignment(parent) ) { return parent.name === node; @@ -273,12 +361,30 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { return parent.left === node || parent.right === node; } + if (ts.isForInStatement(parent) || ts.isForOfStatement(parent)) { + return parent.expression === node || parent.initializer === node; + } + + if (ts.isForStatement(parent)) { + return ( + parent.condition === node || parent.initializer === node || parent.incrementor === node + ); + } + + if (ts.isArrowFunction(parent)) { + return parent.body === node; + } + // It's unlikely that we'll run into imports/exports in this use case. // We handle them since it's simple and for completeness' sake. if (ts.isImportSpecifier(parent) || ts.isExportSpecifier(parent)) { return (parent.propertyName || parent.name) === node; } + if (ts.isConditionalExpression(parent)) { + return parent.condition === node || parent.whenFalse === node || parent.whenTrue === node; + } + // Otherwise it's not top-level. return false; } @@ -290,3 +396,25 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { return !!value && typeof value.kind === 'number'; } } + +/** Checks whether a node is a reference to a const enum. */ +function isConstEnumReference(node: ts.Identifier, reflection: ReflectionHost): boolean { + const parent = node.parent; + + // Only check identifiers that are in the form of `Foo.bar` where `Foo` is the node being checked. + if ( + !parent || + !ts.isPropertyAccessExpression(parent) || + parent.expression !== node || + !ts.isIdentifier(parent.name) + ) { + return false; + } + + const declaration = reflection.getDeclarationOfIdentifier(node); + return ( + declaration !== null && + ts.isEnumDeclaration(declaration.node) && + !!declaration.node.modifiers?.some((m) => m.kind === ts.SyntaxKind.ConstKeyword) + ); +} diff --git a/packages/compiler-cli/src/ngtsc/hmr/src/metadata.ts b/packages/compiler-cli/src/ngtsc/hmr/src/metadata.ts index 4c7f4d73feae..fde5817b9269 100644 --- a/packages/compiler-cli/src/ngtsc/hmr/src/metadata.ts +++ b/packages/compiler-cli/src/ngtsc/hmr/src/metadata.ts @@ -17,6 +17,7 @@ import {getProjectRelativePath} from '../../util/src/path'; import {CompileResult} from '../../transform'; import {extractHmrDependencies} from './extract_dependencies'; import ts from 'typescript'; +import {PartialEvaluator} from '../../partial_evaluator'; /** * Extracts the HMR metadata for a class declaration. @@ -33,6 +34,7 @@ import ts from 'typescript'; export function extractHmrMetatadata( clazz: DeclarationNode, reflection: ReflectionHost, + evaluator: PartialEvaluator, compilerHost: Pick, rootDirs: readonly string[], definition: R3CompiledExpression, @@ -57,7 +59,14 @@ export function extractHmrMetatadata( deferBlockMetadata, classMetadata, debugInfo, + reflection, + evaluator, ); + + if (dependencies === null) { + return null; + } + const meta: R3HmrMetadata = { type: new o.WrappedNodeExpr(clazz.name), className: clazz.name.text, diff --git a/packages/compiler-cli/src/ngtsc/imports/src/default.ts b/packages/compiler-cli/src/ngtsc/imports/src/default.ts index 2f3b7a9c60c9..d1554a7c6106 100644 --- a/packages/compiler-cli/src/ngtsc/imports/src/default.ts +++ b/packages/compiler-cli/src/ngtsc/imports/src/default.ts @@ -109,7 +109,7 @@ export class DefaultImportTracker { if (clausesToPreserve === null) { clausesToPreserve = loadIsReferencedAliasDeclarationPatch(context); } - clausesToPreserve.add(clause); + clausesToPreserve?.add(clause); } } diff --git a/packages/compiler-cli/src/ngtsc/imports/src/patch_alias_reference_resolution.ts b/packages/compiler-cli/src/ngtsc/imports/src/patch_alias_reference_resolution.ts index ccac9b8d453a..fbefa2b084ad 100644 --- a/packages/compiler-cli/src/ngtsc/imports/src/patch_alias_reference_resolution.ts +++ b/packages/compiler-cli/src/ngtsc/imports/src/patch_alias_reference_resolution.ts @@ -17,7 +17,7 @@ export type AliasImportDeclaration = ts.ImportSpecifier | ts.NamespaceImport | t * that as public API: https://github.com/microsoft/TypeScript/issues/17516. */ interface TransformationContextWithResolver extends ts.TransformationContext { - getEmitResolver: () => EmitResolver; + getEmitResolver: () => EmitResolver | undefined; } const patchedReferencedAliasesSymbol = Symbol('patchedReferencedAliases'); @@ -70,19 +70,29 @@ interface EmitResolver { * that have been referenced in a value-position by the transform, such the installed patch can * ensure that those import declarations are not elided. * + * If `null` is returned then the transform operates in an isolated context, i.e. using the + * `ts.transform` API. In such scenario there is no information whether an alias declaration + * is referenced, so all alias declarations are naturally preserved and explicitly registering + * an alias declaration as used isn't necessary. + * * See below. Note that this uses sourcegraph as the TypeScript checker file doesn't display on * Github. * https://sourcegraph.com/github.com/microsoft/TypeScript@3eaa7c65f6f076a08a5f7f1946fd0df7c7430259/-/blob/src/compiler/checker.ts#L31219-31257 */ export function loadIsReferencedAliasDeclarationPatch( context: ts.TransformationContext, -): Set { +): Set | null { // If the `getEmitResolver` method is not available, TS most likely changed the // internal structure of the transformation context. We will abort gracefully. if (!isTransformationContextWithEmitResolver(context)) { throwIncompatibleTransformationContextError(); } const emitResolver = context.getEmitResolver(); + if (emitResolver === undefined) { + // In isolated `ts.transform` operations no emit resolver is present, return null as `isReferencedAliasDeclaration` + // will never be invoked. + return null; + } // The emit resolver may have been patched already, in which case we return the set of referenced // aliases that was created when the patch was first applied. diff --git a/packages/compiler-cli/src/ngtsc/imports/test/default_spec.ts b/packages/compiler-cli/src/ngtsc/imports/test/default_spec.ts index 395d60d371bc..5693ff5260fb 100644 --- a/packages/compiler-cli/src/ngtsc/imports/test/default_spec.ts +++ b/packages/compiler-cli/src/ngtsc/imports/test/default_spec.ts @@ -82,6 +82,50 @@ runInEachFileSystem(() => { expect(testContents).toContain(`var dep_1 = require("./dep");`); expect(testContents).toContain(`var ref = dep_1.default;`); }); + + it('should prevent a default import from being elided if used in an isolated transform', () => { + const {program} = makeProgram( + [ + {name: _('/dep.ts'), contents: `export default class Foo {}`}, + { + name: _('/test.ts'), + contents: `import Foo from './dep'; export function test(f: Foo) {}`, + }, + + // This control file is identical to the test file, but will not have its import marked + // for preservation. It exists to capture the behavior without the DefaultImportTracker's + // emit modifications. + { + name: _('/ctrl.ts'), + contents: `import Foo from './dep'; export function test(f: Foo) {}`, + }, + ], + { + module: ts.ModuleKind.ES2015, + }, + ); + const fooClause = getDeclaration(program, _('/test.ts'), 'Foo', ts.isImportClause); + const fooDecl = fooClause.parent as ts.ImportDeclaration; + + const tracker = new DefaultImportTracker(); + tracker.recordUsedImport(fooDecl); + + const result = ts.transform( + [program.getSourceFile(_('/test.ts'))!, program.getSourceFile(_('/ctrl.ts'))!], + [tracker.importPreservingTransformer()], + ); + expect(result.diagnostics?.length ?? 0).toBe(0); + expect(result.transformed.length).toBe(2); + + const printer = ts.createPrinter({newLine: ts.NewLineKind.LineFeed}); + + const testOutput = printer.printFile(result.transformed[0]); + expect(testOutput).toContain(`import Foo from './dep';`); + + // In an isolated transform, TypeScript also retains the default import. + const ctrlOutput = printer.printFile(result.transformed[1]); + expect(ctrlOutput).toContain(`import Foo from './dep';`); + }); }); function addReferenceTransformer(id: ts.Identifier): ts.TransformerFactory { diff --git a/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts b/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts index 1374eda6e863..b80fb05d4362 100644 --- a/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts +++ b/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts @@ -314,10 +314,10 @@ export class StaticInterpreter { private visitEnumDeclaration(node: ts.EnumDeclaration, context: Context): ResolvedValue { const enumRef = this.getReference(node, context); const map = new Map(); - node.members.forEach((member) => { + node.members.forEach((member, index) => { const name = this.stringNameFromPropertyName(member.name, context); if (name !== undefined) { - const resolved = member.initializer && this.visit(member.initializer, context); + const resolved = member.initializer ? this.visit(member.initializer, context) : index; map.set(name, new EnumValue(enumRef, name, resolved)); } }); diff --git a/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts b/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts index 9c5ecea834d8..53627de2d354 100644 --- a/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts +++ b/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts @@ -638,6 +638,7 @@ runInEachFileSystem(() => { } expect((result.enumRef.node as ts.EnumDeclaration).name.text).toBe('Foo'); expect(result.name).toBe('B'); + expect(result.resolved).toBe(1); }); it('variable declaration resolution works', () => { diff --git a/packages/compiler-cli/src/ngtsc/program_driver/src/ts_create_program_driver.ts b/packages/compiler-cli/src/ngtsc/program_driver/src/ts_create_program_driver.ts index f67d5c9d8e70..319c7d6a4580 100644 --- a/packages/compiler-cli/src/ngtsc/program_driver/src/ts_create_program_driver.ts +++ b/packages/compiler-cli/src/ngtsc/program_driver/src/ts_create_program_driver.ts @@ -100,7 +100,7 @@ export class DelegatingCompilerHost private delegateMethod(name: M): ts.CompilerHost[M] { return this.delegate[name] !== undefined ? (this.delegate[name] as any).bind(this.delegate) - : undefined; + : undefined!; } } diff --git a/packages/compiler-cli/src/ngtsc/reflection/src/host.ts b/packages/compiler-cli/src/ngtsc/reflection/src/host.ts index 9a13d26ff367..e3e02e09f145 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/src/host.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/src/host.ts @@ -153,7 +153,7 @@ export interface ClassMember { * * For example, the TS code: * - * ``` + * ```ts * class Clazz { * static get property(): string { * return 'value'; @@ -163,7 +163,7 @@ export interface ClassMember { * * Downlevels to: * - * ``` + * ```ts * var Clazz = (function () { * function Clazz() { * } @@ -182,7 +182,7 @@ export interface ClassMember { * Object.defineProperty ExpressionStatement, but the implementation would be this * FunctionDeclaration: * - * ``` + * ```ts * function () { * return 'value'; * }, @@ -624,7 +624,7 @@ export interface ReflectionHost { * If the declaration is in a different module, and that module is imported via an absolute path, * this method also returns the absolute path of the imported module. For example, if the code is: * - * ``` + * ```ts * import {RouterModule} from '@angular/core'; * * export const ROUTES = RouterModule.forRoot([...]); diff --git a/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts b/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts index 25034bb62016..afc16a40ce13 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts @@ -319,13 +319,13 @@ export class TypeScriptReflectionHost implements ReflectionHost { * * For example, if the identifier is the `Directive` part of a qualified type chain like: * - * ``` + * ```ts * core.Directive * ``` * * then it might be that `core` is a namespace import such as: * - * ``` + * ```ts * import * as core from 'tslib'; * ``` * diff --git a/packages/compiler-cli/src/ngtsc/transform/jit/src/downlevel_decorators_transform.ts b/packages/compiler-cli/src/ngtsc/transform/jit/src/downlevel_decorators_transform.ts index 4dc3ff12ded5..e47c18da29d2 100644 --- a/packages/compiler-cli/src/ngtsc/transform/jit/src/downlevel_decorators_transform.ts +++ b/packages/compiler-cli/src/ngtsc/transform/jit/src/downlevel_decorators_transform.ts @@ -378,7 +378,7 @@ export function getDownlevelDecoratorsTransform( // ensure that the alias declaration is not elided by TypeScript, and use its // name identifier to reference it at runtime. if (isAliasImportDeclaration(decl)) { - referencedParameterTypes.add(decl); + referencedParameterTypes?.add(decl); // If the entity name resolves to an alias import declaration, we reference the // entity based on the alias import name. This ensures that TypeScript properly // resolves the link to the import. Cloning the original entity name identifier diff --git a/packages/compiler-cli/src/ngtsc/transform/jit/test/downlevel_decorators_transform_spec.ts b/packages/compiler-cli/src/ngtsc/transform/jit/test/downlevel_decorators_transform_spec.ts index 8ed7c153e0da..f2e853f2f1c5 100644 --- a/packages/compiler-cli/src/ngtsc/transform/jit/test/downlevel_decorators_transform_spec.ts +++ b/packages/compiler-cli/src/ngtsc/transform/jit/test/downlevel_decorators_transform_spec.ts @@ -872,38 +872,81 @@ describe('downlevel decorator transform', () => { ); expect(written).toBe(numberOfTestFiles); }); + }); - function createProgramWithTransform(files: string[]) { - const program = ts.createProgram( - files, - { - moduleResolution: ts.ModuleResolutionKind.Node10, - importHelpers: true, - lib: [], - module: ts.ModuleKind.ESNext, - target: ts.ScriptTarget.Latest, - declaration: false, - experimentalDecorators: true, - emitDecoratorMetadata: false, - }, - host, - ); - const typeChecker = program.getTypeChecker(); - const reflectionHost = new TypeScriptReflectionHost(typeChecker); - const transformers: ts.CustomTransformers = { - before: [ - getDownlevelDecoratorsTransform( - program.getTypeChecker(), - reflectionHost, - diagnostics, - /* isCore */ false, - isClosureEnabled, - ), - ], - }; - return {program, transformers}; - } + it('should work using an isolated transform operation', () => { + context.writeFile( + 'foo_service.d.ts', + ` + export declare class Foo {}; + `, + ); + context.writeFile( + 'foo.ts', + ` + import {Injectable} from '@angular/core'; + import {Foo} from './foo_service'; + + @Injectable() + export class MyService { + constructor(foo: Foo) {} + } + `, + ); + + const {program, transformers} = createProgramWithTransform(['/foo.ts', '/foo_service.d.ts']); + const result = ts.transform(program.getSourceFile('/foo.ts')!, [ + ...(transformers.before ?? []), + ...(transformers.after ?? []), + ] as ts.TransformerFactory[]); + expect(result.diagnostics?.length ?? 0).toBe(0); + expect(result.transformed.length).toBe(1); + + const printer = ts.createPrinter({newLine: ts.NewLineKind.LineFeed}); + const output = printer.printFile(result.transformed[0]); + expect(omitLeadingWhitespace(output)).toEqual(dedent` + import { Injectable } from '@angular/core'; + import { Foo } from './foo_service'; + @Injectable() + export class MyService { + constructor(foo: Foo) { } + static ctorParameters = () => [ + { type: Foo } + ]; + } + `); }); + + function createProgramWithTransform(files: string[]) { + const program = ts.createProgram( + files, + { + moduleResolution: ts.ModuleResolutionKind.Node10, + importHelpers: true, + lib: [], + module: ts.ModuleKind.ESNext, + target: ts.ScriptTarget.Latest, + declaration: false, + experimentalDecorators: true, + emitDecoratorMetadata: false, + }, + host, + ); + const typeChecker = program.getTypeChecker(); + const reflectionHost = new TypeScriptReflectionHost(typeChecker); + const transformers: ts.CustomTransformers = { + before: [ + getDownlevelDecoratorsTransform( + program.getTypeChecker(), + reflectionHost, + diagnostics, + /* isCore */ false, + isClosureEnabled, + ), + ], + }; + return {program, transformers}; + } }); /** Template string function that can be used to dedent a given string literal. */ diff --git a/packages/compiler-cli/src/ngtsc/translator/src/api/ast_factory.ts b/packages/compiler-cli/src/ngtsc/translator/src/api/ast_factory.ts index 5593c11e6db6..ecbdd64f0a2d 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/api/ast_factory.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/api/ast_factory.ts @@ -217,6 +217,18 @@ export interface AstFactory { */ createTaggedTemplate(tag: TExpression, template: TemplateLiteral): TExpression; + /** + * Create an untagged template literal + * + * ``` + * `str1${expr1}str2${expr2}str3` + * ``` + * + * @param template the collection of strings and expressions that constitute an interpolated + * template literal. + */ + createTemplateLiteral(template: TemplateLiteral): TExpression; + /** * Create a throw statement (e.g. `throw expr;`). * diff --git a/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_typescript_transform.ts b/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_typescript_transform.ts index 7fbe38b548b3..8ea733c8e6b6 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_typescript_transform.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_typescript_transform.ts @@ -37,9 +37,11 @@ export function createTsTransformForImportManager( // doesn't drop these thinking they are unused. if (reusedOriginalAliasDeclarations.size > 0) { const referencedAliasDeclarations = loadIsReferencedAliasDeclarationPatch(ctx); - reusedOriginalAliasDeclarations.forEach((aliasDecl) => - referencedAliasDeclarations.add(aliasDecl), - ); + if (referencedAliasDeclarations !== null) { + reusedOriginalAliasDeclarations.forEach((aliasDecl) => + referencedAliasDeclarations.add(aliasDecl), + ); + } } // Update the set of affected files to include files that need extra statements to be inserted. diff --git a/packages/compiler-cli/src/ngtsc/translator/src/translator.ts b/packages/compiler-cli/src/ngtsc/translator/src/translator.ts index 108fb252dce2..365970acafdd 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/translator.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/translator.ts @@ -182,18 +182,19 @@ export class ExpressionTranslatorVisitor ); } - visitTaggedTemplateExpr(ast: o.TaggedTemplateExpr, context: Context): TExpression { + visitTaggedTemplateLiteralExpr(ast: o.TaggedTemplateLiteralExpr, context: Context): TExpression { return this.setSourceMapRange( - this.createTaggedTemplateExpression(ast.tag.visitExpression(this, context), { - elements: ast.template.elements.map((e) => - createTemplateElement({ - cooked: e.text, - raw: e.rawText, - range: e.sourceSpan ?? ast.sourceSpan, - }), - ), - expressions: ast.template.expressions.map((e) => e.visitExpression(this, context)), - }), + this.createTaggedTemplateExpression( + ast.tag.visitExpression(this, context), + this.getTemplateLiteralFromAst(ast.template, context), + ), + ast.sourceSpan, + ); + } + + visitTemplateLiteralExpr(ast: o.TemplateLiteralExpr, context: Context): TExpression { + return this.setSourceMapRange( + this.factory.createTemplateLiteral(this.getTemplateLiteralFromAst(ast, context)), ast.sourceSpan, ); } @@ -433,6 +434,10 @@ export class ExpressionTranslatorVisitor throw new Error('Method not implemented.'); } + visitTemplateLiteralElementExpr(ast: o.TemplateLiteralElementExpr, context: any) { + throw new Error('Method not implemented'); + } + visitWrappedNodeExpr(ast: o.WrappedNodeExpr, _context: Context): any { this.recordWrappedNode(ast); return ast.node; @@ -474,6 +479,22 @@ export class ExpressionTranslatorVisitor } return statement; } + + private getTemplateLiteralFromAst( + ast: o.TemplateLiteralExpr, + context: Context, + ): TemplateLiteral { + return { + elements: ast.elements.map((e) => + createTemplateElement({ + cooked: e.text, + raw: e.rawText, + range: e.sourceSpan ?? ast.sourceSpan, + }), + ), + expressions: ast.expressions.map((e) => e.visitExpression(this, context)), + }; + } } /** diff --git a/packages/compiler-cli/src/ngtsc/translator/src/type_translator.ts b/packages/compiler-cli/src/ngtsc/translator/src/type_translator.ts index ae630ea46499..2e5416e3a441 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/type_translator.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/type_translator.ts @@ -139,7 +139,15 @@ class TypeTranslatorVisitor implements o.ExpressionVisitor, o.TypeVisitor { throw new Error('Method not implemented.'); } - visitTaggedTemplateExpr(ast: o.TaggedTemplateExpr, context: Context): never { + visitTaggedTemplateLiteralExpr(ast: o.TaggedTemplateLiteralExpr, context: Context): never { + throw new Error('Method not implemented.'); + } + + visitTemplateLiteralExpr(ast: o.TemplateLiteralExpr, context: any) { + throw new Error('Method not implemented.'); + } + + visitTemplateLiteralElementExpr(ast: o.TemplateLiteralElementExpr, context: any) { throw new Error('Method not implemented.'); } diff --git a/packages/compiler-cli/src/ngtsc/translator/src/typescript_ast_factory.ts b/packages/compiler-cli/src/ngtsc/translator/src/typescript_ast_factory.ts index a6781c3b0d0c..4ec995a82fc3 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/typescript_ast_factory.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/typescript_ast_factory.ts @@ -243,6 +243,14 @@ export class TypeScriptAstFactory implements AstFactory, ): ts.Expression { + return ts.factory.createTaggedTemplateExpression( + tag, + undefined, + this.createTemplateLiteral(template), + ); + } + + createTemplateLiteral(template: TemplateLiteral): ts.TemplateLiteral { let templateLiteral: ts.TemplateLiteral; const length = template.elements.length; const head = template.elements[0]; @@ -276,7 +284,7 @@ export class TypeScriptAstFactory implements AstFactory { `), ); }); + + it('should work when using an isolated transform', () => { + const {testFile} = createTestProgram('import { input } from "@angular/core";'); + const manager = new ImportManager(); + const ref = manager.addImport({ + exportModuleSpecifier: '@angular/core', + exportSymbolName: 'input', + requestedFile: testFile, + }); + + const extraStatements = [ts.factory.createExpressionStatement(ref)]; + const transformer = manager.toTsTransform(new Map([[testFile.fileName, extraStatements]])); + + const result = ts.transform(testFile, [transformer]); + expect(result.diagnostics?.length ?? 0).toBe(0); + expect(result.transformed.length).toBe(1); + + const printer = ts.createPrinter({newLine: ts.NewLineKind.LineFeed}); + const output = printer.printFile(result.transformed[0]); + expect(output).toBe( + omitLeadingWhitespace(` + import { input } from "@angular/core"; + input; + `), + ); + }); }); function createTestProgram(text: string): { diff --git a/packages/compiler-cli/src/ngtsc/typecheck/api/symbols.ts b/packages/compiler-cli/src/ngtsc/typecheck/api/symbols.ts index 7dc284733cba..935518f5cf31 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/api/symbols.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/api/symbols.ts @@ -190,7 +190,7 @@ export interface ReferenceSymbol { /** * The location in the shim file of a variable that holds the type of the local ref. * For example, a reference declaration like the following: - * ``` + * ```ts * var _t1 = document.createElement('div'); * var _t2 = _t1; // This is the reference declaration * ``` diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts index 5cb45e946b00..51cf10c9a38f 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts @@ -19,6 +19,7 @@ import {factory as suffixNotSupportedFactory} from './checks/suffix_not_supporte import {factory as textAttributeNotBindingFactory} from './checks/text_attribute_not_binding'; import {factory as uninvokedFunctionInEventBindingFactory} from './checks/uninvoked_function_in_event_binding'; import {factory as unusedLetDeclarationFactory} from './checks/unused_let_declaration'; +import {factory as skipHydrationNotStaticFactory} from './checks/skip_hydration_not_static'; export {ExtendedTemplateCheckerImpl} from './src/extended_template_checker'; @@ -36,6 +37,7 @@ export const ALL_DIAGNOSTIC_FACTORIES: readonly TemplateCheckFactory< interpolatedSignalNotInvoked, uninvokedFunctionInEventBindingFactory, unusedLetDeclarationFactory, + skipHydrationNotStaticFactory, ]; export const SUPPORTED_DIAGNOSTIC_NAMES = new Set([ diff --git a/packages/compiler-cli/src/ngtsc/typecheck/src/expression.ts b/packages/compiler-cli/src/ngtsc/typecheck/src/expression.ts index f6ebcde33b35..87e08a8b21fb 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/src/expression.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/src/expression.ts @@ -33,6 +33,8 @@ import { SafePropertyRead, ThisReceiver, Unary, + TemplateLiteral, + TemplateLiteralElement, } from '@angular/compiler'; import ts from 'typescript'; @@ -276,7 +278,7 @@ class AstTranslator implements AstVisitor { return node; } - visitTypeofExpresion(ast: TypeofExpression): ts.Expression { + visitTypeofExpression(ast: TypeofExpression): ts.Expression { const expression = wrapForDiagnostics(this.translate(ast.expression)); const node = ts.factory.createTypeOfExpression(expression); addParseSpanInfo(node, ast.sourceSpan); @@ -445,6 +447,34 @@ class AstTranslator implements AstVisitor { return node; } + visitTemplateLiteral(ast: TemplateLiteral): ts.TemplateLiteral { + const length = ast.elements.length; + const head = ast.elements[0]; + let result: ts.TemplateLiteral; + + if (length === 1) { + result = ts.factory.createNoSubstitutionTemplateLiteral(head.text); + } else { + const spans: ts.TemplateSpan[] = []; + const tailIndex = length - 1; + + for (let i = 1; i < tailIndex; i++) { + const middle = ts.factory.createTemplateMiddle(ast.elements[i].text); + spans.push(ts.factory.createTemplateSpan(this.translate(ast.expressions[i - 1]), middle)); + } + const resolvedExpression = this.translate(ast.expressions[tailIndex - 1]); + const templateTail = ts.factory.createTemplateTail(ast.elements[tailIndex].text); + spans.push(ts.factory.createTemplateSpan(resolvedExpression, templateTail)); + result = ts.factory.createTemplateExpression(ts.factory.createTemplateHead(head.text), spans); + } + + return result; + } + + visitTemplateLiteralElement(ast: TemplateLiteralElement, context: any) { + throw new Error('Method not implemented'); + } + private convertToSafeCall( ast: Call | SafeCall, expr: ts.Expression, @@ -549,7 +579,7 @@ class VeSafeLhsInferenceBugDetector implements AstVisitor { visitPrefixNot(ast: PrefixNot): boolean { return ast.expression.visit(this); } - visitTypeofExpresion(ast: PrefixNot): boolean { + visitTypeofExpression(ast: PrefixNot): boolean { return ast.expression.visit(this); } visitNonNullAssert(ast: PrefixNot): boolean { @@ -567,4 +597,10 @@ class VeSafeLhsInferenceBugDetector implements AstVisitor { visitSafeKeyedRead(ast: SafeKeyedRead): boolean { return false; } + visitTemplateLiteral(ast: TemplateLiteral, context: any) { + return false; + } + visitTemplateLiteralElement(ast: TemplateLiteralElement, context: any) { + return false; + } } diff --git a/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts b/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts index 3aee75c34c21..e0001e30f4c5 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts @@ -145,6 +145,14 @@ describe('type check blocks', () => { expect(tcb(TEMPLATE)).toContain('_t2(1)'); }); + it('should handle template literals', () => { + expect(tcb('{{ `hello world` }}')).toContain('"" + (`hello world`);'); + expect(tcb('{{ `hello \\${name}!!!` }}')).toContain('"" + (`hello \\${name}!!!`);'); + expect(tcb('{{ `${a} - ${b} - ${c}` }}')).toContain( + '"" + (`${((this).a)} - ${((this).b)} - ${((this).c)}`);', + ); + }); + describe('type constructors', () => { it('should handle missing property bindings', () => { const TEMPLATE = `
    `; diff --git a/packages/compiler-cli/src/typescript_support.ts b/packages/compiler-cli/src/typescript_support.ts index 15b67b259635..f4dda0929734 100644 --- a/packages/compiler-cli/src/typescript_support.ts +++ b/packages/compiler-cli/src/typescript_support.ts @@ -26,7 +26,7 @@ const MIN_TS_VERSION = '5.5.0'; * Note: this check is disabled in g3, search for * `angularCompilerOptions.disableTypeScriptVersionCheck` config param value in g3. */ -const MAX_TS_VERSION = '5.8.0'; +const MAX_TS_VERSION = '5.9.0'; /** * The currently used version of TypeScript, which can be adjusted for testing purposes using diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/TEST_CASES.json index d727ec337781..813d9ebfd3cc 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/TEST_CASES.json @@ -26,7 +26,7 @@ "files": [ { "generated": "local_reference_nested.js", - "expected": "local_reference_nested.pipeline.js" + "expected": "local_reference_nested.js" } ] } @@ -42,7 +42,7 @@ "failureMessage": "Incorrect template", "files": [ { - "expected": "local_reference_and_context_variables_template.pipeline.js", + "expected": "local_reference_and_context_variables_template.js", "generated": "local_reference_and_context_variables.js" } ] @@ -76,4 +76,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_and_context_variables_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_and_context_variables_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_and_context_variables_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_and_context_variables_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/TEST_CASES.json index d9a7772cf361..394925034af5 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/TEST_CASES.json @@ -47,7 +47,7 @@ "failureMessage": "Invalid MyApp definition", "files": [ { - "expected": "pipes_my_app_def.pipeline.js", + "expected": "pipes_my_app_def.js", "generated": "pipes.js" } ] @@ -113,4 +113,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/pipes_my_app_def.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/pipes_my_app_def.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/pipes_my_app_def.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/pipes_my_app_def.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/GOLDEN_PARTIAL.js index e384b3c1b5b5..b5d140447ee9 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/GOLDEN_PARTIAL.js @@ -723,3 +723,60 @@ export declare class MyModule { static ɵinj: i0.ɵɵInjectorDeclaration; } +/**************************************************************************************************** + * PARTIAL FILE: template_literals.js + ****************************************************************************************************/ +import { Component, Pipe } from '@angular/core'; +import * as i0 from "@angular/core"; +export class UppercasePipe { + transform(value) { + return value.toUpperCase(); + } +} +UppercasePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: UppercasePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); +UppercasePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: UppercasePipe, isStandalone: true, name: "uppercase" }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: UppercasePipe, decorators: [{ + type: Pipe, + args: [{ name: 'uppercase' }] + }] }); +export class MyApp { + constructor() { + this.name = 'Frodo'; + this.timeOfDay = 'morning'; + } +} +MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "my-app", ngImport: i0, template: ` +
    No interpolations: {{ \`hello world \` }}
    + With interpolations: {{ \`hello \${name}, it is currently \${timeOfDay}!\` }} +

    With pipe: {{\`hello \${name}\` | uppercase}}

    + `, isInline: true, dependencies: [{ kind: "pipe", type: UppercasePipe, name: "uppercase" }] }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, decorators: [{ + type: Component, + args: [{ + selector: 'my-app', + template: ` +
    No interpolations: {{ \`hello world \` }}
    + With interpolations: {{ \`hello \${name}, it is currently \${timeOfDay}!\` }} +

    With pipe: {{\`hello \${name}\` | uppercase}}

    + `, + imports: [UppercasePipe], + }] + }] }); + +/**************************************************************************************************** + * PARTIAL FILE: template_literals.d.ts + ****************************************************************************************************/ +import * as i0 from "@angular/core"; +export declare class UppercasePipe { + transform(value: string): string; + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵpipe: i0.ɵɵPipeDeclaration; +} +export declare class MyApp { + name: string; + timeOfDay: string; + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵcmp: i0.ɵɵComponentDeclaration; +} + diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/TEST_CASES.json index 72bdbda36750..89bd8cd751de 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/TEST_CASES.json @@ -290,6 +290,20 @@ ] } ] + }, + { + "description": "should support template literals", + "inputFiles": [ + "template_literals.ts" + ], + "expectations": [ + { + "failureMessage": "Invalid template literal binding", + "files": [ + "template_literals.js" + ] + } + ] } ] -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/template_literals.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/template_literals.js new file mode 100644 index 000000000000..5e4c1454552f --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/template_literals.js @@ -0,0 +1,8 @@ +if (rf & 2) { + $r3$.ɵɵadvance(); + $r3$.ɵɵtextInterpolate1("No interpolations: ", `hello world `, ""); + $r3$.ɵɵadvance(2); + $r3$.ɵɵtextInterpolate1("With interpolations: ", `hello ${ctx.name}, it is currently ${ctx.timeOfDay}!`, ""); + $r3$.ɵɵadvance(2); + $r3$.ɵɵtextInterpolate1("With pipe: ", $r3$.ɵɵpipeBind1(6, 3, `hello ${ctx.name}`), ""); +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/template_literals.ts b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/template_literals.ts new file mode 100644 index 000000000000..70ef4e7044ee --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/template_literals.ts @@ -0,0 +1,22 @@ +import {Component, Pipe} from '@angular/core'; + +@Pipe({name: 'uppercase'}) +export class UppercasePipe { + transform(value: string) { + return value.toUpperCase(); + } +} + +@Component({ + selector: 'my-app', + template: ` +
    No interpolations: {{ \`hello world \` }}
    + With interpolations: {{ \`hello \${name}, it is currently \${timeOfDay}!\` }} +

    With pipe: {{\`hello \${name}\` | uppercase}}

    + `, + imports: [UppercasePipe], +}) +export class MyApp { + name = 'Frodo'; + timeOfDay = 'morning'; +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/TEST_CASES.json index bfcd19ea1be8..074118772b95 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/TEST_CASES.json @@ -43,7 +43,7 @@ { "files": [ { - "expected": "safe_access_temporaries_template.pipeline.js", + "expected": "safe_access_temporaries_template.js", "generated": "safe_access_temporaries.js" } ], @@ -77,7 +77,7 @@ { "files": [ { - "expected": "safe_call_template.pipeline.js", + "expected": "safe_call_template.js", "generated": "safe_call.js" } ], @@ -94,7 +94,7 @@ { "files": [ { - "expected": "safe_access_non_null_template.pipeline.js", + "expected": "safe_access_non_null_template.js", "generated": "safe_access_non_null.js" } ], @@ -103,4 +103,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_non_null_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_non_null_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_non_null_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_non_null_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_temporaries_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_temporaries_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_temporaries_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_temporaries_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_call_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_call_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_call_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_call_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/TEST_CASES.json index b025ad0a0744..9d94894e1d45 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/TEST_CASES.json @@ -89,7 +89,7 @@ "failureMessage": "Incorrect attribute array", "files": [ { - "expected": "exclude_bindings_from_consts_template.pipeline.js", + "expected": "exclude_bindings_from_consts_template.js", "generated": "exclude_bindings_from_consts.js" } ] diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/exclude_bindings_from_consts_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/exclude_bindings_from_consts_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/exclude_bindings_from_consts_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/exclude_bindings_from_consts_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/TEST_CASES.json index 158f2560a226..5805b4997116 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/TEST_CASES.json @@ -379,7 +379,7 @@ "files": [ { "generated": "deceptive_attrs.js", - "expected": "deceptive_attrs.pipeline.js" + "expected": "deceptive_attrs.js" } ] } diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/deceptive_attrs.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/deceptive_attrs.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/deceptive_attrs.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/deceptive_attrs.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/TEST_CASES.json index 08e0ad983b01..eb6404d13a46 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/TEST_CASES.json @@ -12,7 +12,7 @@ "files": [ { "generated": "local_ref_on_host.js", - "expected": "local_ref_on_host.pipeline.js" + "expected": "local_ref_on_host.js" } ] } @@ -61,4 +61,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/GOLDEN_PARTIAL.js index cc1465c2e69b..721204a7c701 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/GOLDEN_PARTIAL.js @@ -2666,3 +2666,41 @@ it('case 2', () => { ****************************************************************************************************/ export {}; +/**************************************************************************************************** + * PARTIAL FILE: for_track_by_temporary_variables.js + ****************************************************************************************************/ +import { Component } from '@angular/core'; +import * as i0 from "@angular/core"; +export class MyApp { + constructor() { + this.items = []; + } +} +MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "ng-component", ngImport: i0, template: ` + @for (item of items; track item?.name?.[0]?.toUpperCase() ?? foo) {} + @for (item of items; track item.name ?? $index ?? foo) {} + `, isInline: true }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, decorators: [{ + type: Component, + args: [{ + template: ` + @for (item of items; track item?.name?.[0]?.toUpperCase() ?? foo) {} + @for (item of items; track item.name ?? $index ?? foo) {} + `, + }] + }] }); + +/**************************************************************************************************** + * PARTIAL FILE: for_track_by_temporary_variables.d.ts + ****************************************************************************************************/ +import * as i0 from "@angular/core"; +export declare class MyApp { + foo: any; + items: { + name?: string; + }[]; + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵcmp: i0.ɵɵComponentDeclaration; +} + diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json index ae5893bcf993..0f364fcdad52 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json @@ -54,7 +54,7 @@ "files": [ { "generated": "switch_with_pipe.js", - "expected": "switch_with_pipe_template.pipeline.js" + "expected": "switch_with_pipe_template.js" } ], "failureMessage": "Incorrect template" @@ -144,7 +144,7 @@ "files": [ { "generated": "if_with_pipe.js", - "expected": "if_with_pipe_template.pipeline.js" + "expected": "if_with_pipe_template.js" } ], "failureMessage": "Incorrect template" @@ -188,7 +188,7 @@ { "files": [ { - "expected": "if_nested_alias_listeners_template.pipeline.js", + "expected": "if_nested_alias_listeners_template.js", "generated": "if_nested_alias_listeners.js" } ], @@ -278,7 +278,7 @@ { "files": [ { - "expected": "for_template_variables_template.pipeline.js", + "expected": "for_template_variables_template.js", "generated": "for_template_variables.js" } ], @@ -293,7 +293,7 @@ { "files": [ { - "expected": "for_aliased_template_variables_template.pipeline.js", + "expected": "for_aliased_template_variables_template.js", "generated": "for_aliased_template_variables.js" } ], @@ -338,7 +338,7 @@ { "files": [ { - "expected": "for_template_variables_listener_template.pipeline.js", + "expected": "for_template_variables_listener_template.js", "generated": "for_template_variables_listener.js" } ], @@ -383,7 +383,7 @@ { "files": [ { - "expected": "for_template_variables_scope_template.pipeline.js", + "expected": "for_template_variables_scope_template.js", "generated": "for_template_variables_scope.js" } ], @@ -690,6 +690,21 @@ ] } ] + }, + { + "description": "should support expressions requiring temporary variables inside `track`", + "inputFiles": ["for_track_by_temporary_variables.ts"], + "expectations": [ + { + "failureMessage": "Incorrect generated output.", + "files": [ + { + "expected": "for_track_by_temporary_variables_template.js", + "generated": "for_track_by_temporary_variables.js" + } + ] + } + ] } ] } diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_aliased_template_variables_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_aliased_template_variables_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_aliased_template_variables_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_aliased_template_variables_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_listener_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_listener_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_listener_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_listener_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_scope_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_scope_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_scope_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_scope_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_track_by_temporary_variables.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_track_by_temporary_variables.ts new file mode 100644 index 000000000000..77c3d53dc78c --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_track_by_temporary_variables.ts @@ -0,0 +1,12 @@ +import {Component} from '@angular/core'; + +@Component({ + template: ` + @for (item of items; track item?.name?.[0]?.toUpperCase() ?? foo) {} + @for (item of items; track item.name ?? $index ?? foo) {} + `, +}) +export class MyApp { + foo: any; + items: {name?: string}[] = []; +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_track_by_temporary_variables_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_track_by_temporary_variables_template.js new file mode 100644 index 000000000000..fcaebc68108c --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_track_by_temporary_variables_template.js @@ -0,0 +1,35 @@ +function _forTrack0($index, $item) { + let tmp_0_0; + return (tmp_0_0 = + $item == null + ? null + : $item.name == null + ? null + : $item.name[0] == null + ? null + : $item.name[0].toUpperCase()) !== null && tmp_0_0 !== undefined + ? tmp_0_0 + : this.foo; +} + +function _forTrack1($index, $item) { + let tmp_0_0; + return (tmp_0_0 = (tmp_0_0 = $item.name) !== null && tmp_0_0 !== undefined ? tmp_0_0 : $index) !== + null && tmp_0_0 !== undefined + ? tmp_0_0 + : this.foo; +} + +… + +function MyApp_Template(rf, ctx) { + if (rf & 1) { + $r3$.ɵɵrepeaterCreate(0, MyApp_For_1_Template, 0, 0, null, null, _forTrack0, true); + $r3$.ɵɵrepeaterCreate(2, MyApp_For_3_Template, 0, 0, null, null, _forTrack1, true); + } + if (rf & 2) { + $r3$.ɵɵrepeater(ctx.items); + $r3$.ɵɵadvance(2); + $r3$.ɵɵrepeater(ctx.items); + } +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_nested_alias_listeners_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_nested_alias_listeners_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_nested_alias_listeners_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_nested_alias_listeners_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_with_pipe_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_with_pipe_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_with_pipe_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_with_pipe_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/switch_with_pipe_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/switch_with_pipe_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/switch_with_pipe_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/switch_with_pipe_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/GOLDEN_PARTIAL.js index a53d28b5523d..b1aa2bed948e 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/GOLDEN_PARTIAL.js @@ -1122,3 +1122,99 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDE ****************************************************************************************************/ export {}; +/**************************************************************************************************** + * PARTIAL FILE: deferred_with_duplicate_external_dep_lazy.js + ****************************************************************************************************/ +import { Directive } from '@angular/core'; +import * as i0 from "@angular/core"; +export class DuplicateLazyDep { +} +DuplicateLazyDep.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: DuplicateLazyDep, deps: [], target: i0.ɵɵFactoryTarget.Directive }); +DuplicateLazyDep.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: DuplicateLazyDep, isStandalone: true, selector: "duplicate-lazy-dep", ngImport: i0 }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: DuplicateLazyDep, decorators: [{ + type: Directive, + args: [{ selector: 'duplicate-lazy-dep' }] + }] }); + +/**************************************************************************************************** + * PARTIAL FILE: deferred_with_duplicate_external_dep_lazy.d.ts + ****************************************************************************************************/ +import * as i0 from "@angular/core"; +export declare class DuplicateLazyDep { + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵdir: i0.ɵɵDirectiveDeclaration; +} + +/**************************************************************************************************** + * PARTIAL FILE: deferred_with_duplicate_external_dep_other.js + ****************************************************************************************************/ +import { Directive } from '@angular/core'; +import * as i0 from "@angular/core"; +export class OtherLazyDep { +} +OtherLazyDep.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: OtherLazyDep, deps: [], target: i0.ɵɵFactoryTarget.Directive }); +OtherLazyDep.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: OtherLazyDep, isStandalone: true, selector: "other-lazy-dep", ngImport: i0 }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: OtherLazyDep, decorators: [{ + type: Directive, + args: [{ selector: 'other-lazy-dep' }] + }] }); + +/**************************************************************************************************** + * PARTIAL FILE: deferred_with_duplicate_external_dep_other.d.ts + ****************************************************************************************************/ +import * as i0 from "@angular/core"; +export declare class OtherLazyDep { + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵdir: i0.ɵɵDirectiveDeclaration; +} + +/**************************************************************************************************** + * PARTIAL FILE: deferred_with_duplicate_external_dep.js + ****************************************************************************************************/ +import { Component } from '@angular/core'; +import * as i0 from "@angular/core"; +export class MyApp { +} +MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "ng-component", ngImport: i0, template: ` + @defer { + + } + + @defer { + + } + + @defer { + + } + `, isInline: true, deferBlockDependencies: [() => [import("./deferred_with_duplicate_external_dep_lazy").then(m => m.DuplicateLazyDep)], () => [import("./deferred_with_duplicate_external_dep_lazy").then(m => m.DuplicateLazyDep)], () => [import("./deferred_with_duplicate_external_dep_other").then(m => m.OtherLazyDep)]] }); +i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, resolveDeferredDeps: () => [import("./deferred_with_duplicate_external_dep_lazy").then(m => m.DuplicateLazyDep), import("./deferred_with_duplicate_external_dep_other").then(m => m.OtherLazyDep)], resolveMetadata: (DuplicateLazyDep, OtherLazyDep) => ({ decorators: [{ + type: Component, + args: [{ + template: ` + @defer { + + } + + @defer { + + } + + @defer { + + } + `, + imports: [DuplicateLazyDep, OtherLazyDep], + }] + }], ctorParameters: null, propDecorators: null }) }); + +/**************************************************************************************************** + * PARTIAL FILE: deferred_with_duplicate_external_dep.d.ts + ****************************************************************************************************/ +import * as i0 from "@angular/core"; +export declare class MyApp { + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵcmp: i0.ɵɵComponentDeclaration; +} + diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json index 2744b408d5de..93cbe6d13d32 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json @@ -178,7 +178,7 @@ { "files": [ { - "expected": "deferred_when_with_pipe_template.pipeline.js", + "expected": "deferred_when_with_pipe_template.js", "generated": "deferred_when_with_pipe.js" } ], @@ -290,6 +290,25 @@ "failureMessage": "Incorrect template" } ] + }, + { + "description": "should handle a component with deferred blocks that share the same dependency", + "inputFiles": [ + "deferred_with_duplicate_external_dep.ts", + "deferred_with_duplicate_external_dep_lazy.ts", + "deferred_with_duplicate_external_dep_other.ts" + ], + "expectations": [ + { + "files": [ + { + "expected": "deferred_with_duplicate_external_dep_template.js", + "generated": "deferred_with_duplicate_external_dep.js" + } + ], + "failureMessage": "Incorrect template" + } + ] } ] } diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_when_with_pipe_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_when_with_pipe_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_when_with_pipe_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_when_with_pipe_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep.ts new file mode 100644 index 000000000000..59cbe0f4bf38 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep.ts @@ -0,0 +1,21 @@ +import {Component} from '@angular/core'; +import {DuplicateLazyDep} from './deferred_with_duplicate_external_dep_lazy'; +import {OtherLazyDep} from './deferred_with_duplicate_external_dep_other'; + +@Component({ + template: ` + @defer { + + } + + @defer { + + } + + @defer { + + } + `, + imports: [DuplicateLazyDep, OtherLazyDep], +}) +export class MyApp {} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_lazy.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_lazy.ts new file mode 100644 index 000000000000..8321df6e6a6d --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_lazy.ts @@ -0,0 +1,4 @@ +import {Directive} from '@angular/core'; + +@Directive({selector: 'duplicate-lazy-dep'}) +export class DuplicateLazyDep {} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_other.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_other.ts new file mode 100644 index 000000000000..4414f06e6d3d --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_other.ts @@ -0,0 +1,4 @@ +import {Directive} from '@angular/core'; + +@Directive({selector: 'other-lazy-dep'}) +export class OtherLazyDep {} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_template.js new file mode 100644 index 000000000000..ef430e566967 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_template.js @@ -0,0 +1,43 @@ +const MyApp_Defer_1_DepsFn = () => [import("./deferred_with_duplicate_external_dep_lazy").then(m => m.DuplicateLazyDep)]; +// NOTE: in linked tests there is one more loader here, because linked compilation doesn't have the ability to de-dupe identical functions. +… +const MyApp_Defer_7_DepsFn = () => [import("./deferred_with_duplicate_external_dep_other").then(m => m.OtherLazyDep)]; + +… + +$r3$.ɵɵdefineComponent({ + … + template: function MyApp_Template(rf, ctx) { + if (rf & 1) { + $r3$.ɵɵtemplate(0, MyApp_Defer_0_Template, 1, 0); + $r3$.ɵɵdefer(1, 0, MyApp_Defer_1_DepsFn); + $r3$.ɵɵdeferOnIdle(); + $r3$.ɵɵtemplate(3, MyApp_Defer_3_Template, 1, 0); + // NOTE: does not check the function name, because linked compilation doesn't have the ability to de-dupe identical functions. + $r3$.ɵɵdefer(4, 3, …); + $r3$.ɵɵdeferOnIdle(); + $r3$.ɵɵtemplate(6, MyApp_Defer_6_Template, 1, 0); + $r3$.ɵɵdefer(7, 6, MyApp_Defer_7_DepsFn); + $r3$.ɵɵdeferOnIdle(); + } + }, + encapsulation: 2 +}); + +… + +(() => { + (typeof ngDevMode === "undefined" || ngDevMode) && $r3$.ɵsetClassMetadataAsync(MyApp, () => [ + import("./deferred_with_duplicate_external_dep_lazy").then(m => m.DuplicateLazyDep), + import("./deferred_with_duplicate_external_dep_other").then(m => m.OtherLazyDep) + ], (DuplicateLazyDep, OtherLazyDep) => { + $r3$.ɵsetClassMetadata(MyApp, [{ + type: Component, + args: [{ + template: …, + // NOTE: there's a ... after the `imports`, because linked compilation produces a trailing comma while full compilation doesn't. + imports: [DuplicateLazyDep, OtherLazyDep]… + }] + }], null, null); + }); +})(); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/TEST_CASES.json index 2ed7b1c54bb7..9a688f687b30 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/TEST_CASES.json @@ -14,7 +14,7 @@ ], "files": [ { - "expected": "meaning_description_template.pipeline.js", + "expected": "meaning_description_template.js", "generated": "meaning_description.js" } ] @@ -62,7 +62,7 @@ ], "files": [ { - "expected": "ng-template_interpolation_template.pipeline.js", + "expected": "ng-template_interpolation_template.js", "generated": "ng-template_interpolation.js" } ] @@ -82,7 +82,7 @@ ], "files": [ { - "expected": "ng-template_interpolation_structural_template.pipeline.js", + "expected": "ng-template_interpolation_structural_template.js", "generated": "ng-template_interpolation_structural.js" } ] @@ -144,7 +144,7 @@ ], "files": [ { - "expected": "static_attributes_structural_template.pipeline.js", + "expected": "static_attributes_structural_template.js", "generated": "static_attributes_structural.js" } ] @@ -164,7 +164,7 @@ ], "files": [ { - "expected": "interpolation_basic_template.pipeline.js", + "expected": "interpolation_basic_template.js", "generated": "interpolation_basic.js" } ] @@ -184,7 +184,7 @@ ], "files": [ { - "expected": "interpolation_custom_config_template.pipeline.js", + "expected": "interpolation_custom_config_template.js", "generated": "interpolation_custom_config.js" } ] @@ -204,7 +204,7 @@ ], "files": [ { - "expected": "interpolation_nested_context_template.pipeline.js", + "expected": "interpolation_nested_context_template.js", "generated": "interpolation_nested_context.js" } ] @@ -224,7 +224,7 @@ ], "files": [ { - "expected": "interpolation_complex_expressions_template.pipeline.js", + "expected": "interpolation_complex_expressions_template.js", "generated": "interpolation_complex_expressions.js" } ] @@ -244,7 +244,7 @@ ], "files": [ { - "expected": "i18n_root_node_template.pipeline.js", + "expected": "i18n_root_node_template.js", "generated": "i18n_root_node.js" } ] diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/i18n_root_node_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/i18n_root_node_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/i18n_root_node_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/i18n_root_node_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_basic_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_basic_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_basic_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_basic_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_complex_expressions_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_complex_expressions_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_complex_expressions_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_complex_expressions_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_custom_config_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_custom_config_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_custom_config_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_custom_config_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_nested_context_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_nested_context_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_nested_context_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_nested_context_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/meaning_description_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/meaning_description_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/meaning_description_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/meaning_description_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_structural_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_structural_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_structural_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_structural_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes_structural_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes_structural_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes_structural_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes_structural_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/TEST_CASES.json index ea940b2832f1..73dc0bd3acdd 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/TEST_CASES.json @@ -53,7 +53,7 @@ "files": [ { "generated": "bare_icu.js", - "expected": "bare_icu.pipeline.js" + "expected": "bare_icu.js" } ], "extraChecks": [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/bare_icu.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/bare_icu.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/bare_icu.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/bare_icu.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/TEST_CASES.json index 0df6709834c9..4e88947a539e 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/TEST_CASES.json @@ -17,7 +17,7 @@ "files": [ { "generated": "legacy_enabled.js", - "expected": "legacy_enabled.pipeline.js" + "expected": "legacy_enabled.js" } ], "extraChecks": [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/legacy_enabled.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/legacy_enabled.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/legacy_enabled.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/legacy_enabled.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/TEST_CASES.json index 3da69fcf44e5..cfafece8e3e3 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/TEST_CASES.json @@ -11,7 +11,7 @@ "files": [ { "generated": "foreign_object.js", - "expected": "foreign_object.pipeline.js" + "expected": "foreign_object.js" } ], "extraChecks": [ @@ -31,7 +31,7 @@ "files": [ { "generated": "namespaced_div.js", - "expected": "namespaced_div.pipeline.js" + "expected": "namespaced_div.js" } ], "extraChecks": [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/foreign_object.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/foreign_object.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/foreign_object.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/foreign_object.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/namespaced_div.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/namespaced_div.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/namespaced_div.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/namespaced_div.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/TEST_CASES.json index fadb0ba213b0..6d6b7330d399 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/TEST_CASES.json @@ -151,7 +151,7 @@ "files": [ { "generated": "nested_elements_with_i18n_attributes.js", - "expected": "nested_elements_with_i18n_attributes_template.pipeline.js" + "expected": "nested_elements_with_i18n_attributes_template.js" } ], "extraChecks": [ @@ -171,7 +171,7 @@ "files": [ { "generated": "nested_templates.js", - "expected": "nested_templates.pipeline.js" + "expected": "nested_templates.js" } ], "extraChecks": [ @@ -191,7 +191,7 @@ "files": [ { "generated": "self_closing.js", - "expected": "self_closing_template.pipeline.js" + "expected": "self_closing_template.js" } ], "extraChecks": [ @@ -225,7 +225,7 @@ "files": [ { "generated": "directives.js", - "expected": "directives.pipeline.js" + "expected": "directives.js" } ], "extraChecks": [ @@ -245,7 +245,7 @@ "files": [ { "generated": "event_listeners.js", - "expected": "event_listeners_template.pipeline.js" + "expected": "event_listeners_template.js" } ], "extraChecks": [ @@ -296,7 +296,7 @@ ], "files": [ { - "expected": "last_elem_inside_i18n_block_template.pipeline.js", + "expected": "last_elem_inside_i18n_block_template.js", "generated": "last_elem_inside_i18n_block.js" } ] diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/directives.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/directives.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/directives.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/directives.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/event_listeners_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/event_listeners_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/event_listeners_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/event_listeners_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/last_elem_inside_i18n_block_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/last_elem_inside_i18n_block_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/last_elem_inside_i18n_block_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/last_elem_inside_i18n_block_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements_with_i18n_attributes_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements_with_i18n_attributes_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements_with_i18n_attributes_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements_with_i18n_attributes_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/self_closing_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/self_closing_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/self_closing_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/self_closing_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/TEST_CASES.json index ff1e021360d9..accc9d30ca77 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/TEST_CASES.json @@ -95,7 +95,7 @@ "files": [ { "generated": "self_closing_tags.js", - "expected": "self_closing_tags.pipeline.js" + "expected": "self_closing_tags.js" } ], "extraChecks": [ @@ -169,7 +169,7 @@ "files": [ { "generated": "structural_directives.js", - "expected": "structural_directives.pipeline.js" + "expected": "structural_directives.js" } ], "extraChecks": [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_tags.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_tags.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_tags.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_tags.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/structural_directives.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/structural_directives.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/structural_directives.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/structural_directives.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/TEST_CASES.json index 35cd62939de3..49048ee0b913 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/TEST_CASES.json @@ -53,7 +53,7 @@ "files": [ { "generated": "styles.js", - "expected": "styles.pipeline.js" + "expected": "styles.js" } ], "extraChecks": [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/styles.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/styles.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/styles.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/styles.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_input_outputs/input_transform_definition.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_input_outputs/input_transform_definition.js index 05cdaa533f81..03db26e98d42 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_input_outputs/input_transform_definition.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_input_outputs/input_transform_definition.js @@ -4,6 +4,5 @@ MyDirective.ɵdir = /*@__PURE__*/ $r3$.ɵɵdefineDirective({ functionDeclarationInput: [2, "functionDeclarationInput", "functionDeclarationInput", toNumber], inlineFunctionInput: [2, "inlineFunctionInput", "inlineFunctionInput", (value, _) => value ? 1 : 0] }, - standalone: false, - features: [$r3$.ɵɵInputTransformsFeature]… + … }); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/TEST_CASES.json index 73e4a5da25e0..9460a3c57d6c 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/TEST_CASES.json @@ -61,7 +61,7 @@ { "files": [ { - "expected": "local_ref_before_listener.pipeline.js", + "expected": "local_ref_before_listener.js", "generated": "local_ref_before_listener.js" } ], @@ -290,7 +290,7 @@ { "files": [ { - "expected": "embedded_view_listener_context_template.pipeline.js", + "expected": "embedded_view_listener_context_template.js", "generated": "embedded_view_listener_context.js" } ], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/embedded_view_listener_context_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/embedded_view_listener_context_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/embedded_view_listener_context_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/embedded_view_listener_context_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/local_ref_before_listener.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/local_ref_before_listener.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/local_ref_before_listener.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/local_ref_before_listener.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/TEST_CASES.json index 1cb564d45d3f..2ba1aa483d97 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/TEST_CASES.json @@ -80,7 +80,7 @@ { "files": [ { - "expected": "shared_name_with_consts_template.pipeline.js", + "expected": "shared_name_with_consts_template.js", "generated": "shared_name_with_consts.js" } ], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/shared_name_with_consts_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/shared_name_with_consts_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/shared_name_with_consts_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/shared_name_with_consts_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/TEST_CASES.json index 8e026b5f5350..8ca28fb2eb4c 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/TEST_CASES.json @@ -18,7 +18,7 @@ { "failureMessage": "Incorrect template", "files": [{ - "expected": "pipe_bindings.pipeline.js", + "expected": "pipe_bindings.js", "generated": "pipe_bindings.js" }] } diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/pipe_bindings.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/pipe_bindings.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/pipe_bindings.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/pipe_bindings.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json index 9a556531741c..943c53a6bf53 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json @@ -10,7 +10,7 @@ { "files": [ { - "expected": "nested_template_context.pipeline.js", + "expected": "nested_template_context.js", "generated": "nested_template_context.js" } ], @@ -78,7 +78,7 @@ { "files": [ { - "expected": "ng_for_parent_context_variables.pipeline.js", + "expected": "ng_for_parent_context_variables.js", "generated": "ng_for_parent_context_variables.js" } ], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/nested_template_context.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/nested_template_context.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/nested_template_context.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/nested_template_context.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/ng_for_parent_context_variables.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/ng_for_parent_context_variables.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/ng_for_parent_context_variables.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/ng_for_parent_context_variables.js diff --git a/packages/compiler-cli/test/compliance/test_cases/replace.sh b/packages/compiler-cli/test/compliance/test_cases/replace.sh deleted file mode 100755 index 686f3c76e568..000000000000 --- a/packages/compiler-cli/test/compliance/test_cases/replace.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash - -# Step 1: Find all .pipeline.js files recursively -find . -type f -name "*.pipeline.js" | while read -r pipeline_file; do - base_dir=$(dirname "$pipeline_file") - base_name=$(basename "$pipeline_file" .pipeline.js) - - # Step 2: Attempt to delete the corresponding .js, .template.js, or _template.js file - js_file="${base_dir}/${base_name}.js" - template_js_file="${base_dir}/${base_name}.template.js" - underscore_template_js_file="${base_dir}/${base_name}_template.js" - - file_deleted=false - - if [ -f "$js_file" ]; then - rm "$js_file" && echo "Deleted file: $js_file" - file_deleted=true - fi - if [ -f "$template_js_file" ]; then - rm "$template_js_file" && echo "Deleted file: $template_js_file" - file_deleted=true - fi - if [ -f "$underscore_template_js_file" ]; then - rm "$underscore_template_js_file" && echo "Deleted file: $underscore_template_js_file" - file_deleted=true - fi - - if [ "$file_deleted" = false ]; then - echo "Error: Corresponding file for $pipeline_file not found." - fi - - # Step 3: Modify TEST_CASES.json if it exists in the same directory - test_cases_file="${base_dir}/TEST_CASES.json" - if [ -f "$test_cases_file" ]; then - # Patterns to match "expected" before the filename - js_pattern="expected.*$base_name\.js" - template_js_pattern="expected.*$base_name\.template\.js" - underscore_template_js_pattern="expected.*$base_name\_template\.js" - - # Use a more compatible sed in-place editing command - if grep -q -E "expected.*(js|template\.js|_template\.js)" "$test_cases_file"; then - # Determine if we are using GNU sed or BSD sed and adjust the command accordingly - if sed --version 2>/dev/null | grep -q GNU; then - # GNU sed - sed -i "/$js_pattern/d" "$test_cases_file" - sed -i "/$template_js_pattern/d" "$test_cases_file" - sed -i "/$underscore_template_js_pattern/d" "$test_cases_file" - else - # BSD sed - sed -i '' "/$js_pattern/d" "$test_cases_file" - sed -i '' "/$template_js_pattern/d" "$test_cases_file" - sed -i '' "/$underscore_template_js_pattern/d" "$test_cases_file" - fi - echo "Modified $test_cases_file to remove references to ${base_name}.js, ${base_name}.template.js, and/or ${base_name}_template.js with 'expected' preceding" - else - echo "Error: No line found in $test_cases_file for 'expected' preceding ${base_name}.js, ${base_name}.template.js, or ${base_name}_template.js" - fi - else - echo "Error: TEST_CASES.json not found in $base_dir" - fi -done diff --git a/packages/compiler-cli/test/compliance/test_cases/signal_inputs/mixed_input_types.js b/packages/compiler-cli/test/compliance/test_cases/signal_inputs/mixed_input_types.js index 7742cba47436..65d84a9877c8 100644 --- a/packages/compiler-cli/test/compliance/test_cases/signal_inputs/mixed_input_types.js +++ b/packages/compiler-cli/test/compliance/test_cases/signal_inputs/mixed_input_types.js @@ -7,6 +7,6 @@ TestDir.ɵdir = /* @__PURE__ */ $r3$.ɵɵdefineDirective({ decoratorInput: "decoratorInput", decoratorInputWithAlias: [0, "publicNameDecorator", "decoratorInputWithAlias"], decoratorInputWithTransformAndAlias: [2, "publicNameDecorator2", "decoratorInputWithTransformAndAlias", convertToBoolean] - }, + } … -}); \ No newline at end of file +}); diff --git a/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/TEST_CASES.json index 8caed2dceaf8..37a0a2071b6b 100644 --- a/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/TEST_CASES.json @@ -794,7 +794,7 @@ "files": [ { "generated": "i18n_message_interpolation_whitespace.js", - "expected": "i18n_message_interpolation_whitespace_template.pipeline.js" + "expected": "i18n_message_interpolation_whitespace_template.js" } ] } @@ -817,7 +817,7 @@ "files": [ { "generated": "i18n_message_interpolation_whitespace.js", - "expected": "i18n_message_interpolation_whitespace_partial_template.pipeline.js" + "expected": "i18n_message_interpolation_whitespace_partial_template.js" } ] } @@ -966,4 +966,4 @@ } } ] -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_partial_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_partial_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_partial_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_partial_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_template.js diff --git a/packages/compiler-cli/test/ngtsc/hmr_spec.ts b/packages/compiler-cli/test/ngtsc/hmr_spec.ts index 74e8cfaa22e2..63acd4c5290a 100644 --- a/packages/compiler-cli/test/ngtsc/hmr_spec.ts +++ b/packages/compiler-cli/test/ngtsc/hmr_spec.ts @@ -104,18 +104,19 @@ runInEachFileSystem(() => { const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain(`import * as i0 from "@angular/core";`); + expect(jsContents).toContain('const id = "test.ts%40Cmp";'); expect(jsContents).toContain('function Cmp_HmrLoad(t) {'); expect(jsContents).toContain( - 'import(/* @vite-ignore */\n"/@ng/component?c=test.ts%40Cmp&t=" + encodeURIComponent(t))', + 'import(/* @vite-ignore */\nnew URL("./@ng/component?c=" + id + "&t=" + encodeURIComponent(t), import.meta.url).href)', ); expect(jsContents).toContain( ').then(m => m.default && i0.ɵɵreplaceMetadata(Cmp, m.default, [i0], ' + - '[Dep, transformValue, TOKEN, Component, Inject, ViewChild, Input]));', + '[Dep, transformValue, TOKEN, Component, Inject, ViewChild, Input], import.meta, id));', ); expect(jsContents).toContain('Cmp_HmrLoad(Date.now());'); expect(jsContents).toContain( 'import.meta.hot && import.meta.hot.on("angular:component-update", ' + - 'd => d.id === "test.ts%40Cmp" && Cmp_HmrLoad(d.timestamp)', + 'd => d.id === id && Cmp_HmrLoad(d.timestamp)', ); expect(hmrContents).toContain( @@ -171,18 +172,19 @@ runInEachFileSystem(() => { const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain(`import * as i0 from "@angular/core";`); expect(jsContents).toContain(`import * as i1 from "./dep";`); + expect(jsContents).toContain('const id = "test.ts%40Cmp";'); expect(jsContents).toContain('function Cmp_HmrLoad(t) {'); expect(jsContents).toContain( - 'import(/* @vite-ignore */\n"/@ng/component?c=test.ts%40Cmp&t=" + encodeURIComponent(t))', + 'import(/* @vite-ignore */\nnew URL("./@ng/component?c=" + id + "&t=" + encodeURIComponent(t), import.meta.url).href)', ); expect(jsContents).toContain( ').then(m => m.default && i0.ɵɵreplaceMetadata(Cmp, m.default, [i0, i1], ' + - '[DepModule, Component]));', + '[DepModule, Component], import.meta, id));', ); expect(jsContents).toContain('Cmp_HmrLoad(Date.now());'); expect(jsContents).toContain( 'import.meta.hot && import.meta.hot.on("angular:component-update", ' + - 'd => d.id === "test.ts%40Cmp" && Cmp_HmrLoad(d.timestamp)', + 'd => d.id === id && Cmp_HmrLoad(d.timestamp)', ); expect(hmrContents).toContain( @@ -291,7 +293,7 @@ runInEachFileSystem(() => { expect(jsContents).toContain('i0.ɵɵdefer(1, 0, Cmp_Defer_1_DepsFn);'); expect(hmrContents).toContain( - 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, Component, Dep) {', + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, Dep, Component) {', ); expect(hmrContents).toContain('const Cmp_Defer_1_DepsFn = () => [Dep];'); expect(hmrContents).toContain('function Cmp_Defer_0_Template(rf, ctx) {'); @@ -340,7 +342,9 @@ runInEachFileSystem(() => { expect(jsContents).toContain('const Cmp_Defer_1_DepsFn = () => [Dep];'); expect(jsContents).toContain('function Cmp_Defer_0_Template(rf, ctx) { if (rf & 1) {'); expect(jsContents).toContain('i0.ɵɵdefer(1, 0, Cmp_Defer_1_DepsFn);'); - expect(jsContents).toContain('ɵɵreplaceMetadata(Cmp, m.default, [i0], [Dep]));'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [Dep], import.meta, id));', + ); expect(jsContents).not.toContain('setClassMetadata'); expect(hmrContents).toContain( @@ -405,6 +409,56 @@ runInEachFileSystem(() => { expect(hmrContents).toBe(null); }); + it('should capture self-referencing component during HMR', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component} from '@angular/core'; + + @Component({selector: 'cmp', template: '',}) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + expect(jsContents).toContain('dependencies: [Cmp]'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [Component], import.meta, id));', + ); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, Component) {', + ); + }); + + it('should capture component in its own dependencies if it is not used in the template', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component} from '@angular/core'; + + @Component({selector: 'cmp', template: ''}) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + expect(jsContents).not.toContain('dependencies'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [Component], import.meta, id));', + ); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, Component) {', + ); + }); + it('should capture shorthand property assignment dependencies', () => { enableHmr(); env.write( @@ -425,11 +479,427 @@ runInEachFileSystem(() => { const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain( - 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [providers, Component]));', + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [providers, Component], import.meta, id));', ); expect(hmrContents).toContain( 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, providers, Component) {', ); }); + + it('should capture variable initializer dependencies', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component, InjectionToken} from '@angular/core'; + + const token = new InjectionToken('TEST'); + const value = 123; + + @Component({ + template: '', + providers: [{ + provide: token, + useFactory: () => { + const v = value; + return v; + } + }] + }) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, value, Component], import.meta, id));', + ); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, value, Component) {', + ); + }); + + it('should capture arrow function dependencies', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component, InjectionToken} from '@angular/core'; + + const token = new InjectionToken('TEST'); + const value = 123; + + @Component({ + template: '', + providers: [{ + provide: token, + useFactory: () => value + }] + }) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, value, Component], import.meta, id));', + ); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, value, Component) {', + ); + }); + + it('should capture conditional expression dependencies', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component, InjectionToken} from '@angular/core'; + + const providersA: any[] = []; + const providersB: any[] = []; + const condition = true; + + @Component({ + template: '', + providers: [condition ? providersA : providersB] + }) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [condition, providersA, providersB, Component], import.meta, id));', + ); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, condition, providersA, providersB, Component) {', + ); + }); + + it('should capture parenthesized dependencies', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component, InjectionToken} from '@angular/core'; + + const token = new InjectionToken('TEST'); + const value = 123; + const otherValue = 321; + + @Component({ + template: '', + providers: [{ + provide: token, + useFactory: () => [(value), ((((otherValue))))] + }] + }) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, value, otherValue, Component], import.meta, id));', + ); + expect(jsContents).toContain('useFactory: () => [(value), ((((otherValue))))]'); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, value, otherValue, Component) {', + ); + }); + + it('should capture new expression dependencies', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component, InjectionToken, Optional} from '@angular/core'; + const token = new InjectionToken('TEST'); + const dep = new InjectionToken('TEST-DEP'); + const value = 5; + @Component({ + template: '', + providers: [{ + provide: token, + useFactory: () => { + const v = value; + return v; + }, + deps: [[new Optional(), dep]] + }] + }) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, value, Optional, dep, Component], import.meta, id));', + ); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, value, Optional, dep, Component) {', + ); + }); + + it('should preserve eager standalone imports in HMR even if they are not used in the template', () => { + enableHmr({ + // Disable class metadata since it can add noise to the test. + supportTestBed: false, + extendedDiagnostics: { + checks: { + // Disable the diagnostic that flags standalone imports since + // we need one to simulate the case we're looking for. + unusedStandaloneImports: 'suppress', + }, + }, + }); + + env.write( + 'dep.ts', + ` + import {Directive} from '@angular/core'; + + @Directive({selector: '[dep]'}) + export class Dep {} + `, + ); + + env.write( + 'test.ts', + ` + import {Component} from '@angular/core'; + import {Dep} from './dep'; + + @Component({ + selector: 'cmp', + template: '', + imports: [Dep], + }) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + + expect(jsContents).toContain('dependencies: [Dep]'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [Dep], import.meta, id));', + ); + expect(hmrContents).toContain('function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, Dep) {'); + }); + + it('should preserve eager module imports inside standalone component in HMR even if they are not used in the template', () => { + enableHmr({ + // Disable class metadata since it can add noise to the test. + supportTestBed: false, + }); + + env.write( + 'dep.ts', + ` + import {NgModule, Directive} from '@angular/core'; + + @Directive({selector: '[dep]', standalone: false}) + export class Dep {} + + @NgModule({declarations: [Dep], exports: [Dep]}) + export class DepModule {} + `, + ); + + env.write( + 'test.ts', + ` + import {Component} from '@angular/core'; + import {DepModule} from './dep'; + + @Component({ + selector: 'cmp', + template: '', + imports: [DepModule], + }) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + + expect(jsContents).toContain('dependencies: [DepModule, i1.Dep]'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0, i1], [DepModule], import.meta, id));', + ); + expect(hmrContents).toContain('function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, DepModule) {'); + }); + + it('should preserve eager module imports inside non-standalone component in HMR even if they are not used in the template', () => { + enableHmr({ + // Disable class metadata since it can add noise to the test. + supportTestBed: false, + }); + + env.write( + 'dep.ts', + ` + import {NgModule, Directive} from '@angular/core'; + + @Directive({selector: '[dep]', standalone: false}) + export class Dep {} + + @NgModule({declarations: [Dep], exports: [Dep]}) + export class DepModule {} + `, + ); + + env.write( + 'test-module.ts', + ` + import {NgModule} from '@angular/core'; + import {Cmp} from './test'; + import {DepModule} from './dep'; + + @NgModule({imports: [DepModule], declarations: [Cmp], exports: [Cmp]}) + export class CmpModule {} + `, + ); + + env.write( + 'test.ts', + ` + import {Component} from '@angular/core'; + import {DepModule} from './dep'; + + @Component({ + selector: 'cmp', + template: '', + standalone: false, + }) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + + expect(jsContents).toContain('dependencies: [i1.Dep]'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0, i1], [], import.meta, id));', + ); + expect(hmrContents).toContain('function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces) {'); + }); + + it('should pass const enums defined in the same file as an object literal', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component, InjectionToken} from '@angular/core'; + + const token = new InjectionToken('TEST'); + + const numberThree = 3; + + export const enum Foo { + one, + two = '2', + three = numberThree + } + + @Component({ + template: '', + providers: [{ + provide: token, + useValue: Foo.three + }] + }) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, { one: 0, two: "2", three: 3 }, Component], import.meta, id));', + ); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, Foo, Component) {', + ); + }); + + it('should pass const enum defined in other file as an object literal', () => { + enableHmr(); + + env.write( + 'deps.ts', + ` + const numberThree = 3; + + export const enum Foo { + one, + two = '2', + three = numberThree + } + `, + ); + + env.write( + 'test.ts', + ` + import {Component, InjectionToken} from '@angular/core'; + import {Foo} from './deps'; + + const token = new InjectionToken('TEST'); + + @Component({ + template: '', + providers: [{ + provide: token, + useValue: Foo.three + }] + }) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, { one: 0, two: "2", three: 3 }, Component], import.meta, id));', + ); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, Foo, Component) {', + ); + }); }); }); diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index 150598fe6760..349efb927ba1 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -10482,7 +10482,6 @@ runInEachFileSystem((os: string) => { const dtsContents = env.getContents('test.d.ts'); expect(jsContents).toContain('inputs: { value: [2, "value", "value", toNumber] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('static ngAcceptInputType_value: boolean | string;'); }); @@ -10507,7 +10506,6 @@ runInEachFileSystem((os: string) => { const dtsContents = env.getContents('test.d.ts'); expect(jsContents).toContain('inputs: { value: [2, "value", "value", toNumber] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('static ngAcceptInputType_value: boolean | string;'); }); @@ -10541,7 +10539,6 @@ runInEachFileSystem((os: string) => { const dtsContents = env.getContents('test.d.ts'); expect(jsContents).toContain('inputs: { value: [2, "value", "value", toNumber] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('import * as i1 from "./types"'); expect(dtsContents).toContain( 'static ngAcceptInputType_value: boolean | string | i1.GenericWrapper;', @@ -10588,7 +10585,6 @@ runInEachFileSystem((os: string) => { const dtsContents = env.getContents('test.d.ts'); expect(jsContents).toContain('inputs: { value: [2, "value", "value", toNumber] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('import * as i1 from "./types"'); expect(dtsContents).toContain('import * as i2 from "./other-types"'); expect(dtsContents).toContain( @@ -10630,7 +10626,6 @@ runInEachFileSystem((os: string) => { expect(jsContents).toContain(`import { externalToNumber } from 'external';`); expect(jsContents).toContain('inputs: { value: [2, "value", "value", externalToNumber] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('import * as i1 from "external";'); expect(dtsContents).toContain('static ngAcceptInputType_value: i1.ExternalToNumberType;'); }); @@ -10668,7 +10663,6 @@ runInEachFileSystem((os: string) => { expect(jsContents).toContain( 'inputs: { value: [2, "value", "value", (value) => value ? 1 : 0] }', ); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('import * as i1 from "external";'); expect(dtsContents).toContain('static ngAcceptInputType_value: i1.ExternalToNumberType;'); }); @@ -10701,7 +10695,6 @@ runInEachFileSystem((os: string) => { const dtsContents = env.getContents('test.d.ts'); expect(jsContents).toContain('inputs: { value: [2, "value", "value", toBoolean] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain( `static ngAcceptInputType_value: boolean | "" | "true" | "false";`, ); @@ -10728,7 +10721,6 @@ runInEachFileSystem((os: string) => { const dtsContents = env.getContents('test.d.ts'); expect(jsContents).toContain('inputs: { value: [2, "value", "value", toNumber] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('static ngAcceptInputType_value: boolean | string;'); }); @@ -10753,40 +10745,9 @@ runInEachFileSystem((os: string) => { const dtsContents = env.getContents('test.d.ts'); expect(jsContents).toContain('inputs: { value: [2, "value", "value", toNumber] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('static ngAcceptInputType_value: unknown;'); }); - it('should insert the InputTransformsFeature before the InheritDefinitionFeature', () => { - env.write( - '/test.ts', - ` - import {Directive, Input} from '@angular/core'; - - function toNumber(value: boolean | string) { return 1; } - - @Directive() - export class ParentDir {} - - @Directive() - export class Dir extends ParentDir { - @Input({transform: toNumber}) value!: number; - } - `, - ); - - env.driveMain(); - - const jsContents = env.getContents('test.js'); - const dtsContents = env.getContents('test.d.ts'); - - expect(jsContents).toContain('inputs: { value: [2, "value", "value", toNumber] }'); - expect(jsContents).toContain( - 'features: [i0.ɵɵInputTransformsFeature, i0.ɵɵInheritDefinitionFeature]', - ); - expect(dtsContents).toContain('static ngAcceptInputType_value: boolean | string;'); - }); - it('should compile an input with using an ambient type in the transform function', () => { env.write( 'node_modules/external/index.d.ts', @@ -10818,7 +10779,6 @@ runInEachFileSystem((os: string) => { expect(jsContents).toContain( 'inputs: { element: [2, "element", "element", coerceElement] }', ); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain( 'static ngAcceptInputType_element: HTMLElement | i0.ElementRef;', ); diff --git a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts index 4ef3a70ebad0..c80b474c8026 100644 --- a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts +++ b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts @@ -3352,6 +3352,58 @@ runInEachFileSystem(() => { expect(diags.length).toBe(0); }); + describe('template literals', () => { + it('should treat template literals as strings', () => { + env.write( + 'test.ts', + ` + import {Component} from '@angular/core'; + + @Component({ + template: 'Result: {{getValue(\`foo\`)}}', + standalone: true, + }) + export class Main { + getValue(value: number) { + return value; + } + } + `, + ); + + const diags = env.driveDiagnostics(); + expect(diags.length).toBe(1); + expect(diags[0].messageText).toBe( + `Argument of type 'string' is not assignable to parameter of type 'number'.`, + ); + }); + + it('should check interpolations inside template literals', () => { + env.write( + 'test.ts', + ` + import {Component} from '@angular/core'; + + @Component({ + template: '{{\`Hello \${getName(123)}\`}}', + standalone: true, + }) + export class Main { + getName(value: string) { + return value; + } + } + `, + ); + + const diags = env.driveDiagnostics(); + expect(diags.length).toBe(1); + expect(diags[0].messageText).toBe( + `Argument of type 'number' is not assignable to parameter of type 'string'.`, + ); + }); + }); + describe('legacy schema checking with the DOM schema', () => { beforeEach(() => { env.tsconfig({fullTemplateTypeCheck: false}); diff --git a/packages/compiler/src/compiler.ts b/packages/compiler/src/compiler.ts index 08bac97d8305..209eea40466a 100644 --- a/packages/compiler/src/compiler.ts +++ b/packages/compiler/src/compiler.ts @@ -86,9 +86,9 @@ export { ReadVarExpr, ReturnStatement, StatementVisitor, - TaggedTemplateExpr, - TemplateLiteral, - TemplateLiteralElement, + TaggedTemplateLiteralExpr, + TemplateLiteralExpr, + TemplateLiteralElementExpr, Type, TypeModifier, TypeVisitor, diff --git a/packages/compiler/src/core.ts b/packages/compiler/src/core.ts index 2af6d170b9aa..a0a2d6d352c5 100644 --- a/packages/compiler/src/core.ts +++ b/packages/compiler/src/core.ts @@ -221,12 +221,12 @@ export const enum AttributeMarker { * ## Example: * * Given: - * ``` - *
    ... + * ```html + *
    ...
    * ``` * * the generated code is: - * ``` + * ```ts * var _c1 = [AttributeMarker.Classes, 'foo', 'bar', 'baz']; * ``` */ @@ -240,12 +240,12 @@ export const enum AttributeMarker { * ## Example: * * Given: - * ``` + * ```html *
    ...
    * ``` * * the generated code is: - * ``` + * ```ts * var _c1 = [AttributeMarker.Styles, 'width', '100px', 'height'. '200px', 'color', 'red']; * ``` */ @@ -256,13 +256,13 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *
    * ``` * * the generated code is: * - * ``` + * ```ts * var _c1 = ['moo', 'car', AttributeMarker.Bindings, 'foo', 'bar']; * ``` */ @@ -273,7 +273,7 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *
    * ``` * @@ -298,7 +298,7 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *

    * ``` * @@ -315,14 +315,15 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *
    * ``` * * the generated code is: * - * ``` + * ```ts * var _c1 = ['moo', 'car', AttributeMarker.I18n, 'foo', 'bar']; + * ``` */ I18n = 6, } diff --git a/packages/compiler/src/expression_parser/ast.ts b/packages/compiler/src/expression_parser/ast.ts index 89259539cb48..49f9c919b036 100644 --- a/packages/compiler/src/expression_parser/ast.ts +++ b/packages/compiler/src/expression_parser/ast.ts @@ -382,7 +382,7 @@ export class TypeofExpression extends AST { super(span, sourceSpan); } override visit(visitor: AstVisitor, context: any = null): any { - return visitor.visitTypeofExpresion(this, context); + return visitor.visitTypeofExpression(this, context); } } @@ -429,6 +429,34 @@ export class SafeCall extends AST { } } +export class TemplateLiteral extends AST { + constructor( + span: ParseSpan, + sourceSpan: AbsoluteSourceSpan, + public elements: TemplateLiteralElement[], + public expressions: AST[], + ) { + super(span, sourceSpan); + } + + override visit(visitor: AstVisitor, context?: any) { + return visitor.visitTemplateLiteral(this, context); + } +} +export class TemplateLiteralElement extends AST { + constructor( + span: ParseSpan, + sourceSpan: AbsoluteSourceSpan, + public text: string, + ) { + super(span, sourceSpan); + } + + override visit(visitor: AstVisitor, context?: any) { + return visitor.visitTemplateLiteralElement(this, context); + } +} + /** * Records the absolute position of a text span in a source file, where `start` and `end` are the * starting and ending byte offsets, respectively, of the text span in a source file. @@ -547,7 +575,7 @@ export interface AstVisitor { visitLiteralPrimitive(ast: LiteralPrimitive, context: any): any; visitPipe(ast: BindingPipe, context: any): any; visitPrefixNot(ast: PrefixNot, context: any): any; - visitTypeofExpresion(ast: TypeofExpression, context: any): any; + visitTypeofExpression(ast: TypeofExpression, context: any): any; visitNonNullAssert(ast: NonNullAssert, context: any): any; visitPropertyRead(ast: PropertyRead, context: any): any; visitPropertyWrite(ast: PropertyWrite, context: any): any; @@ -555,6 +583,8 @@ export interface AstVisitor { visitSafeKeyedRead(ast: SafeKeyedRead, context: any): any; visitCall(ast: Call, context: any): any; visitSafeCall(ast: SafeCall, context: any): any; + visitTemplateLiteral(ast: TemplateLiteral, context: any): any; + visitTemplateLiteralElement(ast: TemplateLiteralElement, context: any): any; visitASTWithSource?(ast: ASTWithSource, context: any): any; /** * This function is optionally defined to allow classes that implement this @@ -615,7 +645,7 @@ export class RecursiveAstVisitor implements AstVisitor { visitPrefixNot(ast: PrefixNot, context: any): any { this.visit(ast.expression, context); } - visitTypeofExpresion(ast: TypeofExpression, context: any) { + visitTypeofExpression(ast: TypeofExpression, context: any) { this.visit(ast.expression, context); } visitNonNullAssert(ast: NonNullAssert, context: any): any { @@ -643,374 +673,24 @@ export class RecursiveAstVisitor implements AstVisitor { this.visit(ast.receiver, context); this.visitAll(ast.args, context); } - // This is not part of the AstVisitor interface, just a helper method - visitAll(asts: AST[], context: any): any { - for (const ast of asts) { - this.visit(ast, context); - } - } -} - -export class AstTransformer implements AstVisitor { - visitImplicitReceiver(ast: ImplicitReceiver, context: any): AST { - return ast; - } - - visitThisReceiver(ast: ThisReceiver, context: any): AST { - return ast; - } - - visitInterpolation(ast: Interpolation, context: any): AST { - return new Interpolation(ast.span, ast.sourceSpan, ast.strings, this.visitAll(ast.expressions)); - } - - visitLiteralPrimitive(ast: LiteralPrimitive, context: any): AST { - return new LiteralPrimitive(ast.span, ast.sourceSpan, ast.value); - } - - visitPropertyRead(ast: PropertyRead, context: any): AST { - return new PropertyRead( - ast.span, - ast.sourceSpan, - ast.nameSpan, - ast.receiver.visit(this), - ast.name, - ); - } - - visitPropertyWrite(ast: PropertyWrite, context: any): AST { - return new PropertyWrite( - ast.span, - ast.sourceSpan, - ast.nameSpan, - ast.receiver.visit(this), - ast.name, - ast.value.visit(this), - ); - } - - visitSafePropertyRead(ast: SafePropertyRead, context: any): AST { - return new SafePropertyRead( - ast.span, - ast.sourceSpan, - ast.nameSpan, - ast.receiver.visit(this), - ast.name, - ); - } - - visitLiteralArray(ast: LiteralArray, context: any): AST { - return new LiteralArray(ast.span, ast.sourceSpan, this.visitAll(ast.expressions)); - } - - visitLiteralMap(ast: LiteralMap, context: any): AST { - return new LiteralMap(ast.span, ast.sourceSpan, ast.keys, this.visitAll(ast.values)); - } - - visitUnary(ast: Unary, context: any): AST { - switch (ast.operator) { - case '+': - return Unary.createPlus(ast.span, ast.sourceSpan, ast.expr.visit(this)); - case '-': - return Unary.createMinus(ast.span, ast.sourceSpan, ast.expr.visit(this)); - default: - throw new Error(`Unknown unary operator ${ast.operator}`); - } - } - - visitBinary(ast: Binary, context: any): AST { - return new Binary( - ast.span, - ast.sourceSpan, - ast.operation, - ast.left.visit(this), - ast.right.visit(this), - ); - } - - visitPrefixNot(ast: PrefixNot, context: any): AST { - return new PrefixNot(ast.span, ast.sourceSpan, ast.expression.visit(this)); - } - - visitTypeofExpresion(ast: TypeofExpression, context: any): AST { - return new TypeofExpression(ast.span, ast.sourceSpan, ast.expression.visit(this)); - } - - visitNonNullAssert(ast: NonNullAssert, context: any): AST { - return new NonNullAssert(ast.span, ast.sourceSpan, ast.expression.visit(this)); - } - - visitConditional(ast: Conditional, context: any): AST { - return new Conditional( - ast.span, - ast.sourceSpan, - ast.condition.visit(this), - ast.trueExp.visit(this), - ast.falseExp.visit(this), - ); - } - - visitPipe(ast: BindingPipe, context: any): AST { - return new BindingPipe( - ast.span, - ast.sourceSpan, - ast.exp.visit(this), - ast.name, - this.visitAll(ast.args), - ast.nameSpan, - ); - } - - visitKeyedRead(ast: KeyedRead, context: any): AST { - return new KeyedRead(ast.span, ast.sourceSpan, ast.receiver.visit(this), ast.key.visit(this)); - } - - visitKeyedWrite(ast: KeyedWrite, context: any): AST { - return new KeyedWrite( - ast.span, - ast.sourceSpan, - ast.receiver.visit(this), - ast.key.visit(this), - ast.value.visit(this), - ); - } - - visitCall(ast: Call, context: any): AST { - return new Call( - ast.span, - ast.sourceSpan, - ast.receiver.visit(this), - this.visitAll(ast.args), - ast.argumentSpan, - ); - } - - visitSafeCall(ast: SafeCall, context: any): AST { - return new SafeCall( - ast.span, - ast.sourceSpan, - ast.receiver.visit(this), - this.visitAll(ast.args), - ast.argumentSpan, - ); - } - - visitAll(asts: any[]): any[] { - const res = []; - for (let i = 0; i < asts.length; ++i) { - res[i] = asts[i].visit(this); - } - return res; - } - - visitChain(ast: Chain, context: any): AST { - return new Chain(ast.span, ast.sourceSpan, this.visitAll(ast.expressions)); - } - - visitSafeKeyedRead(ast: SafeKeyedRead, context: any): AST { - return new SafeKeyedRead( - ast.span, - ast.sourceSpan, - ast.receiver.visit(this), - ast.key.visit(this), - ); - } -} - -// A transformer that only creates new nodes if the transformer makes a change or -// a change is made a child node. -export class AstMemoryEfficientTransformer implements AstVisitor { - visitImplicitReceiver(ast: ImplicitReceiver, context: any): AST { - return ast; - } - - visitThisReceiver(ast: ThisReceiver, context: any): AST { - return ast; - } - - visitInterpolation(ast: Interpolation, context: any): Interpolation { - const expressions = this.visitAll(ast.expressions); - if (expressions !== ast.expressions) - return new Interpolation(ast.span, ast.sourceSpan, ast.strings, expressions); - return ast; - } - - visitLiteralPrimitive(ast: LiteralPrimitive, context: any): AST { - return ast; - } + visitTemplateLiteral(ast: TemplateLiteral, context: any) { + // Iterate in the declaration order. Note that there will + // always be one expression less than the number of elements. + for (let i = 0; i < ast.elements.length; i++) { + this.visit(ast.elements[i], context); - visitPropertyRead(ast: PropertyRead, context: any): AST { - const receiver = ast.receiver.visit(this); - if (receiver !== ast.receiver) { - return new PropertyRead(ast.span, ast.sourceSpan, ast.nameSpan, receiver, ast.name); - } - return ast; - } - - visitPropertyWrite(ast: PropertyWrite, context: any): AST { - const receiver = ast.receiver.visit(this); - const value = ast.value.visit(this); - if (receiver !== ast.receiver || value !== ast.value) { - return new PropertyWrite(ast.span, ast.sourceSpan, ast.nameSpan, receiver, ast.name, value); - } - return ast; - } - - visitSafePropertyRead(ast: SafePropertyRead, context: any): AST { - const receiver = ast.receiver.visit(this); - if (receiver !== ast.receiver) { - return new SafePropertyRead(ast.span, ast.sourceSpan, ast.nameSpan, receiver, ast.name); - } - return ast; - } - - visitLiteralArray(ast: LiteralArray, context: any): AST { - const expressions = this.visitAll(ast.expressions); - if (expressions !== ast.expressions) { - return new LiteralArray(ast.span, ast.sourceSpan, expressions); - } - return ast; - } - - visitLiteralMap(ast: LiteralMap, context: any): AST { - const values = this.visitAll(ast.values); - if (values !== ast.values) { - return new LiteralMap(ast.span, ast.sourceSpan, ast.keys, values); - } - return ast; - } - - visitUnary(ast: Unary, context: any): AST { - const expr = ast.expr.visit(this); - if (expr !== ast.expr) { - switch (ast.operator) { - case '+': - return Unary.createPlus(ast.span, ast.sourceSpan, expr); - case '-': - return Unary.createMinus(ast.span, ast.sourceSpan, expr); - default: - throw new Error(`Unknown unary operator ${ast.operator}`); + const expression = i < ast.expressions.length ? ast.expressions[i] : null; + if (expression !== null) { + this.visit(expression, context); } } - return ast; } - - visitBinary(ast: Binary, context: any): AST { - const left = ast.left.visit(this); - const right = ast.right.visit(this); - if (left !== ast.left || right !== ast.right) { - return new Binary(ast.span, ast.sourceSpan, ast.operation, left, right); - } - return ast; - } - - visitPrefixNot(ast: PrefixNot, context: any): AST { - const expression = ast.expression.visit(this); - if (expression !== ast.expression) { - return new PrefixNot(ast.span, ast.sourceSpan, expression); - } - return ast; - } - - visitTypeofExpresion(ast: TypeofExpression, context: any): AST { - const expression = ast.expression.visit(this); - if (expression !== ast.expression) { - return new TypeofExpression(ast.span, ast.sourceSpan, expression); - } - return ast; - } - - visitNonNullAssert(ast: NonNullAssert, context: any): AST { - const expression = ast.expression.visit(this); - if (expression !== ast.expression) { - return new NonNullAssert(ast.span, ast.sourceSpan, expression); - } - return ast; - } - - visitConditional(ast: Conditional, context: any): AST { - const condition = ast.condition.visit(this); - const trueExp = ast.trueExp.visit(this); - const falseExp = ast.falseExp.visit(this); - if (condition !== ast.condition || trueExp !== ast.trueExp || falseExp !== ast.falseExp) { - return new Conditional(ast.span, ast.sourceSpan, condition, trueExp, falseExp); - } - return ast; - } - - visitPipe(ast: BindingPipe, context: any): AST { - const exp = ast.exp.visit(this); - const args = this.visitAll(ast.args); - if (exp !== ast.exp || args !== ast.args) { - return new BindingPipe(ast.span, ast.sourceSpan, exp, ast.name, args, ast.nameSpan); - } - return ast; - } - - visitKeyedRead(ast: KeyedRead, context: any): AST { - const obj = ast.receiver.visit(this); - const key = ast.key.visit(this); - if (obj !== ast.receiver || key !== ast.key) { - return new KeyedRead(ast.span, ast.sourceSpan, obj, key); - } - return ast; - } - - visitKeyedWrite(ast: KeyedWrite, context: any): AST { - const obj = ast.receiver.visit(this); - const key = ast.key.visit(this); - const value = ast.value.visit(this); - if (obj !== ast.receiver || key !== ast.key || value !== ast.value) { - return new KeyedWrite(ast.span, ast.sourceSpan, obj, key, value); - } - return ast; - } - - visitAll(asts: any[]): any[] { - const res = []; - let modified = false; - for (let i = 0; i < asts.length; ++i) { - const original = asts[i]; - const value = original.visit(this); - res[i] = value; - modified = modified || value !== original; - } - return modified ? res : asts; - } - - visitChain(ast: Chain, context: any): AST { - const expressions = this.visitAll(ast.expressions); - if (expressions !== ast.expressions) { - return new Chain(ast.span, ast.sourceSpan, expressions); - } - return ast; - } - - visitCall(ast: Call, context: any): AST { - const receiver = ast.receiver.visit(this); - const args = this.visitAll(ast.args); - if (receiver !== ast.receiver || args !== ast.args) { - return new Call(ast.span, ast.sourceSpan, receiver, args, ast.argumentSpan); - } - return ast; - } - - visitSafeCall(ast: SafeCall, context: any): AST { - const receiver = ast.receiver.visit(this); - const args = this.visitAll(ast.args); - if (receiver !== ast.receiver || args !== ast.args) { - return new SafeCall(ast.span, ast.sourceSpan, receiver, args, ast.argumentSpan); - } - return ast; - } - - visitSafeKeyedRead(ast: SafeKeyedRead, context: any): AST { - const obj = ast.receiver.visit(this); - const key = ast.key.visit(this); - if (obj !== ast.receiver || key !== ast.key) { - return new SafeKeyedRead(ast.span, ast.sourceSpan, obj, key); + visitTemplateLiteralElement(ast: TemplateLiteralElement, context: any) {} + // This is not part of the AstVisitor interface, just a helper method + visitAll(asts: AST[], context: any): any { + for (const ast of asts) { + this.visit(ast, context); } - return ast; } } diff --git a/packages/compiler/src/expression_parser/lexer.ts b/packages/compiler/src/expression_parser/lexer.ts index 25cd2b3cb7f6..83de92c6694f 100644 --- a/packages/compiler/src/expression_parser/lexer.ts +++ b/packages/compiler/src/expression_parser/lexer.ts @@ -19,6 +19,12 @@ export enum TokenType { Error, } +export enum StringTokenKind { + Plain, + TemplateLiteralPart, + TemplateLiteralEnd, +} + const KEYWORDS = [ 'var', 'let', @@ -35,14 +41,7 @@ const KEYWORDS = [ export class Lexer { tokenize(text: string): Token[] { - const scanner = new _Scanner(text); - const tokens: Token[] = []; - let token = scanner.scanToken(); - while (token != null) { - tokens.push(token); - token = scanner.scanToken(); - } - return tokens; + return new _Scanner(text).scan(); } } @@ -56,59 +55,59 @@ export class Token { ) {} isCharacter(code: number): boolean { - return this.type == TokenType.Character && this.numValue == code; + return this.type === TokenType.Character && this.numValue === code; } isNumber(): boolean { - return this.type == TokenType.Number; + return this.type === TokenType.Number; } - isString(): boolean { - return this.type == TokenType.String; + isString(): this is StringToken { + return this.type === TokenType.String; } isOperator(operator: string): boolean { - return this.type == TokenType.Operator && this.strValue == operator; + return this.type === TokenType.Operator && this.strValue === operator; } isIdentifier(): boolean { - return this.type == TokenType.Identifier; + return this.type === TokenType.Identifier; } isPrivateIdentifier(): boolean { - return this.type == TokenType.PrivateIdentifier; + return this.type === TokenType.PrivateIdentifier; } isKeyword(): boolean { - return this.type == TokenType.Keyword; + return this.type === TokenType.Keyword; } isKeywordLet(): boolean { - return this.type == TokenType.Keyword && this.strValue == 'let'; + return this.type === TokenType.Keyword && this.strValue === 'let'; } isKeywordAs(): boolean { - return this.type == TokenType.Keyword && this.strValue == 'as'; + return this.type === TokenType.Keyword && this.strValue === 'as'; } isKeywordNull(): boolean { - return this.type == TokenType.Keyword && this.strValue == 'null'; + return this.type === TokenType.Keyword && this.strValue === 'null'; } isKeywordUndefined(): boolean { - return this.type == TokenType.Keyword && this.strValue == 'undefined'; + return this.type === TokenType.Keyword && this.strValue === 'undefined'; } isKeywordTrue(): boolean { - return this.type == TokenType.Keyword && this.strValue == 'true'; + return this.type === TokenType.Keyword && this.strValue === 'true'; } isKeywordFalse(): boolean { - return this.type == TokenType.Keyword && this.strValue == 'false'; + return this.type === TokenType.Keyword && this.strValue === 'false'; } isKeywordThis(): boolean { - return this.type == TokenType.Keyword && this.strValue == 'this'; + return this.type === TokenType.Keyword && this.strValue === 'this'; } isKeywordTypeof(): boolean { @@ -116,11 +115,27 @@ export class Token { } isError(): boolean { - return this.type == TokenType.Error; + return this.type === TokenType.Error; } toNumber(): number { - return this.type == TokenType.Number ? this.numValue : -1; + return this.type === TokenType.Number ? this.numValue : -1; + } + + isTemplateLiteralPart(): this is StringToken { + return this.isString() && this.kind === StringTokenKind.TemplateLiteralPart; + } + + isTemplateLiteralEnd(): this is StringToken { + return this.isString() && this.kind === StringTokenKind.TemplateLiteralEnd; + } + + isTemplateLiteralInterpolationStart(): boolean { + return this.isOperator('${'); + } + + isTemplateLiteralInterpolationEnd(): boolean { + return this.isOperator('}'); } toString(): string | null { @@ -141,6 +156,17 @@ export class Token { } } +export class StringToken extends Token { + constructor( + index: number, + end: number, + strValue: string, + readonly kind: StringTokenKind, + ) { + super(index, end, TokenType.String, 0, strValue); + } +} + function newCharacterToken(index: number, end: number, code: number): Token { return new Token(index, end, TokenType.Character, code, String.fromCharCode(code)); } @@ -161,10 +187,6 @@ function newOperatorToken(index: number, end: number, text: string): Token { return new Token(index, end, TokenType.Operator, 0, text); } -function newStringToken(index: number, end: number, text: string): Token { - return new Token(index, end, TokenType.String, 0, text); -} - function newNumberToken(index: number, end: number, n: number): Token { return new Token(index, end, TokenType.Number, n, ''); } @@ -176,24 +198,38 @@ function newErrorToken(index: number, end: number, message: string): Token { export const EOF: Token = new Token(-1, -1, TokenType.Character, 0, ''); class _Scanner { - length: number; - peek: number = 0; - index: number = -1; - - constructor(public input: string) { + private readonly tokens: Token[] = []; + private readonly length: number; + private peek = 0; + private index = -1; + private literalInterpolationDepth = 0; + private braceDepth = 0; + + constructor(private readonly input: string) { this.length = input.length; this.advance(); } - advance() { + scan(): Token[] { + let token = this.scanToken(); + + while (token !== null) { + this.tokens.push(token); + token = this.scanToken(); + } + + return this.tokens; + } + + private advance() { this.peek = ++this.index >= this.length ? chars.$EOF : this.input.charCodeAt(this.index); } - scanToken(): Token | null { - const input = this.input, - length = this.length; - let peek = this.peek, - index = this.index; + private scanToken(): Token | null { + const input = this.input; + const length = this.length; + let peek = this.peek; + let index = this.index; // Skip whitespace. while (peek <= chars.$SPACE) { @@ -213,8 +249,13 @@ class _Scanner { } // Handle identifiers and numbers. - if (isIdentifierStart(peek)) return this.scanIdentifier(); - if (chars.isDigit(peek)) return this.scanNumber(index); + if (isIdentifierStart(peek)) { + return this.scanIdentifier(); + } + + if (chars.isDigit(peek)) { + return this.scanNumber(index); + } const start: number = index; switch (peek) { @@ -225,17 +266,22 @@ class _Scanner { : newCharacterToken(start, this.index, chars.$PERIOD); case chars.$LPAREN: case chars.$RPAREN: - case chars.$LBRACE: - case chars.$RBRACE: case chars.$LBRACKET: case chars.$RBRACKET: case chars.$COMMA: case chars.$COLON: case chars.$SEMICOLON: return this.scanCharacter(start, peek); + case chars.$LBRACE: + return this.scanOpenBrace(start, peek); + case chars.$RBRACE: + return this.scanCloseBrace(start, peek); case chars.$SQ: case chars.$DQ: return this.scanString(); + case chars.$BT: + this.advance(); + return this.scanTemplateLiteralPart(start); case chars.$HASH: return this.scanPrivateIdentifier(); case chars.$PLUS: @@ -273,16 +319,35 @@ class _Scanner { return this.error(`Unexpected character [${String.fromCharCode(peek)}]`, 0); } - scanCharacter(start: number, code: number): Token { + private scanCharacter(start: number, code: number): Token { this.advance(); return newCharacterToken(start, this.index, code); } - scanOperator(start: number, str: string): Token { + private scanOperator(start: number, str: string): Token { this.advance(); return newOperatorToken(start, this.index, str); } + private scanOpenBrace(start: number, code: number): Token { + this.braceDepth++; + this.advance(); + return newCharacterToken(start, this.index, code); + } + + private scanCloseBrace(start: number, code: number): Token { + this.advance(); + + if (this.braceDepth === 0 && this.literalInterpolationDepth > 0) { + this.literalInterpolationDepth--; + this.tokens.push(newOperatorToken(start, this.index, '}')); + return this.scanTemplateLiteralPart(this.index); + } + + this.braceDepth--; + return newCharacterToken(start, this.index, code); + } + /** * Tokenize a 2/3 char long operator * @@ -293,7 +358,7 @@ class _Scanner { * @param threeCode code point for the third symbol * @param three third symbol (part of the operator when provided and matches source expression) */ - scanComplexOperator( + private scanComplexOperator( start: number, one: string, twoCode: number, @@ -314,7 +379,7 @@ class _Scanner { return newOperatorToken(start, this.index, str); } - scanIdentifier(): Token { + private scanIdentifier(): Token { const start: number = this.index; this.advance(); while (isIdentifierPart(this.peek)) this.advance(); @@ -325,7 +390,7 @@ class _Scanner { } /** Scans an ECMAScript private identifier. */ - scanPrivateIdentifier(): Token { + private scanPrivateIdentifier(): Token { const start: number = this.index; this.advance(); if (!isIdentifierStart(this.peek)) { @@ -336,7 +401,7 @@ class _Scanner { return newPrivateIdentifierToken(start, this.index, identifierName); } - scanNumber(start: number): Token { + private scanNumber(start: number): Token { let simple = this.index === start; let hasSeparators = false; this.advance(); // Skip initial digit. @@ -377,37 +442,22 @@ class _Scanner { return newNumberToken(start, this.index, value); } - scanString(): Token { - const start: number = this.index; - const quote: number = this.peek; + private scanString(): Token { + const start = this.index; + const quote = this.peek; this.advance(); // Skip initial quote. - let buffer: string = ''; - let marker: number = this.index; - const input: string = this.input; + let buffer = ''; + let marker = this.index; + const input = this.input; while (this.peek != quote) { if (this.peek == chars.$BACKSLASH) { - buffer += input.substring(marker, this.index); - let unescapedCode: number; - this.advance(); // mutates this.peek - // @ts-expect-error see microsoft/TypeScript#9998 - if (this.peek == chars.$u) { - // 4 character hex code for unicode character. - const hex: string = input.substring(this.index + 1, this.index + 5); - if (/^[0-9a-f]+$/i.test(hex)) { - unescapedCode = parseInt(hex, 16); - } else { - return this.error(`Invalid unicode escape [\\u${hex}]`, 0); - } - for (let i: number = 0; i < 5; i++) { - this.advance(); - } - } else { - unescapedCode = unescape(this.peek); - this.advance(); + const result = this.scanStringBackslash(buffer, marker); + if (typeof result !== 'string') { + return result; // Error } - buffer += String.fromCharCode(unescapedCode); + buffer = result; marker = this.index; } else if (this.peek == chars.$EOF) { return this.error('Unterminated quote', 0); @@ -419,10 +469,10 @@ class _Scanner { const last: string = input.substring(marker, this.index); this.advance(); // Skip terminating quote. - return newStringToken(start, this.index, buffer + last); + return new StringToken(start, this.index, buffer + last, StringTokenKind.Plain); } - scanQuestion(start: number): Token { + private scanQuestion(start: number): Token { this.advance(); let str: string = '?'; // Either `a ?? b` or 'a?.b'. @@ -433,13 +483,81 @@ class _Scanner { return newOperatorToken(start, this.index, str); } - error(message: string, offset: number): Token { + private scanTemplateLiteralPart(start: number): Token { + let buffer = ''; + let marker = this.index; + + while (this.peek !== chars.$BT) { + if (this.peek === chars.$BACKSLASH) { + const result = this.scanStringBackslash(buffer, marker); + if (typeof result !== 'string') { + return result; // Error + } + buffer = result; + marker = this.index; + } else if (this.peek === chars.$$) { + const dollar = this.index; + this.advance(); + + // @ts-expect-error + if (this.peek === chars.$LBRACE) { + this.literalInterpolationDepth++; + this.tokens.push( + new StringToken( + start, + dollar, + buffer + this.input.substring(marker, dollar), + StringTokenKind.TemplateLiteralPart, + ), + ); + this.advance(); + return newOperatorToken(dollar, this.index, this.input.substring(dollar, this.index)); + } + } else if (this.peek === chars.$EOF) { + return this.error('Unterminated template literal', 0); + } else { + this.advance(); + } + } + + const last = this.input.substring(marker, this.index); + this.advance(); + return new StringToken(start, this.index, buffer + last, StringTokenKind.TemplateLiteralEnd); + } + + private error(message: string, offset: number): Token & {type: TokenType.Error} { const position: number = this.index + offset; return newErrorToken( position, this.index, `Lexer Error: ${message} at column ${position} in expression [${this.input}]`, - ); + ) as Token & {type: TokenType.Error}; + } + + private scanStringBackslash( + buffer: string, + marker: number, + ): string | (Token & {type: TokenType.Error}) { + buffer += this.input.substring(marker, this.index); + let unescapedCode: number; + this.advance(); + if (this.peek === chars.$u) { + // 4 character hex code for unicode character. + const hex: string = this.input.substring(this.index + 1, this.index + 5); + if (/^[0-9a-f]+$/i.test(hex)) { + unescapedCode = parseInt(hex, 16); + } else { + return this.error(`Invalid unicode escape [\\u${hex}]`, 0); + } + for (let i = 0; i < 5; i++) { + this.advance(); + } + } else { + unescapedCode = unescape(this.peek); + this.advance(); + } + buffer += String.fromCharCode(unescapedCode); + return buffer; } } diff --git a/packages/compiler/src/expression_parser/parser.ts b/packages/compiler/src/expression_parser/parser.ts index 429626ff5ec2..0661067e30f5 100644 --- a/packages/compiler/src/expression_parser/parser.ts +++ b/packages/compiler/src/expression_parser/parser.ts @@ -49,8 +49,10 @@ import { ThisReceiver, Unary, VariableBinding, + TemplateLiteral, + TemplateLiteralElement, } from './ast'; -import {EOF, Lexer, Token, TokenType} from './lexer'; +import {EOF, Lexer, StringTokenKind, Token, TokenType} from './lexer'; export interface InterpolationPiece { text: string; @@ -176,7 +178,7 @@ export class Parser { * parsing errors in case the given expression is invalid. * * For example, - * ``` + * ```html *
    * ^ ^ absoluteValueOffset for `templateValue` * absoluteKeyOffset for `templateKey` @@ -187,7 +189,7 @@ export class Parser { * 3. ngForOf -> items * * This is apparent from the de-sugared template: - * ``` + * ```html * * ``` * @@ -1037,7 +1039,11 @@ class _ParseAST { const value = this.next.toNumber(); this.advance(); return new LiteralPrimitive(this.span(start), this.sourceSpan(start), value); - } else if (this.next.isString()) { + } else if (this.next.isTemplateLiteralEnd()) { + return this.parseNoInterpolationTemplateLiteral(start); + } else if (this.next.isTemplateLiteralPart()) { + return this.parseTemplateLiteral(); + } else if (this.next.isString() && this.next.kind === StringTokenKind.Plain) { const literalValue = this.next.toString(); this.advance(); return new LiteralPrimitive(this.span(start), this.sourceSpan(start), literalValue); @@ -1215,7 +1221,7 @@ class _ParseAST { * parsing errors in case the given expression is invalid. * * For example, - * ``` + * ```html *
    * ``` * contains five bindings: @@ -1400,6 +1406,55 @@ class _ParseAST { return new VariableBinding(sourceSpan, key, value); } + private parseNoInterpolationTemplateLiteral(start: number): AST { + const text = this.next.strValue; + this.advance(); + const span = this.span(start); + const sourceSpan = this.sourceSpan(start); + return new TemplateLiteral( + span, + sourceSpan, + [new TemplateLiteralElement(span, sourceSpan, text)], + [], + ); + } + + private parseTemplateLiteral(): AST { + const start = this.inputIndex; + const elements: TemplateLiteralElement[] = []; + const expressions: AST[] = []; + + while (this.next !== EOF) { + const token = this.next; + + if (token.isTemplateLiteralPart() || token.isTemplateLiteralEnd()) { + elements.push( + new TemplateLiteralElement( + this.span(this.inputIndex), + this.sourceSpan(this.inputIndex), + token.strValue, + ), + ); + this.advance(); + if (token.isTemplateLiteralEnd()) { + break; + } + } else if (token.isTemplateLiteralInterpolationStart()) { + this.advance(); + const expression = this.parsePipe(); + if (expression instanceof EmptyExpr) { + this.error('Template literal interpolation cannot be empty'); + } else { + expressions.push(expression); + } + } else { + this.advance(); + } + } + + return new TemplateLiteral(this.span(start), this.sourceSpan(start), elements, expressions); + } + /** * Consume the optional statement terminator: semicolon or comma. */ diff --git a/packages/compiler/src/expression_parser/serializer.ts b/packages/compiler/src/expression_parser/serializer.ts index 6cc2dc670c34..2c6d86b02d2f 100644 --- a/packages/compiler/src/expression_parser/serializer.ts +++ b/packages/compiler/src/expression_parser/serializer.ts @@ -136,13 +136,29 @@ class SerializeExpressionVisitor implements expr.AstVisitor { .join(', ')})`; } - visitTypeofExpresion(ast: expr.TypeofExpression, context: any) { + visitTypeofExpression(ast: expr.TypeofExpression, context: any) { return `typeof ${ast.expression.visit(this, context)}`; } visitASTWithSource(ast: expr.ASTWithSource, context: any): string { return ast.ast.visit(this, context); } + + visitTemplateLiteral(ast: expr.TemplateLiteral, context: any) { + let result = ''; + for (let i = 0; i < ast.elements.length; i++) { + result += ast.elements[i].visit(this, context); + const expression = i < ast.expressions.length ? ast.expressions[i] : null; + if (expression !== null) { + result += '${' + expression.visit(this, context) + '}'; + } + } + return '`' + result + '`'; + } + + visitTemplateLiteralElement(ast: expr.TemplateLiteralElement, context: any) { + return ast.text; + } } /** Zips the two input arrays into a single array of pairs of elements at the same index. */ diff --git a/packages/compiler/src/output/abstract_emitter.ts b/packages/compiler/src/output/abstract_emitter.ts index 245db09be0a8..431de68b1c68 100644 --- a/packages/compiler/src/output/abstract_emitter.ts +++ b/packages/compiler/src/output/abstract_emitter.ts @@ -299,16 +299,29 @@ export abstract class AbstractEmitterVisitor implements o.StatementVisitor, o.Ex ctx.print(expr, `)`); return null; } - visitTaggedTemplateExpr(expr: o.TaggedTemplateExpr, ctx: EmitterVisitorContext): any { + visitTaggedTemplateLiteralExpr( + expr: o.TaggedTemplateLiteralExpr, + ctx: EmitterVisitorContext, + ): any { expr.tag.visitExpression(this, ctx); - ctx.print(expr, '`' + expr.template.elements[0].rawText); - for (let i = 1; i < expr.template.elements.length; i++) { - ctx.print(expr, '${'); - expr.template.expressions[i - 1].visitExpression(this, ctx); - ctx.print(expr, `}${expr.template.elements[i].rawText}`); + expr.template.visitExpression(this, ctx); + return null; + } + visitTemplateLiteralExpr(expr: o.TemplateLiteralExpr, ctx: EmitterVisitorContext) { + ctx.print(expr, '`'); + for (let i = 0; i < expr.elements.length; i++) { + expr.elements[i].visitExpression(this, ctx); + const expression = i < expr.expressions.length ? expr.expressions[i] : null; + if (expression !== null) { + ctx.print(expression, '${'); + expression.visitExpression(this, ctx); + ctx.print(expression, '}'); + } } ctx.print(expr, '`'); - return null; + } + visitTemplateLiteralElementExpr(expr: o.TemplateLiteralElementExpr, ctx: EmitterVisitorContext) { + ctx.print(expr, expr.rawText); } visitWrappedNodeExpr(ast: o.WrappedNodeExpr, ctx: EmitterVisitorContext): any { throw new Error('Abstract emitter cannot visit WrappedNodeExpr.'); diff --git a/packages/compiler/src/output/abstract_js_emitter.ts b/packages/compiler/src/output/abstract_js_emitter.ts index 285b67afa75f..27e2ef5efbd5 100644 --- a/packages/compiler/src/output/abstract_js_emitter.ts +++ b/packages/compiler/src/output/abstract_js_emitter.ts @@ -42,7 +42,10 @@ export abstract class AbstractJsEmitterVisitor extends AbstractEmitterVisitor { ctx.println(stmt, `;`); return null; } - override visitTaggedTemplateExpr(ast: o.TaggedTemplateExpr, ctx: EmitterVisitorContext): any { + override visitTaggedTemplateLiteralExpr( + ast: o.TaggedTemplateLiteralExpr, + ctx: EmitterVisitorContext, + ): any { // The following convoluted piece of code is effectively the downlevelled equivalent of // ``` // tag`...` @@ -66,6 +69,26 @@ export abstract class AbstractJsEmitterVisitor extends AbstractEmitterVisitor { ctx.print(ast, ')'); return null; } + override visitTemplateLiteralExpr(expr: o.TemplateLiteralExpr, ctx: EmitterVisitorContext): any { + ctx.print(expr, '`'); + for (let i = 0; i < expr.elements.length; i++) { + expr.elements[i].visitExpression(this, ctx); + const expression = i < expr.expressions.length ? expr.expressions[i] : null; + if (expression !== null) { + ctx.print(expression, '${'); + expression.visitExpression(this, ctx); + ctx.print(expression, '}'); + } + } + ctx.print(expr, '`'); + } + override visitTemplateLiteralElementExpr( + expr: o.TemplateLiteralElementExpr, + ctx: EmitterVisitorContext, + ): any { + ctx.print(expr, expr.rawText); + return null; + } override visitFunctionExpr(ast: o.FunctionExpr, ctx: EmitterVisitorContext): any { ctx.print(ast, `function${ast.name ? ' ' + ast.name : ''}(`); this._visitParams(ast.params, ctx); diff --git a/packages/compiler/src/output/output_ast.ts b/packages/compiler/src/output/output_ast.ts index d5b1bf3458d0..49bbcc6f57a2 100644 --- a/packages/compiler/src/output/output_ast.ts +++ b/packages/compiler/src/output/output_ast.ts @@ -552,10 +552,10 @@ export class InvokeFunctionExpr extends Expression { } } -export class TaggedTemplateExpr extends Expression { +export class TaggedTemplateLiteralExpr extends Expression { constructor( public tag: Expression, - public template: TemplateLiteral, + public template: TemplateLiteralExpr, type?: Type | null, sourceSpan?: ParseSourceSpan | null, ) { @@ -564,14 +564,9 @@ export class TaggedTemplateExpr extends Expression { override isEquivalent(e: Expression): boolean { return ( - e instanceof TaggedTemplateExpr && + e instanceof TaggedTemplateLiteralExpr && this.tag.isEquivalent(e.tag) && - areAllEquivalentPredicate( - this.template.elements, - e.template.elements, - (a, b) => a.text === b.text, - ) && - areAllEquivalent(this.template.expressions, e.template.expressions) + this.template.isEquivalent(e.template) ); } @@ -580,11 +575,11 @@ export class TaggedTemplateExpr extends Expression { } override visitExpression(visitor: ExpressionVisitor, context: any): any { - return visitor.visitTaggedTemplateExpr(this, context); + return visitor.visitTaggedTemplateLiteralExpr(this, context); } - override clone(): TaggedTemplateExpr { - return new TaggedTemplateExpr( + override clone(): TaggedTemplateLiteralExpr { + return new TaggedTemplateLiteralExpr( this.tag.clone(), this.template.clone(), this.type, @@ -655,26 +650,48 @@ export class LiteralExpr extends Expression { } } -export class TemplateLiteral { +export class TemplateLiteralExpr extends Expression { constructor( - public elements: TemplateLiteralElement[], + public elements: TemplateLiteralElementExpr[], public expressions: Expression[], - ) {} + sourceSpan?: ParseSourceSpan | null, + ) { + super(null, sourceSpan); + } + + override isEquivalent(e: Expression): boolean { + return ( + e instanceof TemplateLiteralExpr && + areAllEquivalentPredicate(this.elements, e.elements, (a, b) => a.text === b.text) && + areAllEquivalent(this.expressions, e.expressions) + ); + } - clone(): TemplateLiteral { - return new TemplateLiteral( + override isConstant() { + return false; + } + + override visitExpression(visitor: ExpressionVisitor, context: any): any { + return visitor.visitTemplateLiteralExpr(this, context); + } + + override clone(): TemplateLiteralExpr { + return new TemplateLiteralExpr( this.elements.map((el) => el.clone()), this.expressions.map((expr) => expr.clone()), ); } } -export class TemplateLiteralElement { +export class TemplateLiteralElementExpr extends Expression { rawText: string; + constructor( public text: string, - public sourceSpan?: ParseSourceSpan, + sourceSpan?: ParseSourceSpan | null, rawText?: string, ) { + super(STRING_TYPE, sourceSpan); + // If `rawText` is not provided, try to extract the raw string from its // associated `sourceSpan`. If that is also not available, "fake" the raw // string instead by escaping the following control sequences: @@ -685,8 +702,22 @@ export class TemplateLiteralElement { rawText ?? sourceSpan?.toString() ?? escapeForTemplateLiteral(escapeSlashes(text)); } - clone(): TemplateLiteralElement { - return new TemplateLiteralElement(this.text, this.sourceSpan, this.rawText); + override visitExpression(visitor: ExpressionVisitor, context: any) { + return visitor.visitTemplateLiteralElementExpr(this, context); + } + + override isEquivalent(e: Expression): boolean { + return ( + e instanceof TemplateLiteralElementExpr && e.text === this.text && e.rawText === this.rawText + ); + } + + override isConstant(): boolean { + return true; + } + + override clone(): TemplateLiteralElementExpr { + return new TemplateLiteralElementExpr(this.text, this.sourceSpan, this.rawText); } } @@ -1383,7 +1414,9 @@ export interface ExpressionVisitor { visitWriteKeyExpr(expr: WriteKeyExpr, context: any): any; visitWritePropExpr(expr: WritePropExpr, context: any): any; visitInvokeFunctionExpr(ast: InvokeFunctionExpr, context: any): any; - visitTaggedTemplateExpr(ast: TaggedTemplateExpr, context: any): any; + visitTaggedTemplateLiteralExpr(ast: TaggedTemplateLiteralExpr, context: any): any; + visitTemplateLiteralExpr(ast: TemplateLiteralExpr, context: any): any; + visitTemplateLiteralElementExpr(ast: TemplateLiteralElementExpr, context: any): any; visitInstantiateExpr(ast: InstantiateExpr, context: any): any; visitLiteralExpr(ast: LiteralExpr, context: any): any; visitLocalizedString(ast: LocalizedString, context: any): any; @@ -1634,9 +1667,9 @@ export class RecursiveAstVisitor implements StatementVisitor, ExpressionVisitor this.visitAllExpressions(ast.args, context); return this.visitExpression(ast, context); } - visitTaggedTemplateExpr(ast: TaggedTemplateExpr, context: any): any { + visitTaggedTemplateLiteralExpr(ast: TaggedTemplateLiteralExpr, context: any): any { ast.tag.visitExpression(this, context); - this.visitAllExpressions(ast.template.expressions, context); + ast.template.visitExpression(this, context); return this.visitExpression(ast, context); } visitInstantiateExpr(ast: InstantiateExpr, context: any): any { @@ -1711,6 +1744,14 @@ export class RecursiveAstVisitor implements StatementVisitor, ExpressionVisitor this.visitAllExpressions(ast.parts, context); return this.visitExpression(ast, context); } + visitTemplateLiteralExpr(ast: TemplateLiteralExpr, context: any) { + this.visitAllExpressions(ast.elements, context); + this.visitAllExpressions(ast.expressions, context); + return this.visitExpression(ast, context); + } + visitTemplateLiteralElementExpr(ast: TemplateLiteralElementExpr, context: any) { + return this.visitExpression(ast, context); + } visitAllExpressions(exprs: Expression[], context: any): void { exprs.forEach((expr) => expr.visitExpression(this, context)); } @@ -1865,11 +1906,11 @@ export function ifStmt( export function taggedTemplate( tag: Expression, - template: TemplateLiteral, + template: TemplateLiteralExpr, type?: Type | null, sourceSpan?: ParseSourceSpan | null, -): TaggedTemplateExpr { - return new TaggedTemplateExpr(tag, template, type, sourceSpan); +): TaggedTemplateLiteralExpr { + return new TaggedTemplateLiteralExpr(tag, template, type, sourceSpan); } export function literal( diff --git a/packages/compiler/src/render3/r3_hmr_compiler.ts b/packages/compiler/src/render3/r3_hmr_compiler.ts index e99034147da6..db916e07915e 100644 --- a/packages/compiler/src/render3/r3_hmr_compiler.ts +++ b/packages/compiler/src/render3/r3_hmr_compiler.ts @@ -31,9 +31,9 @@ export interface R3HmrMetadata { /** * HMR update functions cannot contain imports so any locals the generated code depends on * (e.g. references to imports within the same file or imported symbols) have to be passed in - * as function parameters. This array contains the names of those local symbols. + * as function parameters. This array contains the names and runtime representation of the locals. */ - localDependencies: string[]; + localDependencies: {name: string; runtimeRepresentation: o.Expression}[]; } /** HMR dependency on a namespace import. */ @@ -53,13 +53,11 @@ export interface R3HmrNamespaceDependency { * @param meta HMR metadata extracted from the class. */ export function compileHmrInitializer(meta: R3HmrMetadata): o.Expression { - const id = encodeURIComponent(`${meta.filePath}@${meta.className}`); - const urlPartial = `/@ng/component?c=${id}&t=`; const moduleName = 'm'; const dataName = 'd'; const timestampName = 't'; + const idName = 'id'; const importCallbackName = `${meta.className}_HmrLoad`; - const locals = meta.localDependencies.map((localName) => o.variable(localName)); const namespaces = meta.namespaceDependencies.map((dep) => { return new o.ExternalExpr({moduleName: dep.moduleName, name: null}); }); @@ -67,21 +65,36 @@ export function compileHmrInitializer(meta: R3HmrMetadata): o.Expression { // m.default const defaultRead = o.variable(moduleName).prop('default'); - // ɵɵreplaceMetadata(Comp, m.default, [...namespaces], [...locals]); + // ɵɵreplaceMetadata(Comp, m.default, [...namespaces], [...locals], import.meta, id); const replaceCall = o .importExpr(R3.replaceMetadata) - .callFn([meta.type, defaultRead, o.literalArr(namespaces), o.literalArr(locals)]); + .callFn([ + meta.type, + defaultRead, + o.literalArr(namespaces), + o.literalArr(meta.localDependencies.map((l) => l.runtimeRepresentation)), + o.variable('import').prop('meta'), + o.variable(idName), + ]); // (m) => m.default && ɵɵreplaceMetadata(...) const replaceCallback = o.arrowFn([new o.FnParam(moduleName)], defaultRead.and(replaceCall)); - // '' + encodeURIComponent(t) + // '?c=' + id + '&t=' + encodeURIComponent(t) const urlValue = o - .literal(urlPartial) + .literal(`./@ng/component?c=`) + .plus(o.variable(idName)) + .plus(o.literal('&t=')) .plus(o.variable('encodeURIComponent').callFn([o.variable(timestampName)])); + // import.meta.url + const urlBase = o.variable('import').prop('meta').prop('url'); + + // new URL(urlValue, urlBase).href + const urlHref = new o.InstantiateExpr(o.variable('URL'), [urlValue, urlBase]).prop('href'); + // function Cmp_HmrLoad(t) { - // import(/* @vite-ignore */ url).then((m) => m.default && replaceMetadata(...)); + // import(/* @vite-ignore */ urlHref).then((m) => m.default && replaceMetadata(...)); // } const importCallback = new o.DeclareFunctionStmt( importCallbackName, @@ -90,7 +103,7 @@ export function compileHmrInitializer(meta: R3HmrMetadata): o.Expression { // The vite-ignore special comment is required to prevent Vite from generating a superfluous // warning for each usage within the development code. If Vite provides a method to // programmatically avoid this warning in the future, this added comment can be removed here. - new o.DynamicImportExpr(urlValue, null, '@vite-ignore') + new o.DynamicImportExpr(urlHref, null, '@vite-ignore') .prop('then') .callFn([replaceCallback]) .toStmt(), @@ -99,13 +112,13 @@ export function compileHmrInitializer(meta: R3HmrMetadata): o.Expression { o.StmtModifier.Final, ); - // (d) => d.id === && Cmp_HmrLoad(d.timestamp) + // (d) => d.id === id && Cmp_HmrLoad(d.timestamp) const updateCallback = o.arrowFn( [new o.FnParam(dataName)], o .variable(dataName) .prop('id') - .identical(o.literal(id)) + .identical(o.variable(idName)) .and(o.variable(importCallbackName).callFn([o.variable(dataName).prop('timestamp')])), ); @@ -129,6 +142,13 @@ export function compileHmrInitializer(meta: R3HmrMetadata): o.Expression { .arrowFn( [], [ + // const id = ; + new o.DeclareVarStmt( + idName, + o.literal(encodeURIComponent(`${meta.filePath}@${meta.className}`)), + null, + o.StmtModifier.Final, + ), // function Cmp_HmrLoad() {...}. importCallback, // ngDevMode && Cmp_HmrLoad(Date.now()); @@ -153,11 +173,13 @@ export function compileHmrUpdateCallback( meta: R3HmrMetadata, ): o.DeclareFunctionStmt { const namespaces = 'ɵɵnamespaces'; - const params = [meta.className, namespaces, ...meta.localDependencies].map( - (name) => new o.FnParam(name, o.DYNAMIC_TYPE), - ); + const params = [meta.className, namespaces].map((name) => new o.FnParam(name, o.DYNAMIC_TYPE)); const body: o.Statement[] = []; + for (const local of meta.localDependencies) { + params.push(new o.FnParam(local.name)); + } + // Declare variables that read out the individual namespaces. for (let i = 0; i < meta.namespaceDependencies.length; i++) { body.push( diff --git a/packages/compiler/src/render3/r3_identifiers.ts b/packages/compiler/src/render3/r3_identifiers.ts index 21972cd6e79e..58e806b15916 100644 --- a/packages/compiler/src/render3/r3_identifiers.ts +++ b/packages/compiler/src/render3/r3_identifiers.ts @@ -551,11 +551,6 @@ export class Identifiers { moduleName: CORE, }; - static InputTransformsFeatureFeature: o.ExternalReference = { - name: 'ɵɵInputTransformsFeature', - moduleName: CORE, - }; - static ExternalStylesFeature: o.ExternalReference = { name: 'ɵɵExternalStylesFeature', moduleName: CORE, diff --git a/packages/compiler/src/render3/view/api.ts b/packages/compiler/src/render3/view/api.ts index 3643d997aed6..dff2cfbd75ea 100644 --- a/packages/compiler/src/render3/view/api.ts +++ b/packages/compiler/src/render3/view/api.ts @@ -156,7 +156,7 @@ export const enum DeclarationListEmitMode { /** * The list of declarations is emitted into the generated code as is. * - * ``` + * ```ts * directives: [MyDir], * ``` */ @@ -166,7 +166,7 @@ export const enum DeclarationListEmitMode { * The list of declarations is emitted into the generated code wrapped inside a closure, which * is needed when at least one declaration is a forward reference. * - * ``` + * ```ts * directives: function () { return [MyDir, ForwardDir]; }, * ``` */ @@ -180,13 +180,13 @@ export const enum DeclarationListEmitMode { * any forward references within the list are resolved when the outer closure is invoked. * * Consider the case where the runtime has captured two declarations in two distinct values: - * ``` + * ```ts * const dirA = MyDir; * const dirB = forwardRef(function() { return ForwardRef; }); * ``` * * This mode would emit the declarations captured in `dirA` and `dirB` as follows: - * ``` + * ```ts * directives: function () { return [dirA, dirB].map(ng.resolveForwardRef); }, * ``` */ diff --git a/packages/compiler/src/render3/view/compiler.ts b/packages/compiler/src/render3/view/compiler.ts index 2a7c4a5806ee..092c0d7d5ffe 100644 --- a/packages/compiler/src/render3/view/compiler.ts +++ b/packages/compiler/src/render3/view/compiler.ts @@ -114,7 +114,6 @@ function addFeatures( const providers = meta.providers; const viewProviders = (meta as R3ComponentMetadata).viewProviders; - const inputKeys = Object.keys(meta.inputs); if (providers || viewProviders) { const args = [providers || new o.LiteralArrayExpr([])]; @@ -123,12 +122,6 @@ function addFeatures( } features.push(o.importExpr(R3.ProvidersFeature).callFn(args)); } - for (const key of inputKeys) { - if (meta.inputs[key].transformFunction !== null) { - features.push(o.importExpr(R3.InputTransformsFeatureFeature)); - break; - } - } // Note: host directives feature needs to be inserted before the // inheritance feature to ensure the correct execution order. if (meta.hostDirectives?.length) { diff --git a/packages/compiler/src/shadow_css.ts b/packages/compiler/src/shadow_css.ts index 0a40a35f67f0..a66aa6c551a9 100644 --- a/packages/compiler/src/shadow_css.ts +++ b/packages/compiler/src/shadow_css.ts @@ -214,7 +214,7 @@ export class ShadowCss { * * For example, we convert this css: * - * ``` + * ```scss * .box { * animation: box-animation 1s forwards; * } @@ -228,7 +228,7 @@ export class ShadowCss { * * to this: * - * ``` + * ```scss * .box { * animation: scopeName_box-animation 1s forwards; * } @@ -262,7 +262,7 @@ export class ShadowCss { * * For example, it takes a rule such as: * - * ``` + * ```scss * @keyframes box-animation { * to { * background-color: green; @@ -272,7 +272,7 @@ export class ShadowCss { * * and returns: * - * ``` + * ```scss * @keyframes scopeName_box-animation { * to { * background-color: green; @@ -541,6 +541,41 @@ export class ShadowCss { * .foo .bar { ... } */ private _convertColonHostContext(cssText: string): string { + const length = cssText.length; + let parens = 0; + let prev = 0; + let result = ''; + + // Splits up the selectors on their top-level commas, processes the :host-context in them + // individually and stitches them back together. This ensures that individual selectors don't + // affect each other. + for (let i = 0; i < length; i++) { + const char = cssText[i]; + + // If we hit a comma and there are no open parentheses, take the current chunk and process it. + if (char === ',' && parens === 0) { + result += this._convertColonHostContextInSelectorPart(cssText.slice(prev, i)) + ','; + prev = i + 1; + continue; + } + + // We've hit the end. Take everything since the last comma. + if (i === length - 1) { + result += this._convertColonHostContextInSelectorPart(cssText.slice(prev)); + break; + } + + if (char === '(') { + parens++; + } else if (char === ')') { + parens--; + } + } + + return result; + } + + private _convertColonHostContextInSelectorPart(cssText: string): string { return cssText.replace(_cssColonHostContextReGlobal, (selectorText, pseudoPrefix) => { // We have captured a selector that contains a `:host-context` rule. @@ -1010,13 +1045,16 @@ const _cssContentUnscopedRuleRe = const _polyfillHost = '-shadowcsshost'; // note: :host-context pre-processed to -shadowcsshostcontext. const _polyfillHostContext = '-shadowcsscontext'; -const _parenSuffix = '(?:\\((' + '(?:\\([^)(]*\\)|[^)(]*)+?' + ')\\))?([^,{]*)'; -const _cssColonHostRe = new RegExp(_polyfillHost + _parenSuffix, 'gim'); +const _parenSuffix = '(?:\\((' + '(?:\\([^)(]*\\)|[^)(]*)+?' + ')\\))'; +const _cssColonHostRe = new RegExp(_polyfillHost + _parenSuffix + '?([^,{]*)', 'gim'); +// note: :host-context patterns are terminated with `{`, as opposed to :host which +// is both `{` and `,` because :host-context handles top-level commas differently. +const _hostContextPattern = _polyfillHostContext + _parenSuffix + '?([^{]*)'; const _cssColonHostContextReGlobal = new RegExp( - _cssScopedPseudoFunctionPrefix + '(' + _polyfillHostContext + _parenSuffix + ')', + `${_cssScopedPseudoFunctionPrefix}(${_hostContextPattern})`, 'gim', ); -const _cssColonHostContextRe = new RegExp(_polyfillHostContext + _parenSuffix, 'im'); +const _cssColonHostContextRe = new RegExp(_hostContextPattern, 'im'); const _polyfillHostNoCombinator = _polyfillHost + '-no-combinator'; const _polyfillHostNoCombinatorOutsidePseudoFunction = new RegExp( `${_polyfillHostNoCombinator}(?![^(]*\\))`, diff --git a/packages/compiler/src/template/pipeline/ir/src/expression.ts b/packages/compiler/src/template/pipeline/ir/src/expression.ts index bd336c6d6468..ba8e39b2c3ef 100644 --- a/packages/compiler/src/template/pipeline/ir/src/expression.ts +++ b/packages/compiler/src/template/pipeline/ir/src/expression.ts @@ -50,7 +50,8 @@ export type Expression = | ConstCollectedExpr | TwoWayBindingSetExpr | ContextLetReferenceExpr - | StoreLetExpr; + | StoreLetExpr + | TrackContextExpr; /** * Transformer type which converts expressions into general `o.Expression`s (which may be an @@ -1153,7 +1154,13 @@ export function transformExpressionsInOp( op.trustedValueFn && transformExpressionsInExpression(op.trustedValueFn, transform, flags); break; case OpKind.RepeaterCreate: - op.track = transformExpressionsInExpression(op.track, transform, flags); + if (op.trackByOps === null) { + op.track = transformExpressionsInExpression(op.track, transform, flags); + } else { + for (const innerOp of op.trackByOps) { + transformExpressionsInOp(innerOp, transform, flags | VisitorContextFlag.InChildOperation); + } + } if (op.trackByFn !== null) { op.trackByFn = transformExpressionsInExpression(op.trackByFn, transform, flags); } @@ -1290,7 +1297,7 @@ export function transformExpressionsInExpression( } } else if (expr instanceof o.NotExpr) { expr.condition = transformExpressionsInExpression(expr.condition, transform, flags); - } else if (expr instanceof o.TaggedTemplateExpr) { + } else if (expr instanceof o.TaggedTemplateLiteralExpr) { expr.tag = transformExpressionsInExpression(expr.tag, transform, flags); expr.template.expressions = expr.template.expressions.map((e) => transformExpressionsInExpression(e, transform, flags), @@ -1305,6 +1312,10 @@ export function transformExpressionsInExpression( } } else if (expr instanceof o.WrappedNodeExpr) { // TODO: Do we need to transform any TS nodes nested inside of this expression? + } else if (expr instanceof o.TemplateLiteralExpr) { + for (let i = 0; i < expr.expressions.length; i++) { + expr.expressions[i] = transformExpressionsInExpression(expr.expressions[i], transform, flags); + } } else if ( expr instanceof o.ReadVarExpr || expr instanceof o.ExternalExpr || diff --git a/packages/compiler/src/template/pipeline/ir/src/ops/create.ts b/packages/compiler/src/template/pipeline/ir/src/ops/create.ts index a8696be1a4b0..c227e8a0a968 100644 --- a/packages/compiler/src/template/pipeline/ir/src/ops/create.ts +++ b/packages/compiler/src/template/pipeline/ir/src/ops/create.ts @@ -324,6 +324,12 @@ export interface RepeaterCreateOp extends ElementOpBase, ConsumesVarsTrait { */ track: o.Expression; + /** + * Some kinds of expressions (e.g. safe reads or nullish coalescing) require additional ops + * in order to work. This OpList keeps track of those ops, if they're necessary. + */ + trackByOps: OpList | null; + /** * `null` initially, then an `o.Expression`. Might be a track expression, or might be a reference * into the constant pool. @@ -393,6 +399,7 @@ export function createRepeaterCreateOp( emptyView, track, trackByFn: null, + trackByOps: null, tag, emptyTag, emptyAttributes: null, diff --git a/packages/compiler/src/template/pipeline/src/compilation.ts b/packages/compiler/src/template/pipeline/src/compilation.ts index a08239f4091e..90fa46e3f61d 100644 --- a/packages/compiler/src/template/pipeline/src/compilation.ts +++ b/packages/compiler/src/template/pipeline/src/compilation.ts @@ -190,6 +190,10 @@ export abstract class CompilationUnit { for (const listenerOp of op.handlerOps) { yield listenerOp; } + } else if (op.kind === ir.OpKind.RepeaterCreate && op.trackByOps !== null) { + for (const trackOp of op.trackByOps) { + yield trackOp; + } } } for (const op of this.update) { diff --git a/packages/compiler/src/template/pipeline/src/emit.ts b/packages/compiler/src/template/pipeline/src/emit.ts index e077d363b2c5..031cc19d60f4 100644 --- a/packages/compiler/src/template/pipeline/src/emit.ts +++ b/packages/compiler/src/template/pipeline/src/emit.ts @@ -74,7 +74,6 @@ import {saveAndRestoreView} from './phases/save_restore_view'; import {allocateSlots} from './phases/slot_allocation'; import {specializeStyleBindings} from './phases/style_binding_specialization'; import {generateTemporaryVariables} from './phases/temporary_variables'; -import {generateTrackFns} from './phases/track_fn_generation'; import {optimizeTrackFns} from './phases/track_fn_optimization'; import {generateTrackVariables} from './phases/track_variables'; import {countVariables} from './phases/var_counting'; @@ -148,7 +147,6 @@ const phases: Phase[] = [ {kind: Kind.Tmpl, fn: resolveI18nElementPlaceholders}, {kind: Kind.Tmpl, fn: resolveI18nExpressionPlaceholders}, {kind: Kind.Tmpl, fn: extractI18nMessages}, - {kind: Kind.Tmpl, fn: generateTrackFns}, {kind: Kind.Tmpl, fn: collectI18nConsts}, {kind: Kind.Tmpl, fn: collectConstExpressions}, {kind: Kind.Both, fn: collectElementConsts}, diff --git a/packages/compiler/src/template/pipeline/src/ingest.ts b/packages/compiler/src/template/pipeline/src/ingest.ts index 10f95362b5c3..eeca7e7c01fb 100644 --- a/packages/compiler/src/template/pipeline/src/ingest.ts +++ b/packages/compiler/src/template/pipeline/src/ingest.ts @@ -1164,6 +1164,17 @@ function convertAst( ); } else if (ast instanceof e.TypeofExpression) { return o.typeofExpr(convertAst(ast.expression, job, baseSourceSpan)); + } else if (ast instanceof e.TemplateLiteral) { + return new o.TemplateLiteralExpr( + ast.elements.map((el) => { + return new o.TemplateLiteralElementExpr( + el.text, + convertSourceSpan(el.span, baseSourceSpan), + ); + }), + ast.expressions.map((expr) => convertAst(expr, job, baseSourceSpan)), + convertSourceSpan(ast.span, baseSourceSpan), + ); } else { throw new Error( `Unhandled expression type "${ast.constructor.name}" in file "${baseSourceSpan?.start.file.url}"`, diff --git a/packages/compiler/src/template/pipeline/src/phases/const_collection.ts b/packages/compiler/src/template/pipeline/src/phases/const_collection.ts index 137c6a7d746c..f02daf404b0f 100644 --- a/packages/compiler/src/template/pipeline/src/phases/const_collection.ts +++ b/packages/compiler/src/template/pipeline/src/phases/const_collection.ts @@ -197,7 +197,7 @@ class ElementAttributes { array.push( o.taggedTemplate( trustedValueFn, - new o.TemplateLiteral([new o.TemplateLiteralElement(value.value)], []), + new o.TemplateLiteralExpr([new o.TemplateLiteralElementExpr(value.value)], []), undefined, value.sourceSpan, ), diff --git a/packages/compiler/src/template/pipeline/src/phases/generate_variables.ts b/packages/compiler/src/template/pipeline/src/phases/generate_variables.ts index 5804dc2a093c..96999f2fda00 100644 --- a/packages/compiler/src/template/pipeline/src/phases/generate_variables.ts +++ b/packages/compiler/src/template/pipeline/src/phases/generate_variables.ts @@ -57,6 +57,9 @@ function recursivelyProcessView(view: ViewCompilationUnit, parentScope: Scope | if (op.emptyView) { recursivelyProcessView(view.job.views.get(op.emptyView)!, scope); } + if (op.trackByOps !== null) { + op.trackByOps.prepend(generateVariablesInScopeForView(view, scope, false)); + } break; case ir.OpKind.Listener: case ir.OpKind.TwoWayListener: diff --git a/packages/compiler/src/template/pipeline/src/phases/reify.ts b/packages/compiler/src/template/pipeline/src/phases/reify.ts index f1d1d8df2a57..6de081c46a28 100644 --- a/packages/compiler/src/template/pipeline/src/phases/reify.ts +++ b/packages/compiler/src/template/pipeline/src/phases/reify.ts @@ -391,7 +391,7 @@ function reifyCreateOperations(unit: CompilationUnit, ops: ir.OpList { - if (expr instanceof ir.PipeBindingExpr || expr instanceof ir.PipeBindingVariadicExpr) { - throw new Error(`Illegal State: Pipes are not allowed in this context`); - } - if (expr instanceof ir.TrackContextExpr) { - usesComponentContext = true; - return o.variable('this'); - } - return expr; - }, - ir.VisitorContextFlag.None, - ); - - let fn: o.FunctionExpr | o.ArrowFunctionExpr; - - const fnParams = [new o.FnParam('$index'), new o.FnParam('$item')]; - if (usesComponentContext) { - fn = new o.FunctionExpr(fnParams, [new o.ReturnStatement(op.track)]); - } else { - fn = o.arrowFn(fnParams, op.track); - } - - op.trackByFn = job.pool.getSharedFunctionReference(fn, '_forTrack'); - } - } -} diff --git a/packages/compiler/src/template/pipeline/src/phases/track_fn_optimization.ts b/packages/compiler/src/template/pipeline/src/phases/track_fn_optimization.ts index 7ebfa4846d20..a6bfa552035d 100644 --- a/packages/compiler/src/template/pipeline/src/phases/track_fn_optimization.ts +++ b/packages/compiler/src/template/pipeline/src/phases/track_fn_optimization.ts @@ -58,7 +58,9 @@ export function optimizeTrackFns(job: CompilationJob): void { op.track = ir.transformExpressionsInExpression( op.track, (expr) => { - if (expr instanceof ir.ContextExpr) { + if (expr instanceof ir.PipeBindingExpr || expr instanceof ir.PipeBindingVariadicExpr) { + throw new Error(`Illegal State: Pipes are not allowed in this context`); + } else if (expr instanceof ir.ContextExpr) { op.usesComponentInstance = true; return new ir.TrackContextExpr(expr.view); } @@ -66,6 +68,14 @@ export function optimizeTrackFns(job: CompilationJob): void { }, ir.VisitorContextFlag.None, ); + + // Also create an OpList for the tracking expression since it may need + // additional ops when generating the final code (e.g. temporary variables). + const trackOpList = new ir.OpList(); + trackOpList.push( + ir.createStatementOp(new o.ReturnStatement(op.track, op.track.sourceSpan)), + ); + op.trackByOps = trackOpList; } } } diff --git a/packages/compiler/src/template/pipeline/src/phases/variable_optimization.ts b/packages/compiler/src/template/pipeline/src/phases/variable_optimization.ts index 1653e9ab4393..f3afc57d285b 100644 --- a/packages/compiler/src/template/pipeline/src/phases/variable_optimization.ts +++ b/packages/compiler/src/template/pipeline/src/phases/variable_optimization.ts @@ -36,6 +36,8 @@ export function optimizeVariables(job: CompilationJob): void { for (const op of unit.create) { if (op.kind === ir.OpKind.Listener || op.kind === ir.OpKind.TwoWayListener) { inlineAlwaysInlineVariables(op.handlerOps); + } else if (op.kind === ir.OpKind.RepeaterCreate && op.trackByOps !== null) { + inlineAlwaysInlineVariables(op.trackByOps); } } @@ -45,6 +47,8 @@ export function optimizeVariables(job: CompilationJob): void { for (const op of unit.create) { if (op.kind === ir.OpKind.Listener || op.kind === ir.OpKind.TwoWayListener) { optimizeVariablesInOpList(op.handlerOps, job.compatibility); + } else if (op.kind === ir.OpKind.RepeaterCreate && op.trackByOps !== null) { + optimizeVariablesInOpList(op.trackByOps, job.compatibility); } } } diff --git a/packages/compiler/src/template_parser/binding_parser.ts b/packages/compiler/src/template_parser/binding_parser.ts index 52ed145016c6..136b36a579d8 100644 --- a/packages/compiler/src/template_parser/binding_parser.ts +++ b/packages/compiler/src/template_parser/binding_parser.ts @@ -263,7 +263,7 @@ export class BindingParser { /** * Parses the bindings in a microsyntax expression, e.g. - * ``` + * ```html * * ``` * diff --git a/packages/compiler/test/expression_parser/lexer_spec.ts b/packages/compiler/test/expression_parser/lexer_spec.ts index 7d4223cc0b5a..20545ad8c6dc 100644 --- a/packages/compiler/test/expression_parser/lexer_spec.ts +++ b/packages/compiler/test/expression_parser/lexer_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {Lexer, Token} from '@angular/compiler/src/expression_parser/lexer'; +import {Lexer, StringTokenKind, Token} from '@angular/compiler/src/expression_parser/lexer'; function lex(text: string): any[] { return new Lexer().tokenize(text); @@ -35,9 +35,16 @@ function expectNumberToken(token: any, index: number, end: number, n: number) { expect(token.toNumber()).toEqual(n); } -function expectStringToken(token: any, index: number, end: number, str: string) { +function expectStringToken( + token: any, + index: number, + end: number, + str: string, + kind: StringTokenKind, +) { expectToken(token, index, end); expect(token.isString()).toBe(true); + expect(token.kind).toBe(kind); expect(token.toString()).toEqual(str); } @@ -152,11 +159,11 @@ describe('lexer', () => { }); it('should tokenize simple quoted strings', () => { - expectStringToken(lex('"a"')[0], 0, 3, 'a'); + expectStringToken(lex('"a"')[0], 0, 3, 'a', StringTokenKind.Plain); }); it('should tokenize quoted strings with escaped quotes', () => { - expectStringToken(lex('"a\\""')[0], 0, 5, 'a"'); + expectStringToken(lex('"a\\""')[0], 0, 5, 'a"', StringTokenKind.Plain); }); it('should tokenize a string', () => { @@ -174,9 +181,9 @@ describe('lexer', () => { expectOperatorToken(tokens[10], 14, 15, '|'); expectIdentifierToken(tokens[11], 15, 16, 'f'); expectCharacterToken(tokens[12], 16, 17, ':'); - expectStringToken(tokens[13], 17, 23, "a'c"); + expectStringToken(tokens[13], 17, 23, "a'c", StringTokenKind.Plain); expectCharacterToken(tokens[14], 23, 24, ':'); - expectStringToken(tokens[15], 24, 30, 'd"e'); + expectStringToken(tokens[15], 24, 30, 'd"e', StringTokenKind.Plain); }); it('should tokenize undefined', () => { @@ -200,8 +207,8 @@ describe('lexer', () => { it('should tokenize quoted string', () => { const str = '[\'\\\'\', "\\""]'; const tokens: Token[] = lex(str); - expectStringToken(tokens[1], 1, 5, "'"); - expectStringToken(tokens[3], 7, 11, '"'); + expectStringToken(tokens[1], 1, 5, "'", StringTokenKind.Plain); + expectStringToken(tokens[3], 7, 11, '"', StringTokenKind.Plain); }); it('should tokenize escaped quoted string', () => { @@ -376,5 +383,228 @@ describe('lexer', () => { 'Lexer Error: Invalid numeric separator at column 6 in expression [1_2_3._456]', ); }); + + describe('template literals', () => { + it('should tokenize template literal with no interpolations', () => { + const tokens: Token[] = lex('`hello world`'); + expect(tokens.length).toBe(1); + expectStringToken(tokens[0], 0, 13, 'hello world', StringTokenKind.TemplateLiteralEnd); + }); + + it('should tokenize template literal containing strings', () => { + expectStringToken(lex('`a "b" c`')[0], 0, 9, `a "b" c`, StringTokenKind.TemplateLiteralEnd); + expectStringToken(lex("`a 'b' c`")[0], 0, 9, `a 'b' c`, StringTokenKind.TemplateLiteralEnd); + expectStringToken( + lex('`a \\`b\\` c`')[0], + 0, + 11, + 'a `b` c', + StringTokenKind.TemplateLiteralEnd, + ); + expectStringToken( + lex('`a "\'\\`b\\`\'" c`')[0], + 0, + 15, + `a "'\`b\`'" c`, + StringTokenKind.TemplateLiteralEnd, + ); + }); + + it('should tokenize unicode inside a template string', () => { + const tokens: Token[] = lex('`\\u00A0`'); + expect(tokens.length).toBe(1); + expect(tokens[0].toString()).toBe('\u00a0'); + }); + + it('should tokenize template literal with an interpolation in the end', () => { + const tokens: Token[] = lex('`hello ${name}`'); + expect(tokens.length).toBe(5); + expectStringToken(tokens[0], 0, 7, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 7, 9, '${'); + expectIdentifierToken(tokens[2], 9, 13, 'name'); + expectOperatorToken(tokens[3], 13, 14, '}'); + expectStringToken(tokens[4], 14, 15, '', StringTokenKind.TemplateLiteralEnd); + }); + + it('should tokenize template literal with an interpolation in the beginning', () => { + const tokens: Token[] = lex('`${name} Johnson`'); + expect(tokens.length).toBe(5); + expectStringToken(tokens[0], 0, 1, '', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 1, 3, '${'); + expectIdentifierToken(tokens[2], 3, 7, 'name'); + expectOperatorToken(tokens[3], 7, 8, '}'); + expectStringToken(tokens[4], 8, 17, ' Johnson', StringTokenKind.TemplateLiteralEnd); + }); + + it('should tokenize template literal with an interpolation in the middle', () => { + const tokens: Token[] = lex('`foo${bar}baz`'); + expect(tokens.length).toBe(5); + expectStringToken(tokens[0], 0, 4, 'foo', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 4, 6, '${'); + expectIdentifierToken(tokens[2], 6, 9, 'bar'); + expectOperatorToken(tokens[3], 9, 10, '}'); + expectStringToken(tokens[4], 10, 14, 'baz', StringTokenKind.TemplateLiteralEnd); + }); + + it('should be able to use interpolation characters inside template string', () => { + expectStringToken(lex('`foo $`')[0], 0, 7, 'foo $', StringTokenKind.TemplateLiteralEnd); + expectStringToken(lex('`foo }`')[0], 0, 7, 'foo }', StringTokenKind.TemplateLiteralEnd); + expectStringToken( + lex('`foo $ {}`')[0], + 0, + 10, + 'foo $ {}', + StringTokenKind.TemplateLiteralEnd, + ); + expectStringToken( + lex('`foo \\${bar}`')[0], + 0, + 13, + 'foo ${bar}', + StringTokenKind.TemplateLiteralEnd, + ); + }); + + it('should tokenize template literal with several interpolations', () => { + const tokens: Token[] = lex('`${a} - ${b} - ${c}`'); + expect(tokens.length).toBe(13); + expectStringToken(tokens[0], 0, 1, '', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 1, 3, '${'); + expectIdentifierToken(tokens[2], 3, 4, 'a'); + expectOperatorToken(tokens[3], 4, 5, '}'); + expectStringToken(tokens[4], 5, 8, ' - ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[5], 8, 10, '${'); + expectIdentifierToken(tokens[6], 10, 11, 'b'); + expectOperatorToken(tokens[7], 11, 12, '}'); + expectStringToken(tokens[8], 12, 15, ' - ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[9], 15, 17, '${'); + expectIdentifierToken(tokens[10], 17, 18, 'c'); + expectOperatorToken(tokens[11], 18, 19, '}'); + }); + + it('should tokenize template literal with an object literal inside the interpolation', () => { + const tokens: Token[] = lex('`foo ${{$: true}} baz`'); + expect(tokens.length).toBe(9); + expectStringToken(tokens[0], 0, 5, 'foo ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 5, 7, '${'); + expectCharacterToken(tokens[2], 7, 8, '{'); + expectIdentifierToken(tokens[3], 8, 9, '$'); + expectCharacterToken(tokens[4], 9, 10, ':'); + expectKeywordToken(tokens[5], 11, 15, 'true'); + expectCharacterToken(tokens[6], 15, 16, '}'); + expectOperatorToken(tokens[7], 16, 17, '}'); + expectStringToken(tokens[8], 17, 22, ' baz', StringTokenKind.TemplateLiteralEnd); + }); + + it('should tokenize template literal with template literals inside the interpolation', () => { + const tokens: Token[] = lex('`foo ${`hello ${`${a} - b`}`} baz`'); + expect(tokens.length).toBe(13); + expectStringToken(tokens[0], 0, 5, 'foo ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 5, 7, '${'); + expectStringToken(tokens[2], 7, 14, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[3], 14, 16, '${'); + expectStringToken(tokens[4], 16, 17, '', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[5], 17, 19, '${'); + expectIdentifierToken(tokens[6], 19, 20, 'a'); + expectOperatorToken(tokens[7], 20, 21, '}'); + expectStringToken(tokens[8], 21, 26, ' - b', StringTokenKind.TemplateLiteralEnd); + expectOperatorToken(tokens[9], 26, 27, '}'); + expectStringToken(tokens[10], 27, 28, '', StringTokenKind.TemplateLiteralEnd); + expectOperatorToken(tokens[11], 28, 29, '}'); + expectStringToken(tokens[12], 29, 34, ' baz', StringTokenKind.TemplateLiteralEnd); + }); + + it('should tokenize two template literal right after each other', () => { + const tokens: Token[] = lex('`hello ${name}``see ${name} later`'); + expect(tokens.length).toBe(10); + expectStringToken(tokens[0], 0, 7, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 7, 9, '${'); + expectIdentifierToken(tokens[2], 9, 13, 'name'); + expectOperatorToken(tokens[3], 13, 14, '}'); + expectStringToken(tokens[4], 14, 15, '', StringTokenKind.TemplateLiteralEnd); + expectStringToken(tokens[5], 15, 20, 'see ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[6], 20, 22, '${'); + expectIdentifierToken(tokens[7], 22, 26, 'name'); + expectOperatorToken(tokens[8], 26, 27, '}'); + expectStringToken(tokens[9], 27, 34, ' later', StringTokenKind.TemplateLiteralEnd); + }); + + it('should tokenize a concatenated template literal', () => { + const tokens: Token[] = lex('`hello ${name}` + 123'); + expect(tokens.length).toBe(7); + expectStringToken(tokens[0], 0, 7, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 7, 9, '${'); + expectIdentifierToken(tokens[2], 9, 13, 'name'); + expectOperatorToken(tokens[3], 13, 14, '}'); + expectStringToken(tokens[4], 14, 15, '', StringTokenKind.TemplateLiteralEnd); + expectOperatorToken(tokens[5], 16, 17, '+'); + expectNumberToken(tokens[6], 18, 21, 123); + }); + + it('should tokenize a template literal with a pipe inside an interpolation', () => { + const tokens: Token[] = lex('`hello ${name | capitalize}!!!`'); + expect(tokens.length).toBe(7); + expectStringToken(tokens[0], 0, 7, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 7, 9, '${'); + expectIdentifierToken(tokens[2], 9, 13, 'name'); + expectOperatorToken(tokens[3], 14, 15, '|'); + expectIdentifierToken(tokens[4], 16, 26, 'capitalize'); + expectOperatorToken(tokens[5], 26, 27, '}'); + expectStringToken(tokens[6], 27, 31, '!!!', StringTokenKind.TemplateLiteralEnd); + }); + + it('should tokenize a template literal with a pipe inside a parenthesized interpolation', () => { + const tokens: Token[] = lex('`hello ${(name | capitalize)}!!!`'); + expect(tokens.length).toBe(9); + expectStringToken(tokens[0], 0, 7, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 7, 9, '${'); + expectCharacterToken(tokens[2], 9, 10, '('); + expectIdentifierToken(tokens[3], 10, 14, 'name'); + expectOperatorToken(tokens[4], 15, 16, '|'); + expectIdentifierToken(tokens[5], 17, 27, 'capitalize'); + expectCharacterToken(tokens[6], 27, 28, ')'); + expectOperatorToken(tokens[7], 28, 29, '}'); + expectStringToken(tokens[8], 29, 33, '!!!', StringTokenKind.TemplateLiteralEnd); + }); + + it('should produce an error if a template literal is not terminated', () => { + expectErrorToken( + lex('`hello')[0], + 6, + 6, + 'Lexer Error: Unterminated template literal at column 6 in expression [`hello]', + ); + }); + + it('should produce an error for an unterminated template literal with an interpolation', () => { + const tokens: Token[] = lex('`hello ${name}!'); + expect(tokens.length).toBe(5); + expectStringToken(tokens[0], 0, 7, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 7, 9, '${'); + expectIdentifierToken(tokens[2], 9, 13, 'name'); + expectOperatorToken(tokens[3], 13, 14, '}'); + expectErrorToken( + tokens[4], + 15, + 15, + 'Lexer Error: Unterminated template literal at column 15 in expression [`hello ${name}!]', + ); + }); + + it('should produce an error for an unterminate template literal interpolation', () => { + const tokens: Token[] = lex('`hello ${name!`'); + expect(tokens.length).toBe(5); + expectStringToken(tokens[0], 0, 7, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 7, 9, '${'); + expectIdentifierToken(tokens[2], 9, 13, 'name'); + expectOperatorToken(tokens[3], 13, 14, '!'); + expectErrorToken( + tokens[4], + 15, + 15, + 'Lexer Error: Unterminated template literal at column 15 in expression [`hello ${name!`]', + ); + }); + }); }); }); diff --git a/packages/compiler/test/expression_parser/parser_spec.ts b/packages/compiler/test/expression_parser/parser_spec.ts index 5a2e296f0595..32f6e6b11314 100644 --- a/packages/compiler/test/expression_parser/parser_spec.ts +++ b/packages/compiler/test/expression_parser/parser_spec.ts @@ -413,6 +413,38 @@ describe('parser', () => { expect(parseAction(`"{{a('\\"')}}"`).errors).toEqual([]); expect(parseAction(`'{{a("\\'")}}'`).errors).toEqual([]); }); + + describe('template literals', () => { + it('should parse template literals without interpolations', () => { + checkBinding('`hello world`'); + checkBinding('`foo $`'); + checkBinding('`foo }`'); + checkBinding('`foo $ {}`'); + }); + + it('should parse template literals with interpolations', () => { + checkBinding('`hello ${name}`'); + checkBinding('`${name} Johnson`'); + checkBinding('`foo${bar}baz`'); + checkBinding('`${a} - ${b} - ${c}`'); + checkBinding('`foo ${{$: true}} baz`'); + checkBinding('`foo ${`hello ${`${a} - b`}`} baz`'); + checkBinding('[`hello ${name}`, `see ${name} later`]'); + checkBinding('`hello ${name}` + 123'); + }); + + it('should parse template literals with pipes inside interpolations', () => { + checkBinding('`hello ${name | capitalize}!!!`', '`hello ${(name | capitalize)}!!!`'); + checkBinding('`hello ${(name | capitalize)}!!!`'); + }); + + it('should report error if interpolation is empty', () => { + expectBindingError( + '`hello ${}`', + 'Template literal interpolation cannot be empty at the end of the expression', + ); + }); + }); }); describe('parse spans', () => { @@ -464,6 +496,20 @@ describe('parser', () => { expect(unparseWithSpan(ast)).toContain(['a.b = c', '[nameSpan] b']); }); + it('should record template literal space', () => { + const ast = parseAction('`before ${one} - ${two} - ${three} after`'); + const unparsed = unparseWithSpan(ast); + expect(unparsed).toContain(['before ', '']); + expect(unparsed).toContain(['one', 'one']); + expect(unparsed).toContain(['one', '[nameSpan] one']); + expect(unparsed).toContain([' - ', '']); + expect(unparsed).toContain(['two', 'two']); + expect(unparsed).toContain(['two', '[nameSpan] two']); + expect(unparsed).toContain(['three', 'three']); + expect(unparsed).toContain(['three', '[nameSpan] three']); + expect(unparsed).toContain([' after', '']); + }); + it('should include parenthesis in spans', () => { // When a LHS expression is parenthesized, the parenthesis on the left used to be // excluded from the span. This test verifies that the parenthesis are properly included diff --git a/packages/compiler/test/expression_parser/utils/unparser.ts b/packages/compiler/test/expression_parser/utils/unparser.ts index 4e6fbab9d977..2c9980130f44 100644 --- a/packages/compiler/test/expression_parser/utils/unparser.ts +++ b/packages/compiler/test/expression_parser/utils/unparser.ts @@ -33,6 +33,8 @@ import { SafePropertyRead, ThisReceiver, Unary, + TemplateLiteralElement, + TemplateLiteral, } from '../../../src/expression_parser/ast'; import {DEFAULT_INTERPOLATION_CONFIG, InterpolationConfig} from '../../../src/ml_parser/defaults'; @@ -193,7 +195,7 @@ class Unparser implements AstVisitor { this._visit(ast.expression); } - visitTypeofExpresion(ast: TypeofExpression, context: any) { + visitTypeofExpression(ast: TypeofExpression, context: any) { this._expression += 'typeof '; this._visit(ast.expression); } @@ -215,6 +217,24 @@ class Unparser implements AstVisitor { this._expression += ']'; } + visitTemplateLiteral(ast: TemplateLiteral, context: any) { + this._expression += '`'; + for (let i = 0; i < ast.elements.length; i++) { + this._visit(ast.elements[i]); + const expression = i < ast.expressions.length ? ast.expressions[i] : null; + if (expression !== null) { + this._expression += '${'; + this._visit(expression); + this._expression += '}'; + } + } + this._expression += '`'; + } + + visitTemplateLiteralElement(ast: TemplateLiteralElement, context: any) { + this._expression += ast.text; + } + private _visit(ast: AST) { ast.visit(this); } diff --git a/packages/compiler/test/expression_parser/utils/validator.ts b/packages/compiler/test/expression_parser/utils/validator.ts index 4f915a552d3a..ad1ac829afae 100644 --- a/packages/compiler/test/expression_parser/utils/validator.ts +++ b/packages/compiler/test/expression_parser/utils/validator.ts @@ -30,6 +30,8 @@ import { SafeKeyedRead, SafePropertyRead, Unary, + TemplateLiteral, + TemplateLiteralElement, } from '../../../src/expression_parser/ast'; import {unparse} from './unparser'; @@ -113,8 +115,8 @@ class ASTValidator extends RecursiveAstVisitor { this.validate(ast, () => super.visitPrefixNot(ast, context)); } - override visitTypeofExpresion(ast: TypeofExpression, context: any): any { - this.validate(ast, () => super.visitTypeofExpresion(ast, context)); + override visitTypeofExpression(ast: TypeofExpression, context: any): any { + this.validate(ast, () => super.visitTypeofExpression(ast, context)); } override visitPropertyRead(ast: PropertyRead, context: any): any { @@ -140,6 +142,14 @@ class ASTValidator extends RecursiveAstVisitor { override visitSafeCall(ast: SafeCall, context: any): any { this.validate(ast, () => super.visitSafeCall(ast, context)); } + + override visitTemplateLiteral(ast: TemplateLiteral, context: any): any { + this.validate(ast, () => super.visitTemplateLiteral(ast, context)); + } + + override visitTemplateLiteralElement(ast: TemplateLiteralElement, context: any): any { + this.validate(ast, () => super.visitTemplateLiteralElement(ast, context)); + } } function inSpan(span: ParseSpan, parentSpan: ParseSpan | undefined): parentSpan is ParseSpan { diff --git a/packages/compiler/test/render3/util/expression.ts b/packages/compiler/test/render3/util/expression.ts index 69bb4c3dd943..e858b32b42fb 100644 --- a/packages/compiler/test/render3/util/expression.ts +++ b/packages/compiler/test/render3/util/expression.ts @@ -87,9 +87,9 @@ class ExpressionSourceHumanizer extends e.RecursiveAstVisitor implements t.Visit this.recordAst(ast); super.visitPrefixNot(ast, null); } - override visitTypeofExpresion(ast: e.TypeofExpression) { + override visitTypeofExpression(ast: e.TypeofExpression) { this.recordAst(ast); - super.visitTypeofExpresion(ast, null); + super.visitTypeofExpression(ast, null); } override visitPropertyRead(ast: e.PropertyRead) { this.recordAst(ast); @@ -115,6 +115,14 @@ class ExpressionSourceHumanizer extends e.RecursiveAstVisitor implements t.Visit this.recordAst(ast); super.visitSafeCall(ast, null); } + override visitTemplateLiteral(ast: e.TemplateLiteral, context: any): void { + this.recordAst(ast); + super.visitTemplateLiteral(ast, null); + } + override visitTemplateLiteralElement(ast: e.TemplateLiteralElement, context: any): void { + this.recordAst(ast); + super.visitTemplateLiteralElement(ast, null); + } visitTemplate(ast: t.Template) { t.visitAll(this, ast.children); diff --git a/packages/compiler/test/shadow_css/host_and_host_context_spec.ts b/packages/compiler/test/shadow_css/host_and_host_context_spec.ts index 6bef826d196b..00ebbe9ad50d 100644 --- a/packages/compiler/test/shadow_css/host_and_host_context_spec.ts +++ b/packages/compiler/test/shadow_css/host_and_host_context_spec.ts @@ -257,6 +257,23 @@ describe('ShadowCss, :host and :host-context', () => { '{}', ); }); + + it('should handle :host-context with comma-separated child selector', () => { + expect(shim(':host-context(.foo) a:not(.a, .b) {}', 'contenta', 'a-host')).toEqualCss( + '.foo[a-host] a[contenta]:not(.a, .b), .foo [a-host] a[contenta]:not(.a, .b) {}', + ); + expect( + shim( + ':host-context(.foo) a:not([a], .b), .bar, :host-context(.baz) a:not([c], .d) {}', + 'contenta', + 'a-host', + ), + ).toEqualCss( + '.foo[a-host] a[contenta]:not([a], .b), .foo [a-host] a[contenta]:not([a], .b), ' + + '.bar[contenta], .baz[a-host] a[contenta]:not([c], .d), ' + + '.baz [a-host] a[contenta]:not([c], .d) {}', + ); + }); }); describe(':host-context and :host combination selector', () => { diff --git a/packages/core/BUILD.bazel b/packages/core/BUILD.bazel index db4b2d2a6be0..10c4d732956e 100644 --- a/packages/core/BUILD.bazel +++ b/packages/core/BUILD.bazel @@ -30,6 +30,7 @@ ng_module( ), deps = [ "//packages:types", + "//packages/core/primitives/dom-navigation", "//packages/core/primitives/event-dispatch", "//packages/core/primitives/signals", "//packages/core/src/compiler", diff --git a/packages/core/primitives/di/BUILD.bazel b/packages/core/primitives/di/BUILD.bazel new file mode 100644 index 000000000000..04bea3273c74 --- /dev/null +++ b/packages/core/primitives/di/BUILD.bazel @@ -0,0 +1,30 @@ +load("//tools:defaults.bzl", "ts_library", "tsec_test") + +package(default_visibility = [ + "//packages:__pkg__", + "//packages/core:__subpackages__", +]) + +ts_library( + name = "di", + srcs = glob( + [ + "**/*.ts", + ], + ), +) + +tsec_test( + name = "tsec_test", + target = "di", + tsconfig = "//packages:tsec_config", +) + +filegroup( + name = "files_for_docgen", + srcs = glob([ + "*.ts", + "src/**/*.ts", + ]), + visibility = ["//visibility:public"], +) diff --git a/packages/core/primitives/di/README.md b/packages/core/primitives/di/README.md new file mode 100644 index 000000000000..523ea424ec4d --- /dev/null +++ b/packages/core/primitives/di/README.md @@ -0,0 +1,3 @@ +# Angular Dependency Injection + +This directory contains the code which powers Angular's dependency injection primitive. diff --git a/packages/core/primitives/di/src/injection_token.ts b/packages/core/primitives/di/src/injection_token.ts new file mode 100644 index 000000000000..2b3998664a0a --- /dev/null +++ b/packages/core/primitives/di/src/injection_token.ts @@ -0,0 +1,54 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {Type} from './type'; +/** + * Information about how a type or `InjectionToken` interfaces with the DI system. + * + * At a minimum, this includes a `factory` which defines how to create the given type `T`, possibly + * requesting injection of other types if necessary. + * + * Optionally, a `providedIn` parameter specifies that the given type belongs to a particular + * `Injector`, `NgModule`, or a special scope (e.g. `'root'`). A value of `null` indicates + * that the injectable does not belong to any scope. + */ +export interface ɵɵInjectableDeclaration { + /** + * Specifies that the given type belongs to a particular injector: + */ + providedIn: Type | 'root' | 'platform' | 'any' | null; + + /** + * The token to which this definition belongs. + * + * Note that this may not be the same as the type that the `factory` will create. + */ + token: unknown; + + /** + * Factory method to execute to create an instance of the injectable. + */ + factory: (t?: Type) => T; + + /** + * In a case of no explicit injector, a location where the instance of the injectable is stored. + */ + value: T | undefined; +} + +/** + * A `Type` which has a `ɵprov: ɵɵInjectableDeclaration` static field. + * + * `InjectableType`s contain their own Dependency Injection metadata and are usable in an + * `InjectorDef`-based `StaticInjector`. + * + * @publicApi + */ +export interface InjectionToken extends Type { + ɵprov: ɵɵInjectableDeclaration; +} diff --git a/packages/core/primitives/di/src/injector.ts b/packages/core/primitives/di/src/injector.ts new file mode 100644 index 000000000000..8d5095e28553 --- /dev/null +++ b/packages/core/primitives/di/src/injector.ts @@ -0,0 +1,13 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {InjectionToken} from './injection_token'; + +export interface Injector { + get(token: InjectionToken, options: unknown): T | undefined; +} diff --git a/packages/core/primitives/di/src/type.ts b/packages/core/primitives/di/src/type.ts new file mode 100644 index 000000000000..6d1fd19632ad --- /dev/null +++ b/packages/core/primitives/di/src/type.ts @@ -0,0 +1,68 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +/** + * @description + * + * Represents a type that a Component or other object is instances of. + * + * An example of a `Type` is `MyCustomComponent` class, which in JavaScript is represented by + * the `MyCustomComponent` constructor function. + * + * @publicApi + */ +export const Type = Function; + +export function isType(v: any): v is Type { + return typeof v === 'function'; +} + +/** + * @description + * + * Represents an abstract class `T`, if applied to a concrete class it would stop being + * instantiable. + * + * @publicApi + */ +export interface AbstractType extends Function { + prototype: T; +} + +export interface Type extends Function { + new (...args: any[]): T; +} + +/** + * Returns a writable type version of type. + * + * USAGE: + * Given: + * ```ts + * interface Person {readonly name: string} + * ``` + * + * We would like to get a read/write version of `Person`. + * ```ts + * const WritablePerson = Writable; + * ``` + * + * The result is that you can do: + * + * ```ts + * const readonlyPerson: Person = {name: 'Marry'}; + * readonlyPerson.name = 'John'; // TypeError + * (readonlyPerson as WritablePerson).name = 'John'; // OK + * + * // Error: Correctly detects that `Person` did not have `age` property. + * (readonlyPerson as WritablePerson).age = 30; + * ``` + */ +export type Writable = { + -readonly [K in keyof T]: T[K]; +}; diff --git a/packages/core/primitives/dom-navigation/BUILD.bazel b/packages/core/primitives/dom-navigation/BUILD.bazel new file mode 100644 index 000000000000..f2c034c851f3 --- /dev/null +++ b/packages/core/primitives/dom-navigation/BUILD.bazel @@ -0,0 +1,32 @@ +load("//tools:defaults.bzl", "ts_library", "tsec_test") + +package(default_visibility = [ + "//packages:__pkg__", + "//packages/common:__subpackages__", + "//packages/core:__subpackages__", + "//tools/public_api_guard:__pkg__", +]) + +ts_library( + name = "dom-navigation", + srcs = glob( + [ + "*.ts", + "src/**/*.ts", + ], + ), +) + +tsec_test( + name = "tsec_test", + target = "dom-navigation", + tsconfig = "//packages:tsec_config", +) + +filegroup( + name = "files_for_docgen", + srcs = glob([ + "*.ts", + "src/**/*.ts", + ]), +) diff --git a/packages/core/primitives/dom-navigation/index.ts b/packages/core/primitives/dom-navigation/index.ts new file mode 100644 index 000000000000..3e6d512a0113 --- /dev/null +++ b/packages/core/primitives/dom-navigation/index.ts @@ -0,0 +1,9 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +export * from './src/navigation_types'; diff --git a/packages/common/testing/src/navigation/navigation_types.ts b/packages/core/primitives/dom-navigation/src/navigation_types.ts similarity index 98% rename from packages/common/testing/src/navigation/navigation_types.ts rename to packages/core/primitives/dom-navigation/src/navigation_types.ts index 0dafd4efe732..7e0d50c2d54f 100644 --- a/packages/common/testing/src/navigation/navigation_types.ts +++ b/packages/core/primitives/dom-navigation/src/navigation_types.ts @@ -6,6 +6,8 @@ * found in the LICENSE file at https://angular.dev/license */ +// TODO: Figure out how to use the types from NPM in the public API + export interface NavigationEventMap { navigate: NavigateEvent; navigatesuccess: Event; diff --git a/packages/core/primitives/dom-navigation/testing/BUILD.bazel b/packages/core/primitives/dom-navigation/testing/BUILD.bazel new file mode 100644 index 000000000000..b1a7413f47b4 --- /dev/null +++ b/packages/core/primitives/dom-navigation/testing/BUILD.bazel @@ -0,0 +1,34 @@ +load("//tools:defaults.bzl", "ts_library", "tsec_test") + +package(default_visibility = [ + "//packages:__pkg__", + "//packages/common:__subpackages__", + "//packages/core/primitives/dom-navigation/testing:__subpackages__", + "//packages/core/testing:__subpackages__", + "//tools/public_api_guard:__pkg__", +]) + +ts_library( + name = "testing", + srcs = glob( + [ + "**/*.ts", + ], + ), + deps = [ + "//packages/core/primitives/dom-navigation", + ], +) + +tsec_test( + name = "tsec_test", + target = "testing", + tsconfig = "//packages:tsec_config", +) + +filegroup( + name = "files_for_docgen", + srcs = glob([ + "*.ts", + ]), +) diff --git a/packages/core/primitives/dom-navigation/testing/fake_navigation.ts b/packages/core/primitives/dom-navigation/testing/fake_navigation.ts new file mode 100644 index 000000000000..bb00cfe17c0b --- /dev/null +++ b/packages/core/primitives/dom-navigation/testing/fake_navigation.ts @@ -0,0 +1,990 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { + NavigationNavigateOptions, + NavigationTypeString, + NavigationOptions, + NavigateEvent, + NavigationCurrentEntryChangeEvent, + NavigationTransition, + NavigationUpdateCurrentEntryOptions, + NavigationReloadOptions, + NavigationResult, + NavigationHistoryEntry, + NavigationInterceptOptions, + NavigationDestination, + Navigation, +} from '../src/navigation_types'; + +/** + * Fake implementation of user agent history and navigation behavior. This is a + * high-fidelity implementation of browser behavior that attempts to emulate + * things like traversal delay. + */ +export class FakeNavigation implements Navigation { + /** + * The fake implementation of an entries array. Only same-document entries + * allowed. + */ + private readonly entriesArr: FakeNavigationHistoryEntry[] = []; + + /** + * The current active entry index into `entriesArr`. + */ + private currentEntryIndex = 0; + + /** + * The current navigate event. + */ + private navigateEvent: InternalFakeNavigateEvent | undefined = undefined; + + /** + * A Map of pending traversals, so that traversals to the same entry can be + * re-used. + */ + private readonly traversalQueue = new Map(); + + /** + * A Promise that resolves when the previous traversals have finished. Used to + * simulate the cross-process communication necessary for traversals. + */ + private nextTraversal = Promise.resolve(); + + /** + * A prospective current active entry index, which includes unresolved + * traversals. Used by `go` to determine where navigations are intended to go. + */ + private prospectiveEntryIndex = 0; + + /** + * A test-only option to make traversals synchronous, rather than emulate + * cross-process communication. + */ + private synchronousTraversals = false; + + /** Whether to allow a call to setInitialEntryForTesting. */ + private canSetInitialEntry = true; + + /** `EventTarget` to dispatch events. */ + private eventTarget: EventTarget; + + /** The next unique id for created entries. Replace recreates this id. */ + private nextId = 0; + + /** The next unique key for created entries. Replace inherits this id. */ + private nextKey = 0; + + /** Whether this fake is disposed. */ + private disposed = false; + + /** Equivalent to `navigation.currentEntry`. */ + get currentEntry(): FakeNavigationHistoryEntry { + return this.entriesArr[this.currentEntryIndex]; + } + + get canGoBack(): boolean { + return this.currentEntryIndex > 0; + } + + get canGoForward(): boolean { + return this.currentEntryIndex < this.entriesArr.length - 1; + } + + constructor( + private readonly window: Window, + startURL: `http${string}`, + ) { + this.eventTarget = this.window.document.createElement('div'); + // First entry. + this.setInitialEntryForTesting(startURL); + } + + /** + * Sets the initial entry. + */ + setInitialEntryForTesting( + url: `http${string}`, + options: {historyState: unknown; state?: unknown} = {historyState: null}, + ): void { + if (!this.canSetInitialEntry) { + throw new Error( + 'setInitialEntryForTesting can only be called before any ' + 'navigation has occurred', + ); + } + const currentInitialEntry = this.entriesArr[0]; + this.entriesArr[0] = new FakeNavigationHistoryEntry(new URL(url).toString(), { + index: 0, + key: currentInitialEntry?.key ?? String(this.nextKey++), + id: currentInitialEntry?.id ?? String(this.nextId++), + sameDocument: true, + historyState: options?.historyState, + state: options.state, + }); + } + + /** Returns whether the initial entry is still eligible to be set. */ + canSetInitialEntryForTesting(): boolean { + return this.canSetInitialEntry; + } + + /** + * Sets whether to emulate traversals as synchronous rather than + * asynchronous. + */ + setSynchronousTraversalsForTesting(synchronousTraversals: boolean): void { + this.synchronousTraversals = synchronousTraversals; + } + + /** Equivalent to `navigation.entries()`. */ + entries(): FakeNavigationHistoryEntry[] { + return this.entriesArr.slice(); + } + + /** Equivalent to `navigation.navigate()`. */ + navigate(url: string, options?: NavigationNavigateOptions): FakeNavigationResult { + const fromUrl = new URL(this.currentEntry.url!); + const toUrl = new URL(url, this.currentEntry.url!); + + let navigationType: NavigationTypeString; + if (!options?.history || options.history === 'auto') { + // Auto defaults to push, but if the URLs are the same, is a replace. + if (fromUrl.toString() === toUrl.toString()) { + navigationType = 'replace'; + } else { + navigationType = 'push'; + } + } else { + navigationType = options.history; + } + + const hashChange = isHashChange(fromUrl, toUrl); + + const destination = new FakeNavigationDestination({ + url: toUrl.toString(), + state: options?.state, + sameDocument: hashChange, + historyState: null, + }); + const result = new InternalNavigationResult(); + + this.userAgentNavigate(destination, result, { + navigationType, + cancelable: true, + canIntercept: true, + // Always false for navigate(). + userInitiated: false, + hashChange, + info: options?.info, + }); + + return { + committed: result.committed, + finished: result.finished, + }; + } + + /** Equivalent to `history.pushState()`. */ + pushState(data: unknown, title: string, url?: string): void { + this.pushOrReplaceState('push', data, title, url); + } + + /** Equivalent to `history.replaceState()`. */ + replaceState(data: unknown, title: string, url?: string): void { + this.pushOrReplaceState('replace', data, title, url); + } + + private pushOrReplaceState( + navigationType: NavigationTypeString, + data: unknown, + _title: string, + url?: string, + ): void { + const fromUrl = new URL(this.currentEntry.url!); + const toUrl = url ? new URL(url, this.currentEntry.url!) : fromUrl; + + const hashChange = isHashChange(fromUrl, toUrl); + + const destination = new FakeNavigationDestination({ + url: toUrl.toString(), + sameDocument: true, + historyState: data, + }); + const result = new InternalNavigationResult(); + + this.userAgentNavigate(destination, result, { + navigationType, + cancelable: true, + canIntercept: true, + // Always false for pushState() or replaceState(). + userInitiated: false, + hashChange, + skipPopState: true, + }); + } + + /** Equivalent to `navigation.traverseTo()`. */ + traverseTo(key: string, options?: NavigationOptions): FakeNavigationResult { + const fromUrl = new URL(this.currentEntry.url!); + const entry = this.findEntry(key); + if (!entry) { + const domException = new DOMException('Invalid key', 'InvalidStateError'); + const committed = Promise.reject(domException); + const finished = Promise.reject(domException); + committed.catch(() => {}); + finished.catch(() => {}); + return { + committed, + finished, + }; + } + if (entry === this.currentEntry) { + return { + committed: Promise.resolve(this.currentEntry), + finished: Promise.resolve(this.currentEntry), + }; + } + if (this.traversalQueue.has(entry.key)) { + const existingResult = this.traversalQueue.get(entry.key)!; + return { + committed: existingResult.committed, + finished: existingResult.finished, + }; + } + + const hashChange = isHashChange(fromUrl, new URL(entry.url!, this.currentEntry.url!)); + const destination = new FakeNavigationDestination({ + url: entry.url!, + state: entry.getState(), + historyState: entry.getHistoryState(), + key: entry.key, + id: entry.id, + index: entry.index, + sameDocument: entry.sameDocument, + }); + this.prospectiveEntryIndex = entry.index; + const result = new InternalNavigationResult(); + this.traversalQueue.set(entry.key, result); + this.runTraversal(() => { + this.traversalQueue.delete(entry.key); + this.userAgentNavigate(destination, result, { + navigationType: 'traverse', + cancelable: true, + canIntercept: true, + // Always false for traverseTo(). + userInitiated: false, + hashChange, + info: options?.info, + }); + }); + return { + committed: result.committed, + finished: result.finished, + }; + } + + /** Equivalent to `navigation.back()`. */ + back(options?: NavigationOptions): FakeNavigationResult { + if (this.currentEntryIndex === 0) { + const domException = new DOMException('Cannot go back', 'InvalidStateError'); + const committed = Promise.reject(domException); + const finished = Promise.reject(domException); + committed.catch(() => {}); + finished.catch(() => {}); + return { + committed, + finished, + }; + } + const entry = this.entriesArr[this.currentEntryIndex - 1]; + return this.traverseTo(entry.key, options); + } + + /** Equivalent to `navigation.forward()`. */ + forward(options?: NavigationOptions): FakeNavigationResult { + if (this.currentEntryIndex === this.entriesArr.length - 1) { + const domException = new DOMException('Cannot go forward', 'InvalidStateError'); + const committed = Promise.reject(domException); + const finished = Promise.reject(domException); + committed.catch(() => {}); + finished.catch(() => {}); + return { + committed, + finished, + }; + } + const entry = this.entriesArr[this.currentEntryIndex + 1]; + return this.traverseTo(entry.key, options); + } + + /** + * Equivalent to `history.go()`. + * Note that this method does not actually work precisely to how Chrome + * does, instead choosing a simpler model with less unexpected behavior. + * Chrome has a few edge case optimizations, for instance with repeated + * `back(); forward()` chains it collapses certain traversals. + */ + go(direction: number): void { + const targetIndex = this.prospectiveEntryIndex + direction; + if (targetIndex >= this.entriesArr.length || targetIndex < 0) { + return; + } + this.prospectiveEntryIndex = targetIndex; + this.runTraversal(() => { + // Check again that destination is in the entries array. + if (targetIndex >= this.entriesArr.length || targetIndex < 0) { + return; + } + const fromUrl = new URL(this.currentEntry.url!); + const entry = this.entriesArr[targetIndex]; + const hashChange = isHashChange(fromUrl, new URL(entry.url!, this.currentEntry.url!)); + const destination = new FakeNavigationDestination({ + url: entry.url!, + state: entry.getState(), + historyState: entry.getHistoryState(), + key: entry.key, + id: entry.id, + index: entry.index, + sameDocument: entry.sameDocument, + }); + const result = new InternalNavigationResult(); + this.userAgentNavigate(destination, result, { + navigationType: 'traverse', + cancelable: true, + canIntercept: true, + // Always false for go(). + userInitiated: false, + hashChange, + }); + }); + } + + /** Runs a traversal synchronously or asynchronously */ + private runTraversal(traversal: () => void) { + if (this.synchronousTraversals) { + traversal(); + return; + } + + // Each traversal occupies a single timeout resolution. + // This means that Promises added to commit and finish should resolve + // before the next traversal. + this.nextTraversal = this.nextTraversal.then(() => { + return new Promise((resolve) => { + setTimeout(() => { + resolve(); + traversal(); + }); + }); + }); + } + + /** Equivalent to `navigation.addEventListener()`. */ + addEventListener( + type: string, + callback: EventListenerOrEventListenerObject, + options?: AddEventListenerOptions | boolean, + ): void { + this.eventTarget.addEventListener(type, callback, options); + } + + /** Equivalent to `navigation.removeEventListener()`. */ + removeEventListener( + type: string, + callback: EventListenerOrEventListenerObject, + options?: EventListenerOptions | boolean, + ): void { + this.eventTarget.removeEventListener(type, callback, options); + } + + /** Equivalent to `navigation.dispatchEvent()` */ + dispatchEvent(event: Event): boolean { + return this.eventTarget.dispatchEvent(event); + } + + /** Cleans up resources. */ + dispose(): void { + // Recreate eventTarget to release current listeners. + // `document.createElement` because NodeJS `EventTarget` is incompatible with Domino's `Event`. + this.eventTarget = this.window.document.createElement('div'); + this.disposed = true; + } + + /** Returns whether this fake is disposed. */ + isDisposed(): boolean { + return this.disposed; + } + + /** Implementation for all navigations and traversals. */ + private userAgentNavigate( + destination: FakeNavigationDestination, + result: InternalNavigationResult, + options: InternalNavigateOptions, + ) { + // The first navigation should disallow any future calls to set the initial + // entry. + this.canSetInitialEntry = false; + if (this.navigateEvent) { + this.navigateEvent.cancel(new DOMException('Navigation was aborted', 'AbortError')); + this.navigateEvent = undefined; + } + + const navigateEvent = createFakeNavigateEvent({ + navigationType: options.navigationType, + cancelable: options.cancelable, + canIntercept: options.canIntercept, + userInitiated: options.userInitiated, + hashChange: options.hashChange, + signal: result.signal, + destination, + info: options.info, + sameDocument: destination.sameDocument, + skipPopState: options.skipPopState, + result, + userAgentCommit: () => { + this.userAgentCommit(); + }, + }); + + this.navigateEvent = navigateEvent; + this.eventTarget.dispatchEvent(navigateEvent); + navigateEvent.dispatchedNavigateEvent(); + if (navigateEvent.commitOption === 'immediate') { + navigateEvent.commit(/* internal= */ true); + } + } + + /** Implementation to commit a navigation. */ + private userAgentCommit() { + if (!this.navigateEvent) { + return; + } + const from = this.currentEntry; + if (!this.navigateEvent.sameDocument) { + const error = new Error('Cannot navigate to a non-same-document URL.'); + this.navigateEvent.cancel(error); + throw error; + } + if ( + this.navigateEvent.navigationType === 'push' || + this.navigateEvent.navigationType === 'replace' + ) { + this.userAgentPushOrReplace(this.navigateEvent.destination, { + navigationType: this.navigateEvent.navigationType, + }); + } else if (this.navigateEvent.navigationType === 'traverse') { + this.userAgentTraverse(this.navigateEvent.destination); + } + this.navigateEvent.userAgentNavigated(this.currentEntry); + const currentEntryChangeEvent = createFakeNavigationCurrentEntryChangeEvent({ + from, + navigationType: this.navigateEvent.navigationType, + }); + this.eventTarget.dispatchEvent(currentEntryChangeEvent); + if (!this.navigateEvent.skipPopState) { + const popStateEvent = createPopStateEvent({ + state: this.navigateEvent.destination.getHistoryState(), + }); + this.window.dispatchEvent(popStateEvent); + } + } + + /** Implementation for a push or replace navigation. */ + private userAgentPushOrReplace( + destination: FakeNavigationDestination, + {navigationType}: {navigationType: NavigationTypeString}, + ) { + if (navigationType === 'push') { + this.currentEntryIndex++; + this.prospectiveEntryIndex = this.currentEntryIndex; + } + const index = this.currentEntryIndex; + const key = navigationType === 'push' ? String(this.nextKey++) : this.currentEntry.key; + const entry = new FakeNavigationHistoryEntry(destination.url, { + id: String(this.nextId++), + key, + index, + sameDocument: true, + state: destination.getState(), + historyState: destination.getHistoryState(), + }); + if (navigationType === 'push') { + this.entriesArr.splice(index, Infinity, entry); + } else { + this.entriesArr[index] = entry; + } + } + + /** Implementation for a traverse navigation. */ + private userAgentTraverse(destination: FakeNavigationDestination) { + this.currentEntryIndex = destination.index; + } + + /** Utility method for finding entries with the given `key`. */ + private findEntry(key: string) { + for (const entry of this.entriesArr) { + if (entry.key === key) return entry; + } + return undefined; + } + + set onnavigate( + // tslint:disable-next-line:no-any + _handler: ((this: Navigation, ev: NavigateEvent) => any) | null, + ) { + throw new Error('unimplemented'); + } + + // tslint:disable-next-line:no-any + get onnavigate(): ((this: Navigation, ev: NavigateEvent) => any) | null { + throw new Error('unimplemented'); + } + + set oncurrententrychange( + _handler: // tslint:disable-next-line:no-any + ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any) | null, + ) { + throw new Error('unimplemented'); + } + + get oncurrententrychange(): // tslint:disable-next-line:no-any + ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any) | null { + throw new Error('unimplemented'); + } + + set onnavigatesuccess( + // tslint:disable-next-line:no-any + _handler: ((this: Navigation, ev: Event) => any) | null, + ) { + throw new Error('unimplemented'); + } + + // tslint:disable-next-line:no-any + get onnavigatesuccess(): ((this: Navigation, ev: Event) => any) | null { + throw new Error('unimplemented'); + } + + set onnavigateerror( + // tslint:disable-next-line:no-any + _handler: ((this: Navigation, ev: ErrorEvent) => any) | null, + ) { + throw new Error('unimplemented'); + } + + // tslint:disable-next-line:no-any + get onnavigateerror(): ((this: Navigation, ev: ErrorEvent) => any) | null { + throw new Error('unimplemented'); + } + + get transition(): NavigationTransition | null { + throw new Error('unimplemented'); + } + + updateCurrentEntry(_options: NavigationUpdateCurrentEntryOptions): void { + throw new Error('unimplemented'); + } + + reload(_options?: NavigationReloadOptions): NavigationResult { + throw new Error('unimplemented'); + } +} + +/** + * Fake equivalent of the `NavigationResult` interface with + * `FakeNavigationHistoryEntry`. + */ +interface FakeNavigationResult extends NavigationResult { + readonly committed: Promise; + readonly finished: Promise; +} + +/** + * Fake equivalent of `NavigationHistoryEntry`. + */ +export class FakeNavigationHistoryEntry implements NavigationHistoryEntry { + readonly sameDocument: boolean; + + readonly id: string; + readonly key: string; + readonly index: number; + private readonly state: unknown; + private readonly historyState: unknown; + + // tslint:disable-next-line:no-any + ondispose: ((this: NavigationHistoryEntry, ev: Event) => any) | null = null; + + constructor( + readonly url: string | null, + { + id, + key, + index, + sameDocument, + state, + historyState, + }: { + id: string; + key: string; + index: number; + sameDocument: boolean; + historyState: unknown; + state?: unknown; + }, + ) { + this.id = id; + this.key = key; + this.index = index; + this.sameDocument = sameDocument; + this.state = state; + this.historyState = historyState; + } + + getState(): unknown { + // Budget copy. + return this.state ? (JSON.parse(JSON.stringify(this.state)) as unknown) : this.state; + } + + getHistoryState(): unknown { + // Budget copy. + return this.historyState + ? (JSON.parse(JSON.stringify(this.historyState)) as unknown) + : this.historyState; + } + + addEventListener( + type: string, + callback: EventListenerOrEventListenerObject, + options?: AddEventListenerOptions | boolean, + ): void { + throw new Error('unimplemented'); + } + + removeEventListener( + type: string, + callback: EventListenerOrEventListenerObject, + options?: EventListenerOptions | boolean, + ): void { + throw new Error('unimplemented'); + } + + dispatchEvent(event: Event): boolean { + throw new Error('unimplemented'); + } +} + +/** `NavigationInterceptOptions` with experimental commit option. */ +export interface ExperimentalNavigationInterceptOptions extends NavigationInterceptOptions { + commit?: 'immediate' | 'after-transition'; +} + +/** `NavigateEvent` with experimental commit function. */ +export interface ExperimentalNavigateEvent extends NavigateEvent { + intercept(options?: ExperimentalNavigationInterceptOptions): void; + + commit(): void; +} + +/** + * Fake equivalent of `NavigateEvent`. + */ +export interface FakeNavigateEvent extends ExperimentalNavigateEvent { + readonly destination: FakeNavigationDestination; +} + +interface InternalFakeNavigateEvent extends FakeNavigateEvent { + readonly sameDocument: boolean; + readonly skipPopState?: boolean; + readonly commitOption: 'after-transition' | 'immediate'; + readonly result: InternalNavigationResult; + + commit(internal?: boolean): void; + cancel(reason: Error): void; + dispatchedNavigateEvent(): void; + userAgentNavigated(entry: FakeNavigationHistoryEntry): void; +} + +/** + * Create a fake equivalent of `NavigateEvent`. This is not a class because ES5 + * transpiled JavaScript cannot extend native Event. + */ +function createFakeNavigateEvent({ + cancelable, + canIntercept, + userInitiated, + hashChange, + navigationType, + signal, + destination, + info, + sameDocument, + skipPopState, + result, + userAgentCommit, +}: { + cancelable: boolean; + canIntercept: boolean; + userInitiated: boolean; + hashChange: boolean; + navigationType: NavigationTypeString; + signal: AbortSignal; + destination: FakeNavigationDestination; + info: unknown; + sameDocument: boolean; + skipPopState?: boolean; + result: InternalNavigationResult; + userAgentCommit: () => void; +}) { + const event = new Event('navigate', {bubbles: false, cancelable}) as { + -readonly [P in keyof InternalFakeNavigateEvent]: InternalFakeNavigateEvent[P]; + }; + event.canIntercept = canIntercept; + event.userInitiated = userInitiated; + event.hashChange = hashChange; + event.navigationType = navigationType; + event.signal = signal; + event.destination = destination; + event.info = info; + event.downloadRequest = null; + event.formData = null; + + event.sameDocument = sameDocument; + event.skipPopState = skipPopState; + event.commitOption = 'immediate'; + + let handlerFinished: Promise | undefined = undefined; + let interceptCalled = false; + let dispatchedNavigateEvent = false; + let commitCalled = false; + + event.intercept = function ( + this: InternalFakeNavigateEvent, + options?: ExperimentalNavigationInterceptOptions, + ): void { + interceptCalled = true; + event.sameDocument = true; + const handler = options?.handler; + if (handler) { + handlerFinished = handler(); + } + if (options?.commit) { + event.commitOption = options.commit; + } + // TODO: handle focus reset and scroll? + }; + + event.scroll = function (this: InternalFakeNavigateEvent): void { + // TODO: handle scroll? + }; + + event.commit = function (this: InternalFakeNavigateEvent, internal = false) { + if (!internal && !interceptCalled) { + throw new DOMException( + `Failed to execute 'commit' on 'NavigateEvent': intercept() must be ` + + `called before commit().`, + 'InvalidStateError', + ); + } + if (!dispatchedNavigateEvent) { + throw new DOMException( + `Failed to execute 'commit' on 'NavigateEvent': commit() may not be ` + + `called during event dispatch.`, + 'InvalidStateError', + ); + } + if (commitCalled) { + throw new DOMException( + `Failed to execute 'commit' on 'NavigateEvent': commit() already ` + `called.`, + 'InvalidStateError', + ); + } + commitCalled = true; + + userAgentCommit(); + }; + + // Internal only. + event.cancel = function (this: InternalFakeNavigateEvent, reason: Error) { + result.committedReject(reason); + result.finishedReject(reason); + }; + + // Internal only. + event.dispatchedNavigateEvent = function (this: InternalFakeNavigateEvent) { + dispatchedNavigateEvent = true; + if (event.commitOption === 'after-transition') { + // If handler finishes before commit, call commit. + handlerFinished?.then( + () => { + if (!commitCalled) { + event.commit(/* internal */ true); + } + }, + () => {}, + ); + } + Promise.all([result.committed, handlerFinished]).then( + ([entry]) => { + result.finishedResolve(entry); + }, + (reason) => { + result.finishedReject(reason); + }, + ); + }; + + // Internal only. + event.userAgentNavigated = function ( + this: InternalFakeNavigateEvent, + entry: FakeNavigationHistoryEntry, + ) { + result.committedResolve(entry); + }; + + return event as InternalFakeNavigateEvent; +} + +/** Fake equivalent of `NavigationCurrentEntryChangeEvent`. */ +export interface FakeNavigationCurrentEntryChangeEvent extends NavigationCurrentEntryChangeEvent { + readonly from: FakeNavigationHistoryEntry; +} + +/** + * Create a fake equivalent of `NavigationCurrentEntryChange`. This does not use + * a class because ES5 transpiled JavaScript cannot extend native Event. + */ +function createFakeNavigationCurrentEntryChangeEvent({ + from, + navigationType, +}: { + from: FakeNavigationHistoryEntry; + navigationType: NavigationTypeString; +}) { + const event = new Event('currententrychange', { + bubbles: false, + cancelable: false, + }) as { + -readonly [P in keyof NavigationCurrentEntryChangeEvent]: NavigationCurrentEntryChangeEvent[P]; + }; + event.from = from; + event.navigationType = navigationType; + return event as FakeNavigationCurrentEntryChangeEvent; +} + +/** + * Create a fake equivalent of `PopStateEvent`. This does not use a class + * because ES5 transpiled JavaScript cannot extend native Event. + */ +function createPopStateEvent({state}: {state: unknown}) { + const event = new Event('popstate', { + bubbles: false, + cancelable: false, + }) as {-readonly [P in keyof PopStateEvent]: PopStateEvent[P]}; + event.state = state; + return event as PopStateEvent; +} + +/** + * Fake equivalent of `NavigationDestination`. + */ +export class FakeNavigationDestination implements NavigationDestination { + readonly url: string; + readonly sameDocument: boolean; + readonly key: string | null; + readonly id: string | null; + readonly index: number; + + private readonly state?: unknown; + private readonly historyState: unknown; + + constructor({ + url, + sameDocument, + historyState, + state, + key = null, + id = null, + index = -1, + }: { + url: string; + sameDocument: boolean; + historyState: unknown; + state?: unknown; + key?: string | null; + id?: string | null; + index?: number; + }) { + this.url = url; + this.sameDocument = sameDocument; + this.state = state; + this.historyState = historyState; + this.key = key; + this.id = id; + this.index = index; + } + + getState(): unknown { + return this.state; + } + + getHistoryState(): unknown { + return this.historyState; + } +} + +/** Utility function to determine whether two UrlLike have the same hash. */ +function isHashChange(from: URL, to: URL): boolean { + return ( + to.hash !== from.hash && + to.hostname === from.hostname && + to.pathname === from.pathname && + to.search === from.search + ); +} + +/** Internal utility class for representing the result of a navigation. */ +class InternalNavigationResult { + committedResolve!: (entry: FakeNavigationHistoryEntry) => void; + committedReject!: (reason: Error) => void; + finishedResolve!: (entry: FakeNavigationHistoryEntry) => void; + finishedReject!: (reason: Error) => void; + readonly committed: Promise; + readonly finished: Promise; + get signal(): AbortSignal { + return this.abortController.signal; + } + private readonly abortController = new AbortController(); + + constructor() { + this.committed = new Promise((resolve, reject) => { + this.committedResolve = resolve; + this.committedReject = reject; + }); + + this.finished = new Promise(async (resolve, reject) => { + this.finishedResolve = resolve; + this.finishedReject = (reason: Error) => { + reject(reason); + this.abortController.abort(reason); + }; + }); + // All rejections are handled. + this.committed.catch(() => {}); + this.finished.catch(() => {}); + } +} + +/** Internal options for performing a navigate. */ +interface InternalNavigateOptions { + navigationType: NavigationTypeString; + cancelable: boolean; + canIntercept: boolean; + userInitiated: boolean; + hashChange: boolean; + info?: unknown; + skipPopState?: boolean; +} diff --git a/packages/core/primitives/dom-navigation/testing/index.ts b/packages/core/primitives/dom-navigation/testing/index.ts new file mode 100644 index 000000000000..6d537170b6fb --- /dev/null +++ b/packages/core/primitives/dom-navigation/testing/index.ts @@ -0,0 +1,9 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +export * from './fake_navigation'; diff --git a/packages/core/primitives/dom-navigation/testing/test/BUILD.bazel b/packages/core/primitives/dom-navigation/testing/test/BUILD.bazel new file mode 100644 index 000000000000..ff18b1754929 --- /dev/null +++ b/packages/core/primitives/dom-navigation/testing/test/BUILD.bazel @@ -0,0 +1,30 @@ +load("//tools:defaults.bzl", "jasmine_node_test", "karma_web_test_suite", "ts_library") + +ts_library( + name = "test_lib", + testonly = True, + srcs = glob( + ["**/*.ts"], + ), + # Visible to //:saucelabs_unit_tests_poc target + visibility = ["//:__pkg__"], + deps = [ + "//packages/core/primitives/dom-navigation/testing", + "//packages/private/testing", + ], +) + +jasmine_node_test( + name = "test", + bootstrap = ["//tools/testing:node"], + deps = [ + ":test_lib", + ], +) + +karma_web_test_suite( + name = "test_web", + deps = [ + ":test_lib", + ], +) diff --git a/packages/common/test/navigation/fake_platform_navigation.spec.ts b/packages/core/primitives/dom-navigation/testing/test/fake_platform_navigation.spec.ts similarity index 99% rename from packages/common/test/navigation/fake_platform_navigation.spec.ts rename to packages/core/primitives/dom-navigation/testing/test/fake_platform_navigation.spec.ts index b69d4556949d..2397159729dc 100644 --- a/packages/common/test/navigation/fake_platform_navigation.spec.ts +++ b/packages/core/primitives/dom-navigation/testing/test/fake_platform_navigation.spec.ts @@ -11,7 +11,10 @@ import { FakeNavigateEvent, FakeNavigation, FakeNavigationCurrentEntryChangeEvent, -} from '../../testing/src/navigation/fake_navigation'; +} from '../fake_navigation'; +import {ensureDocument} from '@angular/private/testing'; + +ensureDocument(); interface Locals { navigation: FakeNavigation; diff --git a/packages/core/primitives/event-dispatch/src/event.ts b/packages/core/primitives/event-dispatch/src/event.ts index 1f11f260372e..a9cc6dc0851e 100644 --- a/packages/core/primitives/event-dispatch/src/event.ts +++ b/packages/core/primitives/event-dispatch/src/event.ts @@ -418,7 +418,7 @@ export function createMouseSpecialEvent(e: Event, target: Element): Event { // this event into a pseudo-real mouseenter/mouseleave event by adjusting // its type. // - const copy: {-readonly [P in keyof Event]?: Event[P]} = {}; + const copy: {-readonly [P in keyof Event]?: Event[P]} & {'_originalEvent'?: Event} = {}; for (const property in e) { if (property === 'srcElement' || property === 'target') { continue; @@ -444,6 +444,7 @@ export function createMouseSpecialEvent(e: Event, target: Element): Event { } copy['target'] = copy['srcElement'] = target; copy['bubbles'] = false; + copy['_originalEvent'] = e; return copy as Event; } diff --git a/packages/core/primitives/signals/index.ts b/packages/core/primitives/signals/index.ts index eefe84ace978..ce3c28f908ec 100644 --- a/packages/core/primitives/signals/index.ts +++ b/packages/core/primitives/signals/index.ts @@ -7,6 +7,14 @@ */ export {ComputedNode, createComputed} from './src/computed'; +export { + ComputationFn, + LinkedSignalNode, + LinkedSignalGetter, + createLinkedSignal, + linkedSignalSetFn, + linkedSignalUpdateFn, +} from './src/linked_signal'; export {ValueEqualityFn, defaultEquals} from './src/equality'; export {setThrowInvalidWriteToSignalError} from './src/errors'; export { diff --git a/packages/core/primitives/signals/src/computed.ts b/packages/core/primitives/signals/src/computed.ts index 40df317cb7d9..2f8586545bc9 100644 --- a/packages/core/primitives/signals/src/computed.ts +++ b/packages/core/primitives/signals/src/computed.ts @@ -14,6 +14,7 @@ import { producerUpdateValueVersion, REACTIVE_NODE, ReactiveNode, + setActiveConsumer, SIGNAL, } from './graph'; @@ -75,21 +76,21 @@ export function createComputed(computation: () => T): ComputedGetter { * A dedicated symbol used before a computed value has been calculated for the first time. * Explicitly typed as `any` so we can use it as signal's value. */ -const UNSET: any = /* @__PURE__ */ Symbol('UNSET'); +export const UNSET: any = /* @__PURE__ */ Symbol('UNSET'); /** * A dedicated symbol used in place of a computed signal value to indicate that a given computation * is in progress. Used to detect cycles in computation chains. * Explicitly typed as `any` so we can use it as signal's value. */ -const COMPUTING: any = /* @__PURE__ */ Symbol('COMPUTING'); +export const COMPUTING: any = /* @__PURE__ */ Symbol('COMPUTING'); /** * A dedicated symbol used in place of a computed signal value to indicate that a given computation * failed. The thrown error is cached until the computation gets dirty again. * Explicitly typed as `any` so we can use it as signal's value. */ -const ERRORED: any = /* @__PURE__ */ Symbol('ERRORED'); +export const ERRORED: any = /* @__PURE__ */ Symbol('ERRORED'); // Note: Using an IIFE here to ensure that the spread assignment is not considered // a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`. @@ -120,8 +121,17 @@ const COMPUTED_NODE = /* @__PURE__ */ (() => { const prevConsumer = consumerBeforeComputation(node); let newValue: unknown; + let wasEqual = false; try { newValue = node.computation(); + // We want to mark this node as errored if calling `equal` throws; however, we don't want + // to track any reactive reads inside `equal`. + setActiveConsumer(null); + wasEqual = + oldValue !== UNSET && + oldValue !== ERRORED && + newValue !== ERRORED && + node.equal(oldValue, newValue); } catch (err) { newValue = ERRORED; node.error = err; @@ -129,12 +139,7 @@ const COMPUTED_NODE = /* @__PURE__ */ (() => { consumerAfterComputation(node, prevConsumer); } - if ( - oldValue !== UNSET && - oldValue !== ERRORED && - newValue !== ERRORED && - node.equal(oldValue, newValue) - ) { + if (wasEqual) { // No change to `valueVersion` - old and new values are // semantically equivalent. node.value = oldValue; diff --git a/packages/core/primitives/signals/src/errors.ts b/packages/core/primitives/signals/src/errors.ts index c6836a37137f..fc0fa71e33d7 100644 --- a/packages/core/primitives/signals/src/errors.ts +++ b/packages/core/primitives/signals/src/errors.ts @@ -6,16 +6,18 @@ * found in the LICENSE file at https://angular.dev/license */ +import type {SignalNode} from './signal'; + function defaultThrowError(): never { throw new Error(); } -let throwInvalidWriteToSignalErrorFn = defaultThrowError; +let throwInvalidWriteToSignalErrorFn: (node: SignalNode) => never = defaultThrowError; -export function throwInvalidWriteToSignalError() { - throwInvalidWriteToSignalErrorFn(); +export function throwInvalidWriteToSignalError(node: SignalNode) { + throwInvalidWriteToSignalErrorFn(node); } -export function setThrowInvalidWriteToSignalError(fn: () => never): void { +export function setThrowInvalidWriteToSignalError(fn: (node: SignalNode) => never): void { throwInvalidWriteToSignalErrorFn = fn; } diff --git a/packages/core/primitives/signals/src/linked_signal.ts b/packages/core/primitives/signals/src/linked_signal.ts new file mode 100644 index 000000000000..4ff9737fe4b0 --- /dev/null +++ b/packages/core/primitives/signals/src/linked_signal.ts @@ -0,0 +1,165 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {COMPUTING, ERRORED, UNSET} from './computed'; +import {defaultEquals, ValueEqualityFn} from './equality'; +import { + consumerAfterComputation, + consumerBeforeComputation, + producerAccessed, + producerMarkClean, + producerUpdateValueVersion, + REACTIVE_NODE, + ReactiveNode, + SIGNAL, +} from './graph'; +import {signalSetFn, signalUpdateFn} from './signal'; + +export type ComputationFn = (source: S, previous?: {source: S; value: D}) => D; + +export interface LinkedSignalNode extends ReactiveNode { + /** + * Value of the source signal that was used to derive the computed value. + */ + sourceValue: S; + + /** + * Current state value, or one of the sentinel values (`UNSET`, `COMPUTING`, + * `ERROR`). + */ + value: D; + + /** + * If `value` is `ERRORED`, the error caught from the last computation attempt which will + * be re-thrown. + */ + error: unknown; + + /** + * The source function represents reactive dependency based on which the linked state is reset. + */ + source: () => S; + + /** + * The computation function which will produce a new value based on the source and, optionally - previous values. + */ + computation: ComputationFn; + + equal: ValueEqualityFn; +} + +export type LinkedSignalGetter = (() => D) & { + [SIGNAL]: LinkedSignalNode; +}; + +export function createLinkedSignal( + sourceFn: () => S, + computationFn: ComputationFn, + equalityFn?: ValueEqualityFn, +): LinkedSignalGetter { + const node: LinkedSignalNode = Object.create(LINKED_SIGNAL_NODE); + + node.source = sourceFn; + node.computation = computationFn; + if (equalityFn != undefined) { + node.equal = equalityFn; + } + + const linkedSignalGetter = () => { + // Check if the value needs updating before returning it. + producerUpdateValueVersion(node); + + // Record that someone looked at this signal. + producerAccessed(node); + + if (node.value === ERRORED) { + throw node.error; + } + + return node.value; + }; + + const getter = linkedSignalGetter as LinkedSignalGetter; + getter[SIGNAL] = node; + + return getter; +} + +export function linkedSignalSetFn(node: LinkedSignalNode, newValue: D) { + producerUpdateValueVersion(node); + signalSetFn(node, newValue); + producerMarkClean(node); +} + +export function linkedSignalUpdateFn( + node: LinkedSignalNode, + updater: (value: D) => D, +): void { + producerUpdateValueVersion(node); + signalUpdateFn(node, updater); + producerMarkClean(node); +} + +// Note: Using an IIFE here to ensure that the spread assignment is not considered +// a side-effect, ending up preserving `LINKED_SIGNAL_NODE` and `REACTIVE_NODE`. +// TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved. +export const LINKED_SIGNAL_NODE = /* @__PURE__ */ (() => { + return { + ...REACTIVE_NODE, + value: UNSET, + dirty: true, + error: null, + equal: defaultEquals, + + producerMustRecompute(node: LinkedSignalNode): boolean { + // Force a recomputation if there's no current value, or if the current value is in the + // process of being calculated (which should throw an error). + return node.value === UNSET || node.value === COMPUTING; + }, + + producerRecomputeValue(node: LinkedSignalNode): void { + if (node.value === COMPUTING) { + // Our computation somehow led to a cyclic read of itself. + throw new Error('Detected cycle in computations.'); + } + + const oldValue = node.value; + node.value = COMPUTING; + + const prevConsumer = consumerBeforeComputation(node); + let newValue: unknown; + try { + const newSourceValue = node.source(); + const prev = + oldValue === UNSET || oldValue === ERRORED + ? undefined + : { + source: node.sourceValue, + value: oldValue, + }; + newValue = node.computation(newSourceValue, prev); + node.sourceValue = newSourceValue; + } catch (err) { + newValue = ERRORED; + node.error = err; + } finally { + consumerAfterComputation(node, prevConsumer); + } + + if (oldValue !== UNSET && newValue !== ERRORED && node.equal(oldValue, newValue)) { + // No change to `valueVersion` - old and new values are + // semantically equivalent. + node.value = oldValue; + return; + } + + node.value = newValue; + node.version++; + }, + }; +})(); diff --git a/packages/core/primitives/signals/src/signal.ts b/packages/core/primitives/signals/src/signal.ts index 7517228bab0e..243fe6630289 100644 --- a/packages/core/primitives/signals/src/signal.ts +++ b/packages/core/primitives/signals/src/signal.ts @@ -70,7 +70,7 @@ export function signalGetFn(this: SignalNode): T { export function signalSetFn(node: SignalNode, newValue: T) { if (!producerUpdatesAllowed()) { - throwInvalidWriteToSignalError(); + throwInvalidWriteToSignalError(node); } if (!node.equal(node.value, newValue)) { @@ -81,7 +81,7 @@ export function signalSetFn(node: SignalNode, newValue: T) { export function signalUpdateFn(node: SignalNode, updater: (value: T) => T): void { if (!producerUpdatesAllowed()) { - throwInvalidWriteToSignalError(); + throwInvalidWriteToSignalError(node); } signalSetFn(node, updater(node.value)); diff --git a/packages/core/rxjs-interop/src/pending_until_event.ts b/packages/core/rxjs-interop/src/pending_until_event.ts index 6b08625c0684..67c87ada41c6 100644 --- a/packages/core/rxjs-interop/src/pending_until_event.ts +++ b/packages/core/rxjs-interop/src/pending_until_event.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {assertInInjectionContext, PendingTasks, inject, Injector} from '@angular/core'; diff --git a/packages/core/rxjs-interop/src/rx_resource.ts b/packages/core/rxjs-interop/src/rx_resource.ts index da509c3accf3..92976f577369 100644 --- a/packages/core/rxjs-interop/src/rx_resource.ts +++ b/packages/core/rxjs-interop/src/rx_resource.ts @@ -8,49 +8,77 @@ import { assertInInjectionContext, - ResourceOptions, resource, ResourceLoaderParams, ResourceRef, + Signal, + signal, + BaseResourceOptions, } from '@angular/core'; -import {Observable, Subject} from 'rxjs'; -import {take, takeUntil} from 'rxjs/operators'; +import {Observable, Subscription} from 'rxjs'; /** * Like `ResourceOptions` but uses an RxJS-based `loader`. * * @experimental */ -export interface RxResourceOptions extends Omit, 'loader'> { +export interface RxResourceOptions extends BaseResourceOptions { loader: (params: ResourceLoaderParams) => Observable; } /** * Like `resource` but uses an RxJS based `loader` which maps the request to an `Observable` of the - * resource's value. Like `firstValueFrom`, only the first emission of the Observable is considered. + * resource's value. * * @experimental */ -export function rxResource(opts: RxResourceOptions): ResourceRef { +export function rxResource( + opts: RxResourceOptions & {defaultValue: NoInfer}, +): ResourceRef; + +/** + * Like `resource` but uses an RxJS based `loader` which maps the request to an `Observable` of the + * resource's value. + * + * @experimental + */ +export function rxResource(opts: RxResourceOptions): ResourceRef; +export function rxResource(opts: RxResourceOptions): ResourceRef { opts?.injector || assertInInjectionContext(rxResource); return resource({ ...opts, - loader: (params) => { - const cancelled = new Subject(); - params.abortSignal.addEventListener('abort', () => cancelled.next()); - - // Note: this is identical to `firstValueFrom` which we can't use, - // because at the time of writing, `core` still supports rxjs 6.x. - return new Promise((resolve, reject) => { - opts - .loader(params) - .pipe(take(1), takeUntil(cancelled)) - .subscribe({ - next: resolve, - error: reject, - complete: () => reject(new Error('Resource completed before producing a value')), - }); + loader: undefined, + stream: (params) => { + let sub: Subscription; + + // Track the abort listener so it can be removed if the Observable completes (as a memory + // optimization). + const onAbort = () => sub.unsubscribe(); + params.abortSignal.addEventListener('abort', onAbort); + + // Start off stream as undefined. + const stream = signal<{value: T} | {error: unknown}>({value: undefined as T}); + let resolve: ((value: Signal<{value: T} | {error: unknown}>) => void) | undefined; + const promise = new Promise>((r) => (resolve = r)); + + function send(value: {value: T} | {error: unknown}): void { + stream.set(value); + resolve?.(stream); + resolve = undefined; + } + + sub = opts.loader(params).subscribe({ + next: (value) => send({value}), + error: (error) => send({error}), + complete: () => { + if (resolve) { + send({error: new Error('Resource completed before producing a value')}); + } + params.abortSignal.removeEventListener('abort', onAbort); + }, }); + + return promise; }, }); } diff --git a/packages/core/rxjs-interop/test/pending_until_event_spec.ts b/packages/core/rxjs-interop/test/pending_until_event_spec.ts index 7fffbc306d64..23c3750ebdc8 100644 --- a/packages/core/rxjs-interop/test/pending_until_event_spec.ts +++ b/packages/core/rxjs-interop/test/pending_until_event_spec.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import { diff --git a/packages/core/rxjs-interop/test/rx_resource_spec.ts b/packages/core/rxjs-interop/test/rx_resource_spec.ts index 5673c67203b4..be4d3b797104 100644 --- a/packages/core/rxjs-interop/test/rx_resource_spec.ts +++ b/packages/core/rxjs-interop/test/rx_resource_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {of, Observable} from 'rxjs'; +import {of, Observable, BehaviorSubject} from 'rxjs'; import {TestBed} from '@angular/core/testing'; import {ApplicationRef, Injector, signal} from '@angular/core'; import {rxResource} from '@angular/core/rxjs-interop'; @@ -26,12 +26,14 @@ describe('rxResource()', () => { it('should cancel the fetch when a new request comes in', async () => { const injector = TestBed.inject(Injector); const appRef = TestBed.inject(ApplicationRef); - let unsub = false; const request = signal(1); - const res = rxResource({ + let unsub = false; + let lastSeenRequest: number = 0; + rxResource({ request, - loader: ({request}) => - new Observable((sub) => { + loader: ({request}) => { + lastSeenRequest = request; + return new Observable((sub) => { if (request === 2) { sub.next(true); } @@ -40,18 +42,40 @@ describe('rxResource()', () => { unsub = true; } }; - }), + }); + }, injector, }); // Wait for the resource to reach loading state. - await waitFor(() => res.isLoading()); + await waitFor(() => lastSeenRequest === 1); // Setting request = 2 should cancel request = 1 request.set(2); await appRef.whenStable(); expect(unsub).toBe(true); }); + + it('should stream when the loader returns multiple values', async () => { + const injector = TestBed.inject(Injector); + const appRef = TestBed.inject(ApplicationRef); + const response = new BehaviorSubject(1); + const res = rxResource({ + loader: () => response, + injector, + }); + await appRef.whenStable(); + expect(res.value()).toBe(1); + + response.next(2); + expect(res.value()).toBe(2); + + response.next(3); + expect(res.value()).toBe(3); + + response.error('fail'); + expect(res.error()).toBe('fail'); + }); }); async function waitFor(fn: () => boolean): Promise { diff --git a/packages/core/schematics/BUILD.bazel b/packages/core/schematics/BUILD.bazel index 7180546febbc..645f73f1e912 100644 --- a/packages/core/schematics/BUILD.bazel +++ b/packages/core/schematics/BUILD.bazel @@ -18,6 +18,7 @@ pkg_npm( "//packages/core/schematics/ng-generate/inject-migration:static_files", "//packages/core/schematics/ng-generate/output-migration:static_files", "//packages/core/schematics/ng-generate/route-lazy-loading:static_files", + "//packages/core/schematics/ng-generate/self-closing-tags-migration:static_files", "//packages/core/schematics/ng-generate/signal-input-migration:static_files", "//packages/core/schematics/ng-generate/signal-queries-migration:static_files", "//packages/core/schematics/ng-generate/signals:static_files", @@ -43,6 +44,7 @@ rollup_bundle( "//packages/core/schematics/ng-generate/signal-input-migration:index.ts": "signal-input-migration", "//packages/core/schematics/ng-generate/signal-queries-migration:index.ts": "signal-queries-migration", "//packages/core/schematics/ng-generate/output-migration:index.ts": "output-migration", + "//packages/core/schematics/ng-generate/self-closing-tags-migration:index.ts": "self-closing-tags-migration", "//packages/core/schematics/migrations/explicit-standalone-flag:index.ts": "explicit-standalone-flag", "//packages/core/schematics/migrations/pending-tasks:index.ts": "pending-tasks", "//packages/core/schematics/migrations/provide-initializer:index.ts": "provide-initializer", @@ -63,6 +65,7 @@ rollup_bundle( "//packages/core/schematics/ng-generate/inject-migration", "//packages/core/schematics/ng-generate/output-migration", "//packages/core/schematics/ng-generate/route-lazy-loading", + "//packages/core/schematics/ng-generate/self-closing-tags-migration", "//packages/core/schematics/ng-generate/signal-input-migration", "//packages/core/schematics/ng-generate/signal-queries-migration", "//packages/core/schematics/ng-generate/signals", diff --git a/packages/core/schematics/collection.json b/packages/core/schematics/collection.json index 1225726a17ff..0a42953afcc8 100644 --- a/packages/core/schematics/collection.json +++ b/packages/core/schematics/collection.json @@ -51,6 +51,12 @@ "description": "Removes unused imports from standalone components.", "factory": "./bundles/cleanup-unused-imports#migrate", "schema": "./ng-generate/cleanup-unused-imports/schema.json" + }, + "self-closing-tags-migration": { + "description": "Updates the components templates to use self-closing tags where possible", + "factory": "./bundles/self-closing-tags-migration#migrate", + "schema": "./ng-generate/self-closing-tags-migration/schema.json", + "aliases": ["self-closing-tag"] } } } diff --git a/packages/core/schematics/migrations/output-migration/output-migration.ts b/packages/core/schematics/migrations/output-migration/output-migration.ts index 6b8daca34462..04522b30271f 100644 --- a/packages/core/schematics/migrations/output-migration/output-migration.ts +++ b/packages/core/schematics/migrations/output-migration/output-migration.ts @@ -7,7 +7,6 @@ */ import ts from 'typescript'; -import assert from 'assert'; import { confirmAsSerializable, MigrationStats, diff --git a/packages/core/schematics/migrations/pending-tasks/index.ts b/packages/core/schematics/migrations/pending-tasks/index.ts index 30fc65950ccf..525622a6fe76 100644 --- a/packages/core/schematics/migrations/pending-tasks/index.ts +++ b/packages/core/schematics/migrations/pending-tasks/index.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {Rule, SchematicsException, Tree, UpdateRecorder} from '@angular-devkit/schematics'; diff --git a/packages/core/schematics/migrations/pending-tasks/migration.ts b/packages/core/schematics/migrations/pending-tasks/migration.ts index 6191f906e11a..0e7d7dbcf9de 100644 --- a/packages/core/schematics/migrations/pending-tasks/migration.ts +++ b/packages/core/schematics/migrations/pending-tasks/migration.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import ts from 'typescript'; diff --git a/packages/core/schematics/migrations/provide-initializer/utils.ts b/packages/core/schematics/migrations/provide-initializer/utils.ts index 9dff9d6573d3..0c4f42624894 100644 --- a/packages/core/schematics/migrations/provide-initializer/utils.ts +++ b/packages/core/schematics/migrations/provide-initializer/utils.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import ts from 'typescript'; diff --git a/packages/core/schematics/migrations/self-closing-tags-migration/BUILD.bazel b/packages/core/schematics/migrations/self-closing-tags-migration/BUILD.bazel new file mode 100644 index 000000000000..25e7b07ff687 --- /dev/null +++ b/packages/core/schematics/migrations/self-closing-tags-migration/BUILD.bazel @@ -0,0 +1,48 @@ +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") + +ts_library( + name = "migration", + srcs = glob( + ["**/*.ts"], + exclude = ["*.spec.ts"], + ), + visibility = [ + "//packages/core/schematics/ng-generate/self-closing-tags-migration:__pkg__", + "//packages/language-service/src/refactorings:__pkg__", + ], + deps = [ + "//packages/compiler", + "//packages/compiler-cli", + "//packages/compiler-cli/private", + "//packages/compiler-cli/src/ngtsc/annotations", + "//packages/compiler-cli/src/ngtsc/annotations/directive", + "//packages/compiler-cli/src/ngtsc/file_system", + "//packages/compiler-cli/src/ngtsc/imports", + "//packages/compiler-cli/src/ngtsc/metadata", + "//packages/compiler-cli/src/ngtsc/reflection", + "//packages/core/schematics/utils", + "//packages/core/schematics/utils/tsurge", + "@npm//@types/node", + "@npm//typescript", + ], +) + +ts_library( + name = "test_lib", + testonly = True, + srcs = glob( + ["**/*.spec.ts"], + ), + deps = [ + ":migration", + "//packages/compiler-cli", + "//packages/compiler-cli/src/ngtsc/file_system/testing", + "//packages/core/schematics/utils/tsurge", + ], +) + +jasmine_node_test( + name = "test", + srcs = [":test_lib"], + env = {"FORCE_COLOR": "3"}, +) diff --git a/packages/core/schematics/migrations/self-closing-tags-migration/self-closing-tags-migration.spec.ts b/packages/core/schematics/migrations/self-closing-tags-migration/self-closing-tags-migration.spec.ts new file mode 100644 index 000000000000..17e25e1b7fcb --- /dev/null +++ b/packages/core/schematics/migrations/self-closing-tags-migration/self-closing-tags-migration.spec.ts @@ -0,0 +1,285 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {initMockFileSystem} from '@angular/compiler-cli/src/ngtsc/file_system/testing'; +import {runTsurgeMigration, diffText} from '../../utils/tsurge/testing'; +import {absoluteFrom} from '@angular/compiler-cli'; +import {SelfClosingTagsMigration} from './self-closing-tags-migration'; + +describe('self-closing tags', () => { + beforeEach(() => { + initMockFileSystem('Native'); + }); + + describe('self-closing tags migration', () => { + it('should skip dom elements', async () => { + await verifyDeclarationNoChange(``); + }); + + it('should skip custom elements with content', async () => { + await verifyDeclarationNoChange(`1`); + }); + + it('should skip already self-closing custom elements', async () => { + await verifyDeclarationNoChange(` `); + }); + + it('should migrate custom elements', async () => { + await verifyDeclaration({ + before: ``, + after: ``, + }); + }); + + it('should migrate custom elements with attributes', async () => { + await verifyDeclaration({ + before: ``, + after: ``, + }); + }); + + it('should migrate multiple custom elements in the template', async () => { + await verifyDeclaration({ + before: ``, + after: ``, + }); + }); + + it('should migrate a template that contains directives, pipes, inputs, outputs, and events', async () => { + await verifyDeclaration({ + before: ` + + `, + after: ` + + `, + }); + }); + + it('should migrate multiple cases of spacing', async () => { + await verifyDeclaration({ + before: ` `, + after: ``, + }); + + await verifyDeclaration({ + before: ` + + + + `, + after: ``, + }); + + await verifyDeclarationNoChange(` + + 123 + + `); + + await verifyDeclaration({ + before: ` + + + + + `, + after: ` + + + + `, + }); + + await verifyDeclaration({ + before: ` + + + `, + after: ` + + `, + }); + }); + + it('should migrate the template with multiple nested elements', async () => { + await verifyDeclaration({ + before: ` + + + + + + + + + + + + + `, + after: ` + + + + + + + + + + + `, + }); + }); + + it('should migrate multiple components in a file', async () => { + await verify({ + before: ` + import {Component} from '@angular/core'; + @Component({ template: '' }) + export class Cmp1 {} + + @Component({ template: '' }) + export class Cmp2 {} + `, + after: ` + import {Component} from '@angular/core'; + @Component({ template: '' }) + export class Cmp1 {} + + @Component({ template: '' }) + export class Cmp2 {} + `, + }); + }); + + it('should migrate an external template file', async () => { + const templateFileContent = ` + + + + + + + + + + `; + + const templateFileExpected = ` + + + + + + + `; + + const tsFileContent = ` + import {Component} from '@angular/core'; + @Component({ templateUrl: 'app.component.html' }) + export class AppComponent {} + `; + + const {fs} = await runTsurgeMigration(new SelfClosingTagsMigration(), [ + { + name: absoluteFrom('/app.component.ts'), + isProgramRootFile: true, + contents: tsFileContent, + }, + { + name: absoluteFrom('/app.component.html'), + contents: templateFileContent, + }, + ]); + + const componentTsFile = fs.readFile(absoluteFrom('/app.component.ts')).trim(); + const actualComponentHtmlFile = fs.readFile(absoluteFrom('/app.component.html')).trim(); + const expectedTemplate = templateFileExpected.trim(); + + // no changes should be made to the component TS file + expect(componentTsFile).toEqual(tsFileContent.trim()); + + expect(actualComponentHtmlFile) + .withContext(diffText(expectedTemplate, actualComponentHtmlFile)) + .toEqual(expectedTemplate); + }); + }); +}); + +async function verifyDeclaration(testCase: {before: string; after: string}) { + await verify({ + before: populateDeclarationTestCase(testCase.before.trim()), + after: populateExpectedResult(testCase.after.trim()), + }); +} + +async function verifyDeclarationNoChange(beforeAndAfter: string) { + await verifyDeclaration({before: beforeAndAfter, after: beforeAndAfter}); +} + +async function verify(testCase: {before: string; after: string}) { + const {fs} = await runTsurgeMigration(new SelfClosingTagsMigration(), [ + { + name: absoluteFrom('/app.component.ts'), + isProgramRootFile: true, + contents: testCase.before, + }, + ]); + + const actual = fs.readFile(absoluteFrom('/app.component.ts')).trim(); + const expected = testCase.after.trim(); + + expect(actual).withContext(diffText(expected, actual)).toEqual(expected); +} + +function populateDeclarationTestCase(declaration: string): string { + return ` + import {Component} from '@angular/core'; + @Component({ template: \`${declaration}\` }) + export class AppComponent {} + `; +} + +function populateExpectedResult(declaration: string): string { + return ` + import {Component} from '@angular/core'; + @Component({ template: \`${declaration}\` }) + export class AppComponent {} + `; +} diff --git a/packages/core/schematics/migrations/self-closing-tags-migration/self-closing-tags-migration.ts b/packages/core/schematics/migrations/self-closing-tags-migration/self-closing-tags-migration.ts new file mode 100644 index 000000000000..cc36690f520b --- /dev/null +++ b/packages/core/schematics/migrations/self-closing-tags-migration/self-closing-tags-migration.ts @@ -0,0 +1,161 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import ts from 'typescript'; +import { + confirmAsSerializable, + MigrationStats, + ProgramInfo, + projectFile, + ProjectFile, + Replacement, + Serializable, + TextUpdate, + TsurgeFunnelMigration, +} from '../../utils/tsurge'; +import {NgComponentTemplateVisitor} from '../../utils/ng_component_template'; +import {migrateTemplateToSelfClosingTags} from './to-self-closing-tags'; +import {AbsoluteFsPath} from '../../../../compiler-cli'; + +export interface MigrationConfig { + /** + * Whether to migrate this component template to self-closing tags. + */ + shouldMigrate?: (containingFile: ProjectFile) => boolean; +} + +export interface SelfClosingTagsMigrationData { + file: ProjectFile; + replacementCount: number; + replacements: Replacement[]; +} + +export interface SelfClosingTagsCompilationUnitData { + tagReplacements: Array; +} + +export class SelfClosingTagsMigration extends TsurgeFunnelMigration< + SelfClosingTagsCompilationUnitData, + SelfClosingTagsCompilationUnitData +> { + constructor(private readonly config: MigrationConfig = {}) { + super(); + } + + override async analyze( + info: ProgramInfo, + ): Promise> { + const {sourceFiles, program} = info; + const typeChecker = program.getTypeChecker(); + const tagReplacements: Array = []; + + for (const sf of sourceFiles) { + ts.forEachChild(sf, (node: ts.Node) => { + if (!ts.isClassDeclaration(node)) { + return; + } + + const file = projectFile(node.getSourceFile(), info); + + if (this.config.shouldMigrate && this.config.shouldMigrate(file) === false) { + return; + } + + const templateVisitor = new NgComponentTemplateVisitor(typeChecker); + + templateVisitor.visitNode(node); + + templateVisitor.resolvedTemplates.forEach((template) => { + const {migrated, changed, replacementCount} = migrateTemplateToSelfClosingTags( + template.content, + ); + + if (changed) { + const fileToMigrate = template.inline + ? file + : projectFile(template.filePath as AbsoluteFsPath, info); + const end = template.start + template.content.length; + + const replacements = [ + prepareTextReplacement(fileToMigrate, migrated, template.start, end), + ]; + + const fileReplacements = tagReplacements.find( + (tagReplacement) => tagReplacement.file === file, + ); + + if (fileReplacements) { + fileReplacements.replacements.push(...replacements); + fileReplacements.replacementCount += replacementCount; + } else { + tagReplacements.push({file, replacements, replacementCount}); + } + } + }); + }); + } + + return confirmAsSerializable({tagReplacements}); + } + + override async combine( + unitA: SelfClosingTagsCompilationUnitData, + unitB: SelfClosingTagsCompilationUnitData, + ): Promise> { + return confirmAsSerializable({ + tagReplacements: unitA.tagReplacements.concat(unitB.tagReplacements), + }); + } + + override async globalMeta( + combinedData: SelfClosingTagsCompilationUnitData, + ): Promise> { + const globalMeta: SelfClosingTagsCompilationUnitData = { + tagReplacements: combinedData.tagReplacements, + }; + + return confirmAsSerializable(globalMeta); + } + + override async stats( + globalMetadata: SelfClosingTagsCompilationUnitData, + ): Promise { + const touchedFilesCount = globalMetadata.tagReplacements.length; + const replacementCount = globalMetadata.tagReplacements.reduce( + (acc, cur) => acc + cur.replacementCount, + 0, + ); + + return { + counters: { + touchedFilesCount, + replacementCount, + }, + }; + } + + override async migrate(globalData: SelfClosingTagsCompilationUnitData) { + return {replacements: globalData.tagReplacements.flatMap(({replacements}) => replacements)}; + } +} + +function prepareTextReplacement( + file: ProjectFile, + replacement: string, + start: number, + end: number, +): Replacement { + return new Replacement( + file, + new TextUpdate({ + position: start, + end: end, + toInsert: replacement, + }), + ); +} diff --git a/packages/core/schematics/migrations/self-closing-tags-migration/to-self-closing-tags.ts b/packages/core/schematics/migrations/self-closing-tags-migration/to-self-closing-tags.ts new file mode 100644 index 000000000000..868bb5af5601 --- /dev/null +++ b/packages/core/schematics/migrations/self-closing-tags-migration/to-self-closing-tags.ts @@ -0,0 +1,131 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { + DomElementSchemaRegistry, + Element, + RecursiveVisitor, + Text, + visitAll, +} from '@angular/compiler'; +import {parseTemplate} from './util'; + +export function migrateTemplateToSelfClosingTags(template: string): { + replacementCount: number; + migrated: string; + changed: boolean; +} { + let parsed = parseTemplate(template); + if (parsed.tree === undefined) { + return {migrated: template, changed: false, replacementCount: 0}; + } + + const visitor = new AngularElementCollector(); + visitAll(visitor, parsed.tree.rootNodes); + + let newTemplate = template; + let changedOffset = 0; + let replacementCount = 0; + + for (let element of visitor.elements) { + const {start, end, tagName} = element; + + const currentLength = newTemplate.length; + const templatePart = newTemplate.slice(start + changedOffset, end + changedOffset); + + const convertedTemplate = replaceWithSelfClosingTag(templatePart, tagName); + + // if the template has changed, replace the original template with the new one + if (convertedTemplate.length !== templatePart.length) { + newTemplate = replaceTemplate(newTemplate, convertedTemplate, start, end, changedOffset); + changedOffset += newTemplate.length - currentLength; + replacementCount++; + } + } + + return {migrated: newTemplate, changed: changedOffset !== 0, replacementCount}; +} + +function replaceWithSelfClosingTag(html: string, tagName: string) { + const pattern = new RegExp( + `<\\s*${tagName}\\s*([^>]*?(?:"[^"]*"|'[^']*'|[^'">])*)\\s*>([\\s\\S]*?)<\\s*/\\s*${tagName}\\s*>`, + 'gi', + ); + return html.replace(pattern, (_, content) => `<${tagName}${content ? ` ${content}` : ''} />`); +} + +/** + * Replace the value in the template with the new value based on the start and end position + offset + */ +function replaceTemplate( + template: string, + replaceValue: string, + start: number, + end: number, + offset: number, +) { + return template.slice(0, start + offset) + replaceValue + template.slice(end + offset); +} + +interface ElementToMigrate { + tagName: string; + start: number; + end: number; +} + +const ALL_HTML_TAGS = new DomElementSchemaRegistry().allKnownElementNames(); + +export class AngularElementCollector extends RecursiveVisitor { + readonly elements: ElementToMigrate[] = []; + + constructor() { + super(); + } + + override visitElement(element: Element) { + const isHtmlTag = ALL_HTML_TAGS.includes(element.name); + if (isHtmlTag) { + return; + } + + const hasNoContent = this.elementHasNoContent(element); + const hasNoClosingTag = this.elementHasNoClosingTag(element); + + if (hasNoContent && !hasNoClosingTag) { + this.elements.push({ + tagName: element.name, + start: element.sourceSpan.start.offset, + end: element.sourceSpan.end.offset, + }); + } + + return super.visitElement(element, null); + } + + private elementHasNoContent(element: Element) { + if (!element.children?.length) { + return true; + } + if (element.children.length === 1) { + const child = element.children[0]; + return child instanceof Text && /^\s*$/.test(child.value); + } + return false; + } + + private elementHasNoClosingTag(element: Element) { + const {startSourceSpan, endSourceSpan} = element; + if (!endSourceSpan) { + return true; + } + return ( + startSourceSpan.start.offset === endSourceSpan.start.offset && + startSourceSpan.end.offset === endSourceSpan.end.offset + ); + } +} diff --git a/packages/core/schematics/migrations/self-closing-tags-migration/util.ts b/packages/core/schematics/migrations/self-closing-tags-migration/util.ts new file mode 100644 index 000000000000..0bed1977e0c4 --- /dev/null +++ b/packages/core/schematics/migrations/self-closing-tags-migration/util.ts @@ -0,0 +1,46 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {HtmlParser, ParseTreeResult} from '@angular/compiler'; + +type MigrateError = { + type: string; + error: unknown; +}; + +interface ParseResult { + tree: ParseTreeResult | undefined; + errors: MigrateError[]; +} + +export function parseTemplate(template: string): ParseResult { + let parsed: ParseTreeResult; + try { + // Note: we use the HtmlParser here, instead of the `parseTemplate` function, because the + // latter returns an Ivy AST, not an HTML AST. The HTML AST has the advantage of preserving + // interpolated text as text nodes containing a mixture of interpolation tokens and text tokens, + // rather than turning them into `BoundText` nodes like the Ivy AST does. This allows us to + // easily get the text-only ranges without having to reconstruct the original text. + parsed = new HtmlParser().parse(template, '', { + // Allows for ICUs to be parsed. + tokenizeExpansionForms: true, + // Explicitly disable blocks so that their characters are treated as plain text. + tokenizeBlocks: true, + preserveLineEndings: true, + }); + + // Don't migrate invalid templates. + if (parsed.errors && parsed.errors.length > 0) { + const errors = parsed.errors.map((e) => ({type: 'parse', error: e})); + return {tree: undefined, errors}; + } + } catch (e: any) { + return {tree: undefined, errors: [{type: 'parse', error: e}]}; + } + return {tree: parsed, errors: []}; +} diff --git a/packages/core/schematics/migrations/signal-migration/src/passes/problematic_patterns/incompatibility_todos.ts b/packages/core/schematics/migrations/signal-migration/src/passes/problematic_patterns/incompatibility_todos.ts index db2796151db8..e42b4f638299 100644 --- a/packages/core/schematics/migrations/signal-migration/src/passes/problematic_patterns/incompatibility_todos.ts +++ b/packages/core/schematics/migrations/signal-migration/src/passes/problematic_patterns/incompatibility_todos.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ProgramInfo, Replacement} from '../../../../../utils/tsurge'; diff --git a/packages/core/schematics/migrations/signal-migration/test/ts-versions/index.bzl b/packages/core/schematics/migrations/signal-migration/test/ts-versions/index.bzl index 2608a9c0f7be..07a0439839ae 100644 --- a/packages/core/schematics/migrations/signal-migration/test/ts-versions/index.bzl +++ b/packages/core/schematics/migrations/signal-migration/test/ts-versions/index.bzl @@ -1,7 +1,11 @@ """Exposes information about the tested TS versions.""" TS_VERSIONS = [ - "typescript-5.5.4", - "typescript-5.5.3", "typescript-5.5.2", + "typescript-5.5.3", + "typescript-5.5.4", + "typescript-5.6.2", + "typescript-5.6.3", + "typescript-5.7.2", + "typescript-5.7.3", ] diff --git a/packages/core/schematics/migrations/signal-migration/test/ts-versions/package.json b/packages/core/schematics/migrations/signal-migration/test/ts-versions/package.json index 8688445c9668..dbe9b20b49ae 100644 --- a/packages/core/schematics/migrations/signal-migration/test/ts-versions/package.json +++ b/packages/core/schematics/migrations/signal-migration/test/ts-versions/package.json @@ -2,8 +2,12 @@ "name": "ts-versions", "license": "MIT", "dependencies": { - "typescript-5.5.4": "npm:typescript@5.5.4", + "typescript-5.5.2": "npm:typescript@5.5.2", "typescript-5.5.3": "npm:typescript@5.5.3", - "typescript-5.5.2": "npm:typescript@5.5.2" + "typescript-5.5.4": "npm:typescript@5.5.4", + "typescript-5.6.2": "npm:typescript@5.6.2", + "typescript-5.6.3": "npm:typescript@5.6.3", + "typescript-5.7.2": "npm:typescript@5.7.2", + "typescript-5.7.3": "npm:typescript@5.7.3" } } diff --git a/packages/core/schematics/migrations/signal-migration/test/ts-versions/yarn.lock b/packages/core/schematics/migrations/signal-migration/test/ts-versions/yarn.lock index b8df1705d318..8ad6ea1dfe9a 100644 --- a/packages/core/schematics/migrations/signal-migration/test/ts-versions/yarn.lock +++ b/packages/core/schematics/migrations/signal-migration/test/ts-versions/yarn.lock @@ -16,3 +16,23 @@ version "5.5.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + +"typescript-5.6.2@npm:typescript@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" + integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== + +"typescript-5.6.3@npm:typescript@5.6.3": + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + +"typescript-5.7.2@npm:typescript@5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== + +"typescript-5.7.3@npm:typescript@5.7.3": + version "5.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" + integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== diff --git a/packages/core/schematics/migrations/signal-queries-migration/fn_first_last_replacement.ts b/packages/core/schematics/migrations/signal-queries-migration/fn_first_last_replacement.ts index 720fc1b8ebd5..627717e6ebae 100644 --- a/packages/core/schematics/migrations/signal-queries-migration/fn_first_last_replacement.ts +++ b/packages/core/schematics/migrations/signal-queries-migration/fn_first_last_replacement.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ProgramInfo, projectFile, Replacement, TextUpdate} from '../../utils/tsurge'; diff --git a/packages/core/schematics/migrations/signal-queries-migration/fn_get_replacement.ts b/packages/core/schematics/migrations/signal-queries-migration/fn_get_replacement.ts index 7741984b378b..23f8653d35f1 100644 --- a/packages/core/schematics/migrations/signal-queries-migration/fn_get_replacement.ts +++ b/packages/core/schematics/migrations/signal-queries-migration/fn_get_replacement.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ProgramInfo, projectFile, Replacement, TextUpdate} from '../../utils/tsurge'; diff --git a/packages/core/schematics/migrations/signal-queries-migration/fn_to_array_removal.ts b/packages/core/schematics/migrations/signal-queries-migration/fn_to_array_removal.ts index 28aabb2b7468..d9d7de3457d4 100644 --- a/packages/core/schematics/migrations/signal-queries-migration/fn_to_array_removal.ts +++ b/packages/core/schematics/migrations/signal-queries-migration/fn_to_array_removal.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ProgramInfo, projectFile, Replacement, TextUpdate} from '../../utils/tsurge'; diff --git a/packages/core/schematics/migrations/signal-queries-migration/migration.ts b/packages/core/schematics/migrations/signal-queries-migration/migration.ts index 765b5dc916d8..94473c363605 100644 --- a/packages/core/schematics/migrations/signal-queries-migration/migration.ts +++ b/packages/core/schematics/migrations/signal-queries-migration/migration.ts @@ -25,6 +25,7 @@ import { ClassFieldDescriptor, ClassIncompatibilityReason, FieldIncompatibilityReason, + nonIgnorableFieldIncompatibilities, } from '../signal-migration/src'; import {checkIncompatiblePatterns} from '../signal-migration/src/passes/problematic_patterns/common_incompatible_patterns'; import {migrateHostBindings} from '../signal-migration/src/passes/reference_migration/migrate_host_bindings'; @@ -617,6 +618,15 @@ export class SignalQueriesMigration extends TsurgeComplexMigration< continue; } + // Do not count queries that were forcibly ignored via best effort mode. + if ( + this.config.bestEffortMode && + (info.fieldReason === null || + !nonIgnorableFieldIncompatibilities.includes(info.fieldReason)) + ) { + continue; + } + incompatibleQueries++; if (info.classReason !== null) { diff --git a/packages/core/schematics/migrations/signal-queries-migration/property_accesses.ts b/packages/core/schematics/migrations/signal-queries-migration/property_accesses.ts index 8a70322c3df9..ecd92a1ebea1 100644 --- a/packages/core/schematics/migrations/signal-queries-migration/property_accesses.ts +++ b/packages/core/schematics/migrations/signal-queries-migration/property_accesses.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import ts from 'typescript'; diff --git a/packages/core/schematics/ng-generate/cleanup-unused-imports/index.ts b/packages/core/schematics/ng-generate/cleanup-unused-imports/index.ts index cb84a4e14e38..70cd7898d68e 100644 --- a/packages/core/schematics/ng-generate/cleanup-unused-imports/index.ts +++ b/packages/core/schematics/ng-generate/cleanup-unused-imports/index.ts @@ -67,7 +67,7 @@ export function migrate(): Rule { for (const c of changes) { recorder .remove(c.data.position, c.data.end - c.data.position) - .insertLeft(c.data.position, c.data.toInsert); + .insertRight(c.data.position, c.data.toInsert); } tree.commitUpdate(recorder); } diff --git a/packages/core/schematics/ng-generate/cleanup-unused-imports/unused_imports_migration.ts b/packages/core/schematics/ng-generate/cleanup-unused-imports/unused_imports_migration.ts index 4933965f9525..924ed5380bec 100644 --- a/packages/core/schematics/ng-generate/cleanup-unused-imports/unused_imports_migration.ts +++ b/packages/core/schematics/ng-generate/cleanup-unused-imports/unused_imports_migration.ts @@ -13,6 +13,7 @@ import { MigrationStats, ProgramInfo, projectFile, + ProjectFileID, Replacement, Serializable, TextUpdate, @@ -28,8 +29,8 @@ export interface CompilationUnitData { /** Text changes that should be performed. */ replacements: Replacement[]; - /** Total number of imports that were removed. */ - removedImports: number; + /** Identifiers that have been removed from each file. */ + removedIdentifiers: NodeID[]; /** Total number of files that were changed. */ changedFiles: number; @@ -44,7 +45,7 @@ interface RemovalLocations { partialRemovals: Map>; /** Text of all identifiers that have been removed. */ - allRemovedIdentifiers: Set; + allRemovedIdentifiers: Set; } /** Tracks how identifiers are used across a single file. */ @@ -60,6 +61,9 @@ interface UsageAnalysis { identifierCounts: Map; } +/** ID of a node based on its location. */ +type NodeID = string & {__nodeID: true}; + /** Migration that cleans up unused imports from a project. */ export class UnusedImportsMigration extends TsurgeFunnelMigration< CompilationUnitData, @@ -81,7 +85,7 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< override async analyze(info: ProgramInfo): Promise> { const nodePositions = new Map>(); const replacements: Replacement[] = []; - let removedImports = 0; + const removedIdentifiers: NodeID[] = []; let changedFiles = 0; info.ngCompiler?.getDiagnostics().forEach((diag) => { @@ -94,7 +98,7 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< if (!nodePositions.has(diag.file)) { nodePositions.set(diag.file, new Set()); } - nodePositions.get(diag.file)!.add(this.getNodeKey(diag.start, diag.length)); + nodePositions.get(diag.file)!.add(this.getNodeID(diag.start, diag.length)); } }); @@ -103,14 +107,15 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< const usageAnalysis = this.analyzeUsages(sourceFile, resolvedLocations); if (resolvedLocations.allRemovedIdentifiers.size > 0) { - removedImports += resolvedLocations.allRemovedIdentifiers.size; changedFiles++; + resolvedLocations.allRemovedIdentifiers.forEach((identifier) => { + removedIdentifiers.push(this.getNodeID(identifier.getStart(), identifier.getWidth())); + }); } - this.generateReplacements(sourceFile, resolvedLocations, usageAnalysis, info, replacements); }); - return confirmAsSerializable({replacements, removedImports, changedFiles}); + return confirmAsSerializable({replacements, removedIdentifiers, changedFiles}); } override async migrate(globalData: CompilationUnitData) { @@ -121,10 +126,34 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< unitA: CompilationUnitData, unitB: CompilationUnitData, ): Promise> { + const combinedReplacements: Replacement[] = []; + const combinedRemovedIdentifiers: NodeID[] = []; + const seenReplacements = new Set(); + const seenIdentifiers = new Set(); + const changedFileIds = new Set(); + + [unitA, unitB].forEach((unit) => { + for (const replacement of unit.replacements) { + const key = this.getReplacementID(replacement); + changedFileIds.add(replacement.projectFile.id); + if (!seenReplacements.has(key)) { + seenReplacements.add(key); + combinedReplacements.push(replacement); + } + } + + for (const identifier of unit.removedIdentifiers) { + if (!seenIdentifiers.has(identifier)) { + seenIdentifiers.add(identifier); + combinedRemovedIdentifiers.push(identifier); + } + } + }); + return confirmAsSerializable({ - replacements: [...unitA.replacements, ...unitB.replacements], - removedImports: unitA.removedImports + unitB.removedImports, - changedFiles: unitA.changedFiles + unitB.changedFiles, + replacements: combinedReplacements, + removedIdentifiers: combinedRemovedIdentifiers, + changedFiles: changedFileIds.size, }); } @@ -137,15 +166,21 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< override async stats(globalMetadata: CompilationUnitData): Promise { return { counters: { - removedImports: globalMetadata.removedImports, + removedImports: globalMetadata.removedIdentifiers.length, changedFiles: globalMetadata.changedFiles, }, }; } - /** Gets a key that can be used to look up a node based on its location. */ - private getNodeKey(start: number, length: number): string { - return `${start}/${length}`; + /** Gets an ID that can be used to look up a node based on its location. */ + private getNodeID(start: number, length: number): NodeID { + return `${start}/${length}` as NodeID; + } + + /** Gets a unique ID for a replacement. */ + private getReplacementID(replacement: Replacement): string { + const {position, end, toInsert} = replacement.update.data; + return replacement.projectFile.id + '/' + position + '/' + end + '/' + toInsert; } /** @@ -176,7 +211,7 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< return; } - if (locations.has(this.getNodeKey(node.getStart(), node.getWidth()))) { + if (locations.has(this.getNodeID(node.getStart(), node.getWidth()))) { // When the entire array needs to be cleared, the diagnostic is // reported on the property assignment, rather than an array element. if ( @@ -187,7 +222,7 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< result.fullRemovals.add(parent.initializer); parent.initializer.elements.forEach((element) => { if (ts.isIdentifier(element)) { - result.allRemovedIdentifiers.add(element.text); + result.allRemovedIdentifiers.add(element); } }); } else if (ts.isArrayLiteralExpression(parent)) { @@ -195,7 +230,7 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< result.partialRemovals.set(parent, new Set()); } result.partialRemovals.get(parent)!.add(node); - result.allRemovedIdentifiers.add(node.text); + result.allRemovedIdentifiers.add(node); } } }; @@ -326,8 +361,13 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< names.forEach((symbolName, localName) => { // Note that in the `identifierCounts` lookup both zero and undefined // are valid and mean that the identifiers isn't being used anymore. - if (allRemovedIdentifiers.has(localName) && !identifierCounts.get(localName)) { - importManager.removeImport(sourceFile, symbolName, moduleName); + if (!identifierCounts.get(localName)) { + for (const identifier of allRemovedIdentifiers) { + if (identifier.text === localName) { + importManager.removeImport(sourceFile, symbolName, moduleName); + break; + } + } } }); }); diff --git a/packages/core/schematics/ng-generate/control-flow-migration/types.ts b/packages/core/schematics/ng-generate/control-flow-migration/types.ts index c3da13ed3208..bea65d7f3cfa 100644 --- a/packages/core/schematics/ng-generate/control-flow-migration/types.ts +++ b/packages/core/schematics/ng-generate/control-flow-migration/types.ts @@ -10,6 +10,7 @@ import { Attribute, Block, Element, + LetDeclaration, ParseTreeResult, RecursiveVisitor, Text, @@ -390,6 +391,7 @@ export class CommonCollector extends RecursiveVisitor { this.count++; } } + super.visitBlock(ast, null); } override visitText(ast: Text) { @@ -398,6 +400,13 @@ export class CommonCollector extends RecursiveVisitor { } } + override visitLetDeclaration(decl: LetDeclaration): void { + if (this.hasPipes(decl.value)) { + this.count++; + } + super.visitLetDeclaration(decl, null); + } + private hasDirectives(input: string): boolean { return commonModuleDirectives.has(input); } diff --git a/packages/core/schematics/ng-generate/self-closing-tags-migration/BUILD.bazel b/packages/core/schematics/ng-generate/self-closing-tags-migration/BUILD.bazel new file mode 100644 index 000000000000..88ed0defa647 --- /dev/null +++ b/packages/core/schematics/ng-generate/self-closing-tags-migration/BUILD.bazel @@ -0,0 +1,29 @@ +load("//tools:defaults.bzl", "ts_library") + +package( + default_visibility = [ + "//packages/core/schematics:__pkg__", + "//packages/core/schematics/migrations/google3:__pkg__", + "//packages/core/schematics/test:__pkg__", + ], +) + +filegroup( + name = "static_files", + srcs = ["schema.json"], +) + +ts_library( + name = "self-closing-tags-migration", + srcs = glob(["**/*.ts"]), + tsconfig = "//packages/core/schematics:tsconfig.json", + deps = [ + "//packages/compiler-cli/src/ngtsc/file_system", + "//packages/core/schematics/migrations/self-closing-tags-migration:migration", + "//packages/core/schematics/utils", + "//packages/core/schematics/utils/tsurge", + "//packages/core/schematics/utils/tsurge/helpers/angular_devkit", + "@npm//@angular-devkit/schematics", + "@npm//@types/node", + ], +) diff --git a/packages/core/schematics/ng-generate/self-closing-tags-migration/README.md b/packages/core/schematics/ng-generate/self-closing-tags-migration/README.md new file mode 100644 index 000000000000..c6b3669c3f02 --- /dev/null +++ b/packages/core/schematics/ng-generate/self-closing-tags-migration/README.md @@ -0,0 +1,30 @@ +# Self-closing tags migration +This schematic helps developers to convert component selectors in the templates to self-closing tags. +This is a purely aesthetic change and does not affect the behavior of the application. + +## How to run this migration? +The migration can be run using the following command: + +```bash +ng generate @angular/core:self-closing-tag +``` + +By default, the migration will go over the entire application. If you want to apply this migration to a subset of the files, you can pass the path argument as shown below: + +```bash +ng generate @angular/core:self-closing-tag --path src/app/sub-component +``` + +### How does it work? +The schematic will attempt to find all the places in the templates where the component selectors are used. And check if they can be converted to self-closing tags. + +Example: + +```html + + + + + +``` + diff --git a/packages/core/schematics/ng-generate/self-closing-tags-migration/index.ts b/packages/core/schematics/ng-generate/self-closing-tags-migration/index.ts new file mode 100644 index 000000000000..6b308e03a3c9 --- /dev/null +++ b/packages/core/schematics/ng-generate/self-closing-tags-migration/index.ts @@ -0,0 +1,113 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {Rule, SchematicsException} from '@angular-devkit/schematics'; + +import {getProjectTsConfigPaths} from '../../utils/project_tsconfig_paths'; +import {DevkitMigrationFilesystem} from '../../utils/tsurge/helpers/angular_devkit/devkit_filesystem'; +import {groupReplacementsByFile} from '../../utils/tsurge/helpers/group_replacements'; +import {setFileSystem} from '@angular/compiler-cli/src/ngtsc/file_system'; +import {ProjectRootRelativePath, TextUpdate} from '../../utils/tsurge'; +import {synchronouslyCombineUnitData} from '../../utils/tsurge/helpers/combine_units'; +import { + SelfClosingTagsCompilationUnitData, + SelfClosingTagsMigration, +} from '../../migrations/self-closing-tags-migration/self-closing-tags-migration'; + +interface Options { + path: string; + analysisDir: string; +} + +export function migrate(options: Options): Rule { + return async (tree, context) => { + const {buildPaths, testPaths} = await getProjectTsConfigPaths(tree); + + if (!buildPaths.length && !testPaths.length) { + throw new SchematicsException( + 'Could not find any tsconfig file. Cannot run self-closing tags migration.', + ); + } + + const fs = new DevkitMigrationFilesystem(tree); + setFileSystem(fs); + + const migration = new SelfClosingTagsMigration({ + shouldMigrate: (file) => { + return ( + file.rootRelativePath.startsWith(fs.normalize(options.path)) && + !/(^|\/)node_modules\//.test(file.rootRelativePath) + ); + }, + }); + + const unitResults: SelfClosingTagsCompilationUnitData[] = []; + const programInfos = [...buildPaths, ...testPaths].map((tsconfigPath) => { + context.logger.info(`Preparing analysis for: ${tsconfigPath}..`); + + const baseInfo = migration.createProgram(tsconfigPath, fs); + const info = migration.prepareProgram(baseInfo); + + return {info, tsconfigPath}; + }); + + // Analyze phase. Treat all projects as compilation units as + // this allows us to support references between those. + for (const {info, tsconfigPath} of programInfos) { + context.logger.info(`Scanning for component tags: ${tsconfigPath}..`); + unitResults.push(await migration.analyze(info)); + } + + context.logger.info(``); + context.logger.info(`Processing analysis data between targets..`); + context.logger.info(``); + + const combined = await synchronouslyCombineUnitData(migration, unitResults); + if (combined === null) { + context.logger.error('Migration failed unexpectedly with no analysis data'); + return; + } + + const globalMeta = await migration.globalMeta(combined); + const replacementsPerFile: Map = new Map(); + + for (const {tsconfigPath} of programInfos) { + context.logger.info(`Migrating: ${tsconfigPath}..`); + + const {replacements} = await migration.migrate(globalMeta); + const changesPerFile = groupReplacementsByFile(replacements); + + for (const [file, changes] of changesPerFile) { + if (!replacementsPerFile.has(file)) { + replacementsPerFile.set(file, changes); + } + } + } + + context.logger.info(`Applying changes..`); + for (const [file, changes] of replacementsPerFile) { + const recorder = tree.beginUpdate(file); + for (const c of changes) { + recorder + .remove(c.data.position, c.data.end - c.data.position) + .insertLeft(c.data.position, c.data.toInsert); + } + tree.commitUpdate(recorder); + } + + const { + counters: {touchedFilesCount, replacementCount}, + } = await migration.stats(globalMeta); + + context.logger.info(''); + context.logger.info(`Successfully migrated to self-closing tags 🎉`); + context.logger.info( + ` -> Migrated ${replacementCount} components to self-closing tags in ${touchedFilesCount} component files.`, + ); + }; +} diff --git a/packages/core/schematics/ng-generate/self-closing-tags-migration/schema.json b/packages/core/schematics/ng-generate/self-closing-tags-migration/schema.json new file mode 100644 index 000000000000..ac9107cf9070 --- /dev/null +++ b/packages/core/schematics/ng-generate/self-closing-tags-migration/schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "AngularSelfClosingTagMigration", + "title": "Angular Self Closing Tag Migration Schema", + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "Path to the directory where all templates should be migrated.", + "x-prompt": "Which directory do you want to migrate?", + "default": "./" + } + } +} diff --git a/packages/core/schematics/test/BUILD.bazel b/packages/core/schematics/test/BUILD.bazel index a4626cd36ea4..44f3df0a8be0 100644 --- a/packages/core/schematics/test/BUILD.bazel +++ b/packages/core/schematics/test/BUILD.bazel @@ -26,6 +26,8 @@ jasmine_node_test( "//packages/core/schematics/ng-generate/inject-migration:static_files", "//packages/core/schematics/ng-generate/output-migration:static_files", "//packages/core/schematics/ng-generate/route-lazy-loading:static_files", + "//packages/core/schematics/ng-generate/self-closing-tags-migration:static_files", + "//packages/core/schematics/ng-generate/signal-input-migration:static_files", "//packages/core/schematics/ng-generate/signal-queries-migration:static_files", "//packages/core/schematics/ng-generate/signals:static_files", "//packages/core/schematics/ng-generate/standalone-migration:static_files", diff --git a/packages/core/schematics/test/cleanup_unused_imports_migration_spec.ts b/packages/core/schematics/test/cleanup_unused_imports_migration_spec.ts index bdb9877dc765..f94c83120648 100644 --- a/packages/core/schematics/test/cleanup_unused_imports_migration_spec.ts +++ b/packages/core/schematics/test/cleanup_unused_imports_migration_spec.ts @@ -19,6 +19,7 @@ describe('cleanup unused imports schematic', () => { let tree: UnitTestTree; let tmpDirPath: string; let previousWorkingDir: string; + let logs: string[]; function writeFile(filePath: string, contents: string) { host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents)); @@ -36,17 +37,9 @@ describe('cleanup unused imports schematic', () => { runner = new SchematicTestRunner('test', runfiles.resolvePackageRelative('../collection.json')); host = new TempScopedNodeJsSyncHost(); tree = new UnitTestTree(new HostTree(host)); + logs = []; - writeFile( - '/tsconfig.json', - JSON.stringify({ - compilerOptions: { - lib: ['es2015'], - strictNullChecks: true, - }, - }), - ); - + writeFile('/tsconfig.json', '{}'); writeFile( '/angular.json', JSON.stringify({ @@ -57,6 +50,7 @@ describe('cleanup unused imports schematic', () => { previousWorkingDir = shx.pwd(); tmpDirPath = getSystemPath(host.root); + runner.logger.subscribe((log) => logs.push(log.message)); // Switch into the temporary directory path. This allows us to run // the schematic against our custom unit test tree. @@ -101,6 +95,7 @@ describe('cleanup unused imports schematic', () => { await runMigration(); + expect(logs.pop()).toBe('Removed 2 imports in 1 file'); expect(stripWhitespace(tree.readContent('comp.ts'))).toBe( stripWhitespace(` import {Component} from '@angular/core'; @@ -132,6 +127,7 @@ describe('cleanup unused imports schematic', () => { await runMigration(); + expect(logs.pop()).toBe('Removed 3 imports in 1 file'); expect(stripWhitespace(tree.readContent('comp.ts'))).toBe( stripWhitespace(` import {Component} from '@angular/core'; @@ -162,6 +158,7 @@ describe('cleanup unused imports schematic', () => { await runMigration(); + expect(logs.pop()).toBe('Removed 2 imports in 1 file'); expect(stripWhitespace(tree.readContent('comp.ts'))).toBe( stripWhitespace(` import {Component} from '@angular/core'; @@ -199,6 +196,7 @@ describe('cleanup unused imports schematic', () => { await runMigration(); + expect(logs.pop()).toBe('Removed 1 import in 1 file'); expect(stripWhitespace(tree.readContent('comp.ts'))).toBe( stripWhitespace(` import {Component} from '@angular/core'; @@ -235,6 +233,7 @@ describe('cleanup unused imports schematic', () => { await runMigration(); + expect(logs.pop()).toBe('Schematic could not find unused imports in the project'); expect(tree.readContent('comp.ts')).toBe(initialContent); }); @@ -251,6 +250,51 @@ describe('cleanup unused imports schematic', () => { await runMigration(); + expect(logs.pop()).toBe('Schematic could not find unused imports in the project'); expect(tree.readContent('comp.ts')).toBe(initialContent); }); + + it('should handle a file that is present in multiple projects', async () => { + writeFile('/tsconfig-2.json', '{}'); + writeFile( + '/angular.json', + JSON.stringify({ + version: 1, + projects: { + a: {root: '', architect: {build: {options: {tsConfig: './tsconfig.json'}}}}, + b: {root: '', architect: {build: {options: {tsConfig: './tsconfig-2.json'}}}}, + }, + }), + ); + + writeFile( + 'comp.ts', + ` + import {Component} from '@angular/core'; + import {One, Two, Three} from './directives'; + + @Component({ + imports: [Three, One, Two], + template: '
    ', + }) + export class Comp {} + `, + ); + + await runMigration(); + + expect(logs.pop()).toBe('Removed 2 imports in 1 file'); + expect(stripWhitespace(tree.readContent('comp.ts'))).toBe( + stripWhitespace(` + import {Component} from '@angular/core'; + import {One} from './directives'; + + @Component({ + imports: [One], + template: '
    ', + }) + export class Comp {} + `), + ); + }); }); diff --git a/packages/core/schematics/test/control_flow_migration_spec.ts b/packages/core/schematics/test/control_flow_migration_spec.ts index db7cd4273bb2..2bb5fcdf8ed0 100644 --- a/packages/core/schematics/test/control_flow_migration_spec.ts +++ b/packages/core/schematics/test/control_flow_migration_spec.ts @@ -6479,6 +6479,72 @@ describe('control flow migration', () => { expect(actual).toBe(expected); }); + + it('should not remove common module if symbols are used inside new control flow', async () => { + writeFile( + '/comp.ts', + [ + `import {CommonModule} from '@angular/common';`, + `import {Component} from '@angular/core';\n`, + `@Component({`, + ` imports: [CommonModule],`, + ` template: \`@if (toggle) {
    {{ d | date }}
    } hi\``, + `})`, + `class Comp {`, + ` toggle = false;`, + `}`, + ].join('\n'), + ); + + await runMigration(); + const actual = tree.readContent('/comp.ts'); + const expected = [ + `import {CommonModule} from '@angular/common';`, + `import {Component} from '@angular/core';\n`, + `@Component({`, + ` imports: [CommonModule],`, + ` template: \`@if (toggle) {
    {{ d | date }}
    } @if (toggle) {hi}\``, + `})`, + `class Comp {`, + ` toggle = false;`, + `}`, + ].join('\n'); + + expect(actual).toBe(expected); + }); + + it('should not remove common module if symbols are used inside @let', async () => { + writeFile( + '/comp.ts', + [ + `import {CommonModule} from '@angular/common';`, + `import {Component} from '@angular/core';\n`, + `@Component({`, + ` imports: [CommonModule],`, + ` template: \`@let foo = 123 | date; {{foo}}\``, + `})`, + `class Comp {`, + ` toggle = false;`, + `}`, + ].join('\n'), + ); + + await runMigration(); + const actual = tree.readContent('/comp.ts'); + const expected = [ + `import {CommonModule} from '@angular/common';`, + `import {Component} from '@angular/core';\n`, + `@Component({`, + ` imports: [CommonModule],`, + ` template: \`@let foo = 123 | date; @if (foo) {{{foo}}}\``, + `})`, + `class Comp {`, + ` toggle = false;`, + `}`, + ].join('\n'); + + expect(actual).toBe(expected); + }); }); describe('no migration needed', () => { diff --git a/packages/core/schematics/test/pending_tasks_spec.ts b/packages/core/schematics/test/pending_tasks_spec.ts index 981b4220818b..95a703d18c62 100644 --- a/packages/core/schematics/test/pending_tasks_spec.ts +++ b/packages/core/schematics/test/pending_tasks_spec.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {getSystemPath, normalize, virtualFs} from '@angular-devkit/core'; diff --git a/packages/core/schematics/test/provide_initializer_spec.ts b/packages/core/schematics/test/provide_initializer_spec.ts index 8598105a953f..f0481e09e360 100644 --- a/packages/core/schematics/test/provide_initializer_spec.ts +++ b/packages/core/schematics/test/provide_initializer_spec.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {getSystemPath, normalize, virtualFs} from '@angular-devkit/core'; diff --git a/packages/core/schematics/test/queries_migration_spec.ts b/packages/core/schematics/test/queries_migration_spec.ts index 2da2005f7be4..0dd7dea0706d 100644 --- a/packages/core/schematics/test/queries_migration_spec.ts +++ b/packages/core/schematics/test/queries_migration_spec.ts @@ -24,7 +24,7 @@ describe('signal queries migration', () => { host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents)); } - function runMigration(options?: {path?: string}) { + function runMigration(options?: {bestEffortMode?: boolean}) { return runner.runSchematic('signal-queries-migration', options, tree); } @@ -69,4 +69,68 @@ describe('signal queries migration', () => { const content = tree.readContent('/index.ts').replace(/\s+/g, ' '); expect(content).toContain("readonly ref = contentChild.required('ref');"); }); + + it('should report correct statistics', async () => { + writeFile(`node_modules/@tsconfig/strictest/tsconfig.json`, `{}`); + writeFile( + `tsconfig.json`, + JSON.stringify({ + extends: `@tsconfig/strictest/tsconfig.json`, + }), + ); + writeFile( + '/index.ts', + ` + import {ContentChild, ElementRef, Directive} from '@angular/core'; + + @Directive({}) + export class SomeDirective { + @ContentChild('ref') ref!: ElementRef; + @ContentChild('ref') ref2: ElementRef|null = null; + + someFn() { + this.ref2 = null; + } + }`, + ); + + const messages: string[] = []; + runner.logger.subscribe((m) => messages.push(m.message)); + + await runMigration(); + + expect(messages).toContain(` -> Migrated 1/2 queries.`); + }); + + it('should report correct statistics with best effort mode', async () => { + writeFile(`node_modules/@tsconfig/strictest/tsconfig.json`, `{}`); + writeFile( + `tsconfig.json`, + JSON.stringify({ + extends: `@tsconfig/strictest/tsconfig.json`, + }), + ); + writeFile( + '/index.ts', + ` + import {ContentChild, ElementRef, Directive} from '@angular/core'; + + @Directive({}) + export class SomeDirective { + @ContentChild('ref') ref!: ElementRef; + @ContentChild('ref') ref2: ElementRef|null = null; + + someFn() { + this.ref2 = null; + } + }`, + ); + + const messages: string[] = []; + runner.logger.subscribe((m) => messages.push(m.message)); + + await runMigration({bestEffortMode: true}); + + expect(messages).toContain(` -> Migrated 2/2 queries.`); + }); }); diff --git a/packages/core/schematics/test/self_closing_tags_migration_spec.ts b/packages/core/schematics/test/self_closing_tags_migration_spec.ts new file mode 100644 index 000000000000..931dc501387c --- /dev/null +++ b/packages/core/schematics/test/self_closing_tags_migration_spec.ts @@ -0,0 +1,70 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {getSystemPath, normalize, virtualFs} from '@angular-devkit/core'; +import {TempScopedNodeJsSyncHost} from '@angular-devkit/core/node/testing'; +import {HostTree} from '@angular-devkit/schematics'; +import {SchematicTestRunner, UnitTestTree} from '@angular-devkit/schematics/testing'; +import {runfiles} from '@bazel/runfiles'; +import shx from 'shelljs'; + +describe('self-closing-tags migration', () => { + let runner: SchematicTestRunner; + let host: TempScopedNodeJsSyncHost; + let tree: UnitTestTree; + let tmpDirPath: string; + let previousWorkingDir: string; + + function writeFile(filePath: string, contents: string) { + host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents)); + } + + function runMigration(options?: {path?: string}) { + return runner.runSchematic('self-closing-tag', options, tree); + } + + beforeEach(() => { + runner = new SchematicTestRunner('test', runfiles.resolvePackageRelative('../collection.json')); + host = new TempScopedNodeJsSyncHost(); + tree = new UnitTestTree(new HostTree(host)); + + writeFile('/tsconfig.json', '{}'); + writeFile( + '/angular.json', + JSON.stringify({ + version: 1, + projects: {t: {root: '', architect: {build: {options: {tsConfig: './tsconfig.json'}}}}}, + }), + ); + + previousWorkingDir = shx.pwd(); + tmpDirPath = getSystemPath(host.root); + shx.cd(tmpDirPath); + }); + + afterEach(() => { + shx.cd(previousWorkingDir); + shx.rm('-r', tmpDirPath); + }); + + it('should work', async () => { + writeFile( + '/app.component.ts', + ` + import {Component} from '@angular/core'; + @Component({ template: '' }) + export class Cmp {} + `, + ); + + await runMigration(); + + const content = tree.readContent('/app.component.ts').replace(/\s+/g, ' '); + expect(content).toContain(''); + }); +}); diff --git a/packages/core/schematics/test/signal_input_migration_spec.ts b/packages/core/schematics/test/signal_input_migration_spec.ts new file mode 100644 index 000000000000..91c2b4669438 --- /dev/null +++ b/packages/core/schematics/test/signal_input_migration_spec.ts @@ -0,0 +1,161 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {getSystemPath, normalize, virtualFs} from '@angular-devkit/core'; +import {TempScopedNodeJsSyncHost} from '@angular-devkit/core/node/testing'; +import {HostTree} from '@angular-devkit/schematics'; +import {SchematicTestRunner, UnitTestTree} from '@angular-devkit/schematics/testing'; +import {runfiles} from '@bazel/runfiles'; +import shx from 'shelljs'; + +describe('signal input migration', () => { + let runner: SchematicTestRunner; + let host: TempScopedNodeJsSyncHost; + let tree: UnitTestTree; + let tmpDirPath: string; + let previousWorkingDir: string; + + function writeFile(filePath: string, contents: string) { + host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents)); + } + + function runMigration(options?: {bestEffortMode?: boolean}) { + return runner.runSchematic('signal-input-migration', options, tree); + } + + beforeEach(() => { + runner = new SchematicTestRunner('test', runfiles.resolvePackageRelative('../collection.json')); + host = new TempScopedNodeJsSyncHost(); + tree = new UnitTestTree(new HostTree(host)); + + writeFile('/tsconfig.json', '{}'); + writeFile( + '/angular.json', + JSON.stringify({ + version: 1, + projects: {t: {root: '', architect: {build: {options: {tsConfig: './tsconfig.json'}}}}}, + }), + ); + + previousWorkingDir = shx.pwd(); + tmpDirPath = getSystemPath(host.root); + shx.cd(tmpDirPath); + }); + + afterEach(() => { + shx.cd(previousWorkingDir); + shx.rm('-r', tmpDirPath); + }); + + it('should work', async () => { + writeFile( + '/index.ts', + ` + import {Input, Directive} from '@angular/core'; + + @Directive({}) + export class SomeDirective { + @Input({required: true}) name = ''; + }`, + ); + + await runMigration(); + + const content = tree.readContent('/index.ts').replace(/\s+/g, ' '); + expect(content).toContain('readonly name = input.required()'); + }); + + it('should work when extending tsconfig from node_modules', async () => { + writeFile(`node_modules/@tsconfig/strictest/tsconfig.json`, `{}`); + writeFile( + `tsconfig.json`, + JSON.stringify({ + extends: `@tsconfig/strictest/tsconfig.json`, + }), + ); + writeFile( + '/index.ts', + ` + import {Input, Directive} from '@angular/core'; + + @Directive({}) + export class SomeDirective { + @Input({required: true}) name = ''; + }`, + ); + + await runMigration(); + + const content = tree.readContent('/index.ts').replace(/\s+/g, ' '); + expect(content).toContain('readonly name = input.required()'); + }); + + it('should report correct statistics', async () => { + writeFile(`node_modules/@tsconfig/strictest/tsconfig.json`, `{}`); + writeFile( + `tsconfig.json`, + JSON.stringify({ + extends: `@tsconfig/strictest/tsconfig.json`, + }), + ); + writeFile( + '/index.ts', + ` + import {Input, Directive} from '@angular/core'; + + @Directive({}) + export class SomeDirective { + @Input({required: true}) name = ''; + @Input({required: true}) lastName = ''; + + someFn() { + this.lastName = 'other name'; + } + }`, + ); + + const messages: string[] = []; + runner.logger.subscribe((m) => messages.push(m.message)); + + await runMigration(); + + expect(messages).toContain(` -> Migrated 1/2 inputs.`); + }); + + it('should report correct statistics with best effort mode', async () => { + writeFile(`node_modules/@tsconfig/strictest/tsconfig.json`, `{}`); + writeFile( + `tsconfig.json`, + JSON.stringify({ + extends: `@tsconfig/strictest/tsconfig.json`, + }), + ); + writeFile( + '/index.ts', + ` + import {Input, Directive} from '@angular/core'; + + @Directive({}) + export class SomeDirective { + @Input({required: true}) name = ''; + @Input({required: true}) lastName = ''; + + someFn() { + this.lastName = 'other name'; + } + }`, + ); + + const messages: string[] = []; + runner.logger.subscribe((m) => messages.push(m.message)); + + await runMigration({bestEffortMode: true}); + + expect(messages).toContain(` -> Migrated 2/2 inputs.`); + }); +}); diff --git a/packages/core/schematics/utils/BUILD.bazel b/packages/core/schematics/utils/BUILD.bazel index 00a86bc306e8..6df9eeb2f747 100644 --- a/packages/core/schematics/utils/BUILD.bazel +++ b/packages/core/schematics/utils/BUILD.bazel @@ -8,6 +8,7 @@ ts_library( deps = [ "//packages/compiler", "//packages/compiler-cli/private", + "//packages/compiler-cli/src/ngtsc/file_system", "@npm//@angular-devkit/core", "@npm//@angular-devkit/schematics", "@npm//@types/node", diff --git a/packages/core/schematics/utils/ng_component_template.ts b/packages/core/schematics/utils/ng_component_template.ts index 1322679091aa..c22847a8abb2 100644 --- a/packages/core/schematics/utils/ng_component_template.ts +++ b/packages/core/schematics/utils/ng_component_template.ts @@ -6,13 +6,12 @@ * found in the LICENSE file at https://angular.dev/license */ -import {Tree} from '@angular-devkit/schematics'; -import {dirname, relative, resolve} from 'path'; import ts from 'typescript'; import {extractAngularClassMetadata} from './extract_metadata'; import {computeLineStartsMap, getLineAndCharacterFromPosition} from './line_mappings'; import {getPropertyNameText} from './typescript/property_name'; +import {AbsoluteFsPath, getFileSystem} from '@angular/compiler-cli/src/ngtsc/file_system'; export interface ResolvedTemplate { /** Class declaration that contains this template. */ @@ -24,7 +23,7 @@ export interface ResolvedTemplate { /** Whether the given template is inline or not. */ inline: boolean; /** Path to the file that contains this template. */ - filePath: string; + filePath: string | AbsoluteFsPath; /** * Gets the character and line of a given position index in the template. * If the template is declared inline within a TypeScript source file, the line and @@ -43,11 +42,9 @@ export interface ResolvedTemplate { export class NgComponentTemplateVisitor { resolvedTemplates: ResolvedTemplate[] = []; - constructor( - public typeChecker: ts.TypeChecker, - private _basePath: string, - private _tree: Tree, - ) {} + private fs = getFileSystem(); + + constructor(public typeChecker: ts.TypeChecker) {} visitNode(node: ts.Node) { if (node.kind === ts.SyntaxKind.ClassDeclaration) { @@ -100,25 +97,19 @@ export class NgComponentTemplateVisitor { }); } if (propertyName === 'templateUrl' && ts.isStringLiteralLike(property.initializer)) { - const templateDiskPath = resolve(dirname(sourceFileName), property.initializer.text); - // TODO(devversion): Remove this when the TypeScript compiler host is fully virtual - // relying on the devkit virtual tree and not dealing with disk paths. This is blocked on - // providing common utilities for schematics/migrations, given this is done in the - // Angular CDK already: - // https://github.com/angular/components/blob/3704400ee67e0190c9783e16367587489c803ebc/src/cdk/schematics/update-tool/utils/virtual-host.ts. - const templateDevkitPath = relative(this._basePath, templateDiskPath); - - // In case the template does not exist in the file system, skip this - // external template. - if (!this._tree.exists(templateDevkitPath)) { + const absolutePath = this.fs.resolve( + this.fs.dirname(sourceFileName), + property.initializer.text, + ); + if (!this.fs.exists(absolutePath)) { return; } - const fileContent = this._tree.read(templateDevkitPath)!.toString(); + const fileContent = this.fs.readFile(absolutePath); const lineStartsMap = computeLineStartsMap(fileContent); this.resolvedTemplates.push({ - filePath: templateDiskPath, + filePath: absolutePath, container: node, content: fileContent, inline: false, diff --git a/packages/core/schematics/utils/tsurge/helpers/ast/insert_preceding_line.ts b/packages/core/schematics/utils/tsurge/helpers/ast/insert_preceding_line.ts index 2eb6f7ce5ec4..24b0a242c2b0 100644 --- a/packages/core/schematics/utils/tsurge/helpers/ast/insert_preceding_line.ts +++ b/packages/core/schematics/utils/tsurge/helpers/ast/insert_preceding_line.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import ts from 'typescript'; diff --git a/packages/core/schematics/utils/tsurge/helpers/ast/leading_space.ts b/packages/core/schematics/utils/tsurge/helpers/ast/leading_space.ts index 8230d7951ae8..e36dd194aac3 100644 --- a/packages/core/schematics/utils/tsurge/helpers/ast/leading_space.ts +++ b/packages/core/schematics/utils/tsurge/helpers/ast/leading_space.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import ts from 'typescript'; diff --git a/packages/core/schematics/utils/tsurge/helpers/string_manipulation/cut_string_line_length.ts b/packages/core/schematics/utils/tsurge/helpers/string_manipulation/cut_string_line_length.ts index f7bebdef2bf5..8251f1bf434b 100644 --- a/packages/core/schematics/utils/tsurge/helpers/string_manipulation/cut_string_line_length.ts +++ b/packages/core/schematics/utils/tsurge/helpers/string_manipulation/cut_string_line_length.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ /** diff --git a/packages/core/src/application/application_ref.ts b/packages/core/src/application/application_ref.ts index 41d91593550c..3fe4a7d3f4b9 100644 --- a/packages/core/src/application/application_ref.ts +++ b/packages/core/src/application/application_ref.ts @@ -41,9 +41,10 @@ import {publishDefaultGlobalUtils as _publishDefaultGlobalUtils} from '../render import {requiresRefreshOrTraversal} from '../render3/util/view_utils'; import {ViewRef as InternalViewRef} from '../render3/view_ref'; import {TESTABILITY} from '../testability/testability'; -import {isPromise} from '../util/lang'; import {NgZone} from '../zone/ng_zone'; +import {profiler} from '../render3/profiler'; +import {ProfilerEvent} from '../render3/profiler_types'; import {EffectScheduler} from '../render3/reactivity/root_effect_scheduler'; import {ApplicationInitStatus} from './application_init'; import {TracingAction, TracingService, TracingSnapshot} from './tracing'; @@ -114,7 +115,7 @@ export interface BootstrapOptions { * Optionally specify coalescing event change detections or not. * Consider the following case. * - * ``` + * ```html *
    * *
    @@ -138,7 +139,7 @@ export interface BootstrapOptions { * into a single change detection. * * Consider the following case. - * ``` + * ```ts * for (let i = 0; i < 10; i ++) { * ngZone.run(() => { * // do something @@ -176,29 +177,6 @@ export interface BootstrapOptions { /** Maximum number of times ApplicationRef will refresh all attached views in a single tick. */ const MAXIMUM_REFRESH_RERUNS = 10; -export function _callAndReportToErrorHandler( - errorHandler: ErrorHandler, - ngZone: NgZone, - callback: () => any, -): any { - try { - const result = callback(); - if (isPromise(result)) { - return result.catch((e: any) => { - ngZone.runOutsideAngular(() => errorHandler.handleError(e)); - // rethrow as the exception handler might not do it - throw e; - }); - } - - return result; - } catch (e) { - ngZone.runOutsideAngular(() => errorHandler.handleError(e)); - // rethrow as the exception handler might not do it - throw e; - } -} - export function optionsReducer(dst: T, objs: T | T[]): T { if (Array.isArray(objs)) { return objs.reduce(optionsReducer, dst); @@ -524,6 +502,8 @@ export class ApplicationRef { componentOrFactory: ComponentFactory | Type, rootSelectorOrNode?: string | any, ): ComponentRef { + profiler(ProfilerEvent.BootstrapComponentStart); + (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed); const isComponentFactory = componentOrFactory instanceof ComponentFactory; const initStatus = this._injector.get(ApplicationInitStatus); @@ -569,6 +549,9 @@ export class ApplicationRef { const _console = this._injector.get(Console); _console.log(`Angular is running in development mode.`); } + + profiler(ProfilerEvent.BootstrapComponentEnd, compRef); + return compRef; } @@ -590,19 +573,20 @@ export class ApplicationRef { } /** @internal */ - _tick = (): void => { - if (this.tracingSnapshot !== null) { - const snapshot = this.tracingSnapshot; - this.tracingSnapshot = null; + _tick(): void { + profiler(ProfilerEvent.ChangeDetectionStart); - // Ensure we always run `_tick()` in the context of the most recent snapshot, + if (this.tracingSnapshot !== null) { + // Ensure we always run `tickImpl()` in the context of the most recent snapshot, // if one exists. Snapshots may be reference counted by the implementation so // we want to ensure that if we request a snapshot that we use it. - snapshot.run(TracingAction.CHANGE_DETECTION, this._tick); - snapshot.dispose(); - return; + this.tracingSnapshot.run(TracingAction.CHANGE_DETECTION, this.tickImpl); + } else { + this.tickImpl(); } + } + private tickImpl = (): void => { (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed); if (this._runningTick) { throw new RuntimeError( @@ -615,7 +599,6 @@ export class ApplicationRef { try { this._runningTick = true; this.synchronize(); - if (typeof ngDevMode === 'undefined' || ngDevMode) { for (let view of this.allViews) { view.checkNoChanges(); @@ -626,8 +609,12 @@ export class ApplicationRef { this.internalErrorHandler(e); } finally { this._runningTick = false; + this.tracingSnapshot?.dispose(); + this.tracingSnapshot = null; setActiveConsumer(prevConsumer); this.afterTick.next(); + + profiler(ProfilerEvent.ChangeDetectionEnd); } }; @@ -642,7 +629,9 @@ export class ApplicationRef { let runs = 0; while (this.dirtyFlags !== ApplicationRefDirtyFlags.None && runs++ < MAXIMUM_REFRESH_RERUNS) { + profiler(ProfilerEvent.ChangeDetectionSyncStart); this.synchronizeOnce(); + profiler(ProfilerEvent.ChangeDetectionSyncEnd); } if ((typeof ngDevMode === 'undefined' || ngDevMode) && runs >= MAXIMUM_REFRESH_RERUNS) { diff --git a/packages/core/src/application/create_application.ts b/packages/core/src/application/create_application.ts index 83d276b11b16..1b06ea8c819d 100644 --- a/packages/core/src/application/create_application.ts +++ b/packages/core/src/application/create_application.ts @@ -13,12 +13,13 @@ import {Type} from '../interface/type'; import {createOrReusePlatformInjector} from '../platform/platform'; import {assertStandaloneComponentType} from '../render3/errors'; import {EnvironmentNgModuleRefAdapter} from '../render3/ng_module_ref'; -import {NgZone} from '../zone/ng_zone'; -import {_callAndReportToErrorHandler, ApplicationRef} from './application_ref'; +import {ApplicationRef} from './application_ref'; import {ChangeDetectionScheduler} from '../change_detection/scheduling/zoneless_scheduling'; import {ChangeDetectionSchedulerImpl} from '../change_detection/scheduling/zoneless_scheduling_impl'; import {bootstrap} from '../platform/bootstrap'; +import {profiler} from '../render3/profiler'; +import {ProfilerEvent} from '../render3/profiler_types'; /** * Internal create application API that implements the core application creation logic and optional @@ -37,6 +38,7 @@ export function internalCreateApplication(config: { appProviders?: Array; platformProviders?: Provider[]; }): Promise { + profiler(ProfilerEvent.BootstrapApplicationStart); try { const {rootComponent, appProviders, platformProviders} = config; @@ -69,5 +71,7 @@ export function internalCreateApplication(config: { }); } catch (e) { return Promise.reject(e); + } finally { + profiler(ProfilerEvent.BootstrapApplicationEnd); } } diff --git a/packages/core/src/application/platform_tokens.ts b/packages/core/src/application/platform_tokens.ts index 268cb162fc66..038ecca0f25c 100644 --- a/packages/core/src/application/platform_tokens.ts +++ b/packages/core/src/application/platform_tokens.ts @@ -26,10 +26,13 @@ import {InjectionToken} from '../di/injection_token'; * * @developerPreview */ -export const REQUEST = new InjectionToken('REQUEST', { - providedIn: 'platform', - factory: () => null, -}); +export const REQUEST = new InjectionToken( + typeof ngDevMode === 'undefined' || ngDevMode ? 'REQUEST' : '', + { + providedIn: 'platform', + factory: () => null, + }, +); /** * Injection token for response initialization options. @@ -49,10 +52,13 @@ export const REQUEST = new InjectionToken('REQUEST', { * * @developerPreview */ -export const RESPONSE_INIT = new InjectionToken('RESPONSE_INIT', { - providedIn: 'platform', - factory: () => null, -}); +export const RESPONSE_INIT = new InjectionToken( + typeof ngDevMode === 'undefined' || ngDevMode ? 'RESPONSE_INIT' : '', + { + providedIn: 'platform', + factory: () => null, + }, +); /** * Injection token for additional request context. @@ -64,7 +70,10 @@ export const RESPONSE_INIT = new InjectionToken('RESPONSE_I * * @developerPreview */ -export const REQUEST_CONTEXT = new InjectionToken('REQUEST_CONTEXT', { - providedIn: 'platform', - factory: () => null, -}); +export const REQUEST_CONTEXT = new InjectionToken( + typeof ngDevMode === 'undefined' || ngDevMode ? 'REQUEST_CONTEXT' : '', + { + providedIn: 'platform', + factory: () => null, + }, +); diff --git a/packages/core/src/authoring/queries.ts b/packages/core/src/authoring/queries.ts index 91dbcecdfad1..03244b3c2fdc 100644 --- a/packages/core/src/authoring/queries.ts +++ b/packages/core/src/authoring/queries.ts @@ -12,7 +12,7 @@ import { createMultiResultQuerySignalFn, createSingleResultOptionalQuerySignalFn, createSingleResultRequiredQuerySignalFn, -} from '../render3/query_reactive'; +} from '../render3/queries/query_reactive'; import {Signal} from '../render3/reactivity/api'; function viewChildFn( diff --git a/packages/core/src/change_detection/differs/iterable_differs.ts b/packages/core/src/change_detection/differs/iterable_differs.ts index 4e943c0f47c6..e212d4845ae8 100644 --- a/packages/core/src/change_detection/differs/iterable_differs.ts +++ b/packages/core/src/change_detection/differs/iterable_differs.ts @@ -222,7 +222,7 @@ export class IterableDiffers { * which will only be applied to the injector for this component and its children. * This step is all that's required to make a new {@link IterableDiffer} available. * - * ``` + * ```ts * @Component({ * viewProviders: [ * IterableDiffers.extend([new ImmutableListDiffer()]) diff --git a/packages/core/src/change_detection/differs/keyvalue_differs.ts b/packages/core/src/change_detection/differs/keyvalue_differs.ts index 11f74458148b..6656f4aad3af 100644 --- a/packages/core/src/change_detection/differs/keyvalue_differs.ts +++ b/packages/core/src/change_detection/differs/keyvalue_differs.ts @@ -155,7 +155,7 @@ export class KeyValueDiffers { * which will only be applied to the injector for this component and its children. * This step is all that's required to make a new {@link KeyValueDiffer} available. * - * ``` + * ```ts * @Component({ * viewProviders: [ * KeyValueDiffers.extend([new ImmutableMapDiffer()]) diff --git a/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts b/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts index 381d4b3191e3..add6171bab41 100644 --- a/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts +++ b/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts @@ -181,7 +181,7 @@ export interface NgZoneOptions { * Optionally specify coalescing event change detections or not. * Consider the following case. * - * ``` + * ```html *
    * *
    @@ -204,7 +204,7 @@ export interface NgZoneOptions { * into a single change detection. * * Consider the following case. - * ``` + * ```ts * for (let i = 0; i < 10; i ++) { * ngZone.run(() => { * // do something diff --git a/packages/core/src/core_private_export.ts b/packages/core/src/core_private_export.ts index ed2f1869c032..f4cd15a65112 100644 --- a/packages/core/src/core_private_export.ts +++ b/packages/core/src/core_private_export.ts @@ -6,6 +6,21 @@ * found in the LICENSE file at https://angular.dev/license */ +export { + type NavigateEvent as ɵNavigateEvent, + type Navigation as ɵNavigation, + type NavigationCurrentEntryChangeEvent as ɵNavigationCurrentEntryChangeEvent, + type NavigationHistoryEntry as ɵNavigationHistoryEntry, + type NavigationNavigateOptions as ɵNavigationNavigateOptions, + type NavigationOptions as ɵNavigationOptions, + type NavigationReloadOptions as ɵNavigationReloadOptions, + type NavigationResult as ɵNavigationResult, + type NavigationTransition as ɵNavigationTransition, + type NavigationUpdateCurrentEntryOptions as ɵNavigationUpdateCurrentEntryOptions, + type NavigationTypeString as ɵNavigationTypeString, + type NavigationInterceptOptions as ɵNavigationInterceptOptions, + type NavigationDestination as ɵNavigationDestination, +} from '../primitives/dom-navigation'; export {setAlternateWeakRefImpl as ɵsetAlternateWeakRefImpl} from '../primitives/signals'; export {detectChangesInViewIfRequired as ɵdetectChangesInViewIfRequired} from './application/application_ref'; export {INTERNAL_APPLICATION_ERROR_HANDLER as ɵINTERNAL_APPLICATION_ERROR_HANDLER} from './error_handler'; @@ -148,4 +163,6 @@ export { disableProfiling as ɵdisableProfiling, } from './profiler'; +export {ResourceImpl as ɵResourceImpl} from './resource/resource'; + export {getClosestComponentName as ɵgetClosestComponentName} from './internal/get_closest_component_name'; diff --git a/packages/core/src/core_render3_private_export.ts b/packages/core/src/core_render3_private_export.ts index 86ac11072011..13931f653329 100644 --- a/packages/core/src/core_render3_private_export.ts +++ b/packages/core/src/core_render3_private_export.ts @@ -48,7 +48,6 @@ export { DirectiveType as ɵDirectiveType, getDirectives as ɵgetDirectives, getHostElement as ɵgetHostElement, - LifecycleHooksFeature as ɵLifecycleHooksFeature, NgModuleFactory as ɵNgModuleFactory, NgModuleRef as ɵRender3NgModuleRef, NgModuleType as ɵNgModuleType, @@ -117,7 +116,6 @@ export { ɵɵi18nPostprocess, ɵɵi18nStart, ɵɵInheritDefinitionFeature, - ɵɵInputTransformsFeature, ɵɵinjectAttribute, ɵɵInjectorDeclaration, ɵɵinvalidFactory, diff --git a/packages/core/src/defer/registry.ts b/packages/core/src/defer/registry.ts index 7dca251dac35..122eb434ab5f 100644 --- a/packages/core/src/defer/registry.ts +++ b/packages/core/src/defer/registry.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {inject} from '../di'; import {InjectionToken} from '../di/injection_token'; diff --git a/packages/core/src/defer/rendering.ts b/packages/core/src/defer/rendering.ts index 4a3e6cc0a60a..37b751055775 100644 --- a/packages/core/src/defer/rendering.ts +++ b/packages/core/src/defer/rendering.ts @@ -22,12 +22,7 @@ import {TContainerNode, TNode} from '../render3/interfaces/node'; import {isDestroyed} from '../render3/interfaces/type_checks'; import {HEADER_OFFSET, INJECTOR, LView, PARENT, TVIEW, TView} from '../render3/interfaces/view'; import {getConstant, getTNode} from '../render3/util/view_utils'; -import { - addLViewToLContainer, - createAndRenderEmbeddedLView, - removeLViewFromLContainer, - shouldAddViewToDom, -} from '../render3/view_manipulation'; +import {createAndRenderEmbeddedLView, shouldAddViewToDom} from '../render3/view_manipulation'; import {assertDefined} from '../util/assert'; import { @@ -56,6 +51,9 @@ import { getTDeferBlockDetails, getTemplateIndexForState, } from './utils'; +import {profiler} from '../render3/profiler'; +import {ProfilerEvent} from '../render3/profiler_types'; +import {addLViewToLContainer, removeLViewFromLContainer} from '../render3/view/container'; /** * **INTERNAL**, avoid referencing it in application code. @@ -224,13 +222,14 @@ export function renderDeferBlockState( function findMatchingDehydratedViewForDeferBlock( lContainer: LContainer, lDetails: LDeferBlockDetails, -): DehydratedContainerView | null { - // Find matching view based on serialized defer block state. - return ( - lContainer[DEHYDRATED_VIEWS]?.find( +): {dehydratedView: DehydratedContainerView | null; dehydratedViewIx: number} { + const dehydratedViewIx = + lContainer[DEHYDRATED_VIEWS]?.findIndex( (view: any) => view.data[SERIALIZED_DEFER_BLOCK_STATE] === lDetails[DEFER_BLOCK_STATE], - ) ?? null - ); + ) ?? -1; + const dehydratedView = + dehydratedViewIx > -1 ? lContainer[DEHYDRATED_VIEWS]![dehydratedViewIx] : null; + return {dehydratedView, dehydratedViewIx}; } /** @@ -243,6 +242,8 @@ function applyDeferBlockState( tNode: TNode, hostLView: LView, ) { + profiler(ProfilerEvent.DeferBlockStateStart); + const stateTmplIndex = getTemplateIndexForState(newState, hostLView, tNode); if (stateTmplIndex !== null) { @@ -273,10 +274,10 @@ function applyDeferBlockState( injector = createDeferBlockInjector(hostLView[INJECTOR], tDetails, providers); } } - const dehydratedView = findMatchingDehydratedViewForDeferBlock(lContainer, lDetails); - // Erase dehydrated view info, so that it's not removed later - // by post-hydration cleanup process. - lContainer[DEHYDRATED_VIEWS] = null; + const {dehydratedView, dehydratedViewIx} = findMatchingDehydratedViewForDeferBlock( + lContainer, + lDetails, + ); const embeddedLView = createAndRenderEmbeddedLView(hostLView, activeBlockTNode, null, { injector, @@ -290,11 +291,16 @@ function applyDeferBlockState( ); markViewDirty(embeddedLView, NotificationSource.DeferBlockStateUpdate); - // TODO(incremental-hydration): - // - what if we had some views in `lContainer[DEHYDRATED_VIEWS]`, but - // we didn't find a view that matches the expected state? - // - for example, handle a situation when a block was in the "completed" state - // on the server, but the loading failing on the client. How do we reconcile and cleanup? + if (dehydratedViewIx > -1) { + // Erase dehydrated view info in a given LContainer, so that the view is not + // removed later by post-hydration cleanup process (which iterates over all + // dehydrated views in component tree). This clears only the dehydrated view + // that was found for this render, which in most cases will be the only view. + // In the case that there was control flow that changed, there may be either + // more than one or the views would not match up due to the server rendered + // content being a different branch of the control flow. + lContainer[DEHYDRATED_VIEWS]?.splice(dehydratedViewIx, 1); + } if ( (newState === DeferBlockState.Complete || newState === DeferBlockState.Error) && @@ -306,6 +312,8 @@ function applyDeferBlockState( lDetails[ON_COMPLETE_FNS] = null; } } + + profiler(ProfilerEvent.DeferBlockStateEnd); } /** diff --git a/packages/core/src/defer/triggering.ts b/packages/core/src/defer/triggering.ts index 636250f78c90..677ec1aada2c 100644 --- a/packages/core/src/defer/triggering.ts +++ b/packages/core/src/defer/triggering.ts @@ -10,7 +10,11 @@ import {afterNextRender} from '../render3/after_render/hooks'; import {Injector} from '../di'; import {internalImportProvidersFrom} from '../di/provider_collection'; import {RuntimeError, RuntimeErrorCode} from '../errors'; -import {cleanupHydratedDeferBlocks} from '../hydration/cleanup'; +import { + cleanupHydratedDeferBlocks, + cleanupLContainer, + removeDehydratedViewList, +} from '../hydration/cleanup'; import {BlockSummary, ElementTrigger, NUM_ROOT_NODES} from '../hydration/interfaces'; import { assertSsrIdDefined, @@ -35,10 +39,12 @@ import { import {onViewport} from './dom_triggers'; import {onIdle} from './idle_scheduler'; import { + DEFER_BLOCK_STATE, DeferBlockBehavior, DeferBlockState, DeferBlockTrigger, DeferDependenciesLoadingState, + DehydratedDeferBlock, HydrateTriggerDetails, LDeferBlockDetails, ON_COMPLETE_FNS, @@ -64,6 +70,7 @@ import { getTDeferBlockDetails, } from './utils'; import {ApplicationRef} from '../application/application_ref'; +import {DEHYDRATED_VIEWS} from '../render3/interfaces/container'; /** * Schedules triggering of a defer block for `on idle` and `on timer` conditions. @@ -400,17 +407,40 @@ export async function triggerHydrationFromBlockName( } // Actually do the triggering and hydration of the queue of blocks - for (const dehydratedBlockId of hydrationQueue) { - await triggerResourceLoadingForHydration(dehydratedBlockId, dehydratedBlockRegistry); - await nextRender(injector); - // TODO(incremental-hydration): assert (in dev mode) that a defer block is present in the dehydrated registry - // at this point. If not - it means that the block has not been hydrated, for example due to different - // `@if` conditions on the client and the server. If we detect this case, we should also do the cleanup - // of all child block (promises, registry state, etc). - // TODO(incremental-hydration): call `rejectFn` when lDetails[DEFER_BLOCK_STATE] is `DeferBlockState.Error`. - blocksBeingHydrated.get(dehydratedBlockId)!.resolve(); - - // TODO(incremental-hydration): consider adding a wait for stability here + for (let blockQueueIdx = 0; blockQueueIdx < hydrationQueue.length; blockQueueIdx++) { + const dehydratedBlockId = hydrationQueue[blockQueueIdx]; + const dehydratedDeferBlock = dehydratedBlockRegistry.get(dehydratedBlockId); + + if (dehydratedDeferBlock != null) { + // trigger the block resources and await next render for hydration. This should result + // in the next block ɵɵdefer instruction being called and that block being added to the dehydrated registry. + await triggerResourceLoadingForHydration(dehydratedDeferBlock); + await nextRender(injector); + + // if the content has changed since server rendering, we need to check for the expected block + // being in the registry or if errors occurred. In that case, we need to clean up the remaining expected + // content that won't be rendered or fetched. + if (deferBlockHasErrored(dehydratedDeferBlock)) { + // Either the expected block has not yet had its ɵɵdefer instruction called or the block errored out when fetching + // resources. In the former case, either we're hydrating too soon or the client and server differ. In both cases, + // we need to clean up child content and promises. + removeDehydratedViewList(dehydratedDeferBlock); + cleanupRemainingHydrationQueue( + hydrationQueue.slice(blockQueueIdx), + dehydratedBlockRegistry, + ); + break; + } + // The defer block has not errored and we've finished fetching resources and rendering. + // At this point it is safe to resolve the hydration promise. + blocksBeingHydrated.get(dehydratedBlockId)!.resolve(); + } else { + // The expected block has not yet had its ɵɵdefer instruction called. This is likely due to content changing between + // client and server. We need to clean up the dehydrated DOM in the container since it no longer is valid. + cleanupParentContainer(blockQueueIdx, hydrationQueue, dehydratedBlockRegistry); + cleanupRemainingHydrationQueue(hydrationQueue.slice(blockQueueIdx), dehydratedBlockRegistry); + break; + } } // Await hydration completion for the requested block. @@ -433,6 +463,46 @@ export async function triggerHydrationFromBlockName( ); } +export function deferBlockHasErrored(deferBlock: DehydratedDeferBlock): boolean { + return ( + getLDeferBlockDetails(deferBlock.lView, deferBlock.tNode)[DEFER_BLOCK_STATE] === + DeferBlockState.Error + ); +} + +/** + * Clean up the parent container of a block where content changed between server and client. + * The parent of a block going through `triggerHydrationFromBlockName` will contain the + * dehydrated content that needs to be cleaned up. So we have to do the clean up from that location + * in the tree. + */ +function cleanupParentContainer( + currentBlockIdx: number, + hydrationQueue: string[], + dehydratedBlockRegistry: DehydratedBlockRegistry, +) { + // If a parent block exists, it's in the hydration queue in front of the current block. + const parentDeferBlockIdx = currentBlockIdx - 1; + const parentDeferBlock = + parentDeferBlockIdx > -1 + ? dehydratedBlockRegistry.get(hydrationQueue[parentDeferBlockIdx]) + : null; + if (parentDeferBlock) { + cleanupLContainer(parentDeferBlock.lContainer); + } +} + +function cleanupRemainingHydrationQueue( + hydrationQueue: string[], + dehydratedBlockRegistry: DehydratedBlockRegistry, +) { + const blocksBeingHydrated = dehydratedBlockRegistry.hydrating; + for (const dehydratedBlockId in hydrationQueue) { + blocksBeingHydrated.get(dehydratedBlockId)?.reject(); + } + dehydratedBlockRegistry.cleanup(hydrationQueue); +} + /** * Generates a new promise for every defer block in the hydrating queue */ @@ -448,22 +518,9 @@ function nextRender(injector: Injector): Promise { } async function triggerResourceLoadingForHydration( - dehydratedBlockId: string, - dehydratedBlockRegistry: DehydratedBlockRegistry, + dehydratedBlock: DehydratedDeferBlock, ): Promise { - const deferBlock = dehydratedBlockRegistry.get(dehydratedBlockId); - // Since we trigger hydration for nested defer blocks in a sequence (parent -> child), - // there is a chance that a defer block may not be present at hydration time. For example, - // when a nested block was in an `@if` condition, which has changed. - if (deferBlock === null) { - // TODO(incremental-hydration): handle the cleanup for cases when - // defer block is no longer present during hydration (e.g. `@if` condition - // has changed during hydration/rendering). - - return; - } - - const {tNode, lView} = deferBlock; + const {tNode, lView} = dehydratedBlock; const lDetails = getLDeferBlockDetails(lView, tNode); return new Promise((resolve) => { diff --git a/packages/core/src/hydration/annotate.ts b/packages/core/src/hydration/annotate.ts index bcb042d1ad74..a55f15c9eadc 100644 --- a/packages/core/src/hydration/annotate.ts +++ b/packages/core/src/hydration/annotate.ts @@ -405,7 +405,6 @@ function serializeLContainer( // Add defer block into info context.deferBlocks const deferBlockInfo: SerializedDeferBlock = { - [DEFER_PARENT_BLOCK_ID]: parentDeferBlockId, [NUM_ROOT_NODES]: rootNodes.length, [DEFER_BLOCK_STATE]: lDetails[CURRENT_DEFER_BLOCK_STATE], }; @@ -415,6 +414,11 @@ function serializeLContainer( deferBlockInfo[DEFER_HYDRATE_TRIGGERS] = serializedTriggers; } + if (parentDeferBlockId !== null) { + // Serialize parent id only when it's present. + deferBlockInfo[DEFER_PARENT_BLOCK_ID] = parentDeferBlockId; + } + context.deferBlocks.set(deferBlockId, deferBlockInfo); const node = unwrapRNode(lContainer); diff --git a/packages/core/src/hydration/api.ts b/packages/core/src/hydration/api.ts index afd7531c08c6..e40d715aa0f5 100644 --- a/packages/core/src/hydration/api.ts +++ b/packages/core/src/hydration/api.ts @@ -156,12 +156,12 @@ function printHydrationStats(injector: Injector) { /** * Returns a Promise that is resolved when an application becomes stable. */ -function whenStableWithTimeout(appRef: ApplicationRef, injector: Injector): Promise { +function whenStableWithTimeout(appRef: ApplicationRef): Promise { const whenStablePromise = appRef.whenStable(); if (typeof ngDevMode !== 'undefined' && ngDevMode) { const timeoutTime = APPLICATION_IS_STABLE_TIMEOUT; - const console = injector.get(Console); - const ngZone = injector.get(NgZone); + const console = appRef.injector.get(Console); + const ngZone = appRef.injector.get(NgZone); // The following call should not and does not prevent the app to become stable // We cannot use RxJS timer here because the app would remain unstable. @@ -274,7 +274,7 @@ export function withDomHydration(): EnvironmentProviders { useFactory: () => { if (inject(IS_HYDRATION_DOM_REUSE_ENABLED)) { const appRef = inject(ApplicationRef); - const injector = inject(Injector); + return () => { // Wait until an app becomes stable and cleanup all views that // were not claimed during the application bootstrap process. @@ -283,11 +283,21 @@ export function withDomHydration(): EnvironmentProviders { // // Note: the cleanup task *MUST* be scheduled within the Angular zone in Zone apps // to ensure that change detection is properly run afterward. - whenStableWithTimeout(appRef, injector).then(() => { + whenStableWithTimeout(appRef).then(() => { + // Note: we have to check whether the application is destroyed before + // performing other operations with the `injector`. + // The application may be destroyed **before** it becomes stable, so when + // the `whenStableWithTimeout` resolves, the injector might already be in + // a destroyed state. Thus, calling `injector.get` would throw an error + // indicating that the injector has already been destroyed. + if (appRef.destroyed) { + return; + } + cleanupDehydratedViews(appRef); if (typeof ngDevMode !== 'undefined' && ngDevMode) { - countBlocksSkippedByHydration(injector); - printHydrationStats(injector); + countBlocksSkippedByHydration(appRef.injector); + printHydrationStats(appRef.injector); } }); }; diff --git a/packages/core/src/hydration/cleanup.ts b/packages/core/src/hydration/cleanup.ts index f55911b831a2..861c58791ef8 100644 --- a/packages/core/src/hydration/cleanup.ts +++ b/packages/core/src/hydration/cleanup.ts @@ -18,7 +18,7 @@ import {Renderer} from '../render3/interfaces/renderer'; import {RNode} from '../render3/interfaces/renderer_dom'; import {isLContainer, isLView} from '../render3/interfaces/type_checks'; import {HEADER_OFFSET, HOST, LView, PARENT, RENDERER, TVIEW} from '../render3/interfaces/view'; -import {nativeRemoveNode} from '../render3/node_manipulation'; +import {nativeRemoveNode} from '../render3/dom_node_manipulation'; import {validateSiblingNodeExists} from './error_handling'; import {cleanupI18nHydrationData} from './i18n'; @@ -53,6 +53,18 @@ export function removeDehydratedViews(lContainer: LContainer) { lContainer[DEHYDRATED_VIEWS] = retainedViews; } +export function removeDehydratedViewList(deferBlock: DehydratedDeferBlock) { + const {lContainer} = deferBlock; + const dehydratedViews = lContainer[DEHYDRATED_VIEWS]; + if (dehydratedViews === null) return; + const parentLView = lContainer[PARENT]; + const renderer = parentLView[RENDERER]; + for (const view of dehydratedViews) { + removeDehydratedView(view, renderer); + ngDevMode && ngDevMode.dehydratedViewsRemoved++; + } +} + /** * Helper function to remove all nodes from a dehydrated view. */ diff --git a/packages/core/src/hydration/compression.ts b/packages/core/src/hydration/compression.ts index ab0738788892..247231d0ea73 100644 --- a/packages/core/src/hydration/compression.ts +++ b/packages/core/src/hydration/compression.ts @@ -15,7 +15,7 @@ import {NodeNavigationStep, REFERENCE_NODE_BODY, REFERENCE_NODE_HOST} from './in * - the `b` char which indicates that the lookup should start from the `document.body` * - the `h` char to start lookup from the component host node (`lView[HOST]`) */ -const REF_EXTRACTOR_REGEXP = new RegExp( +const REF_EXTRACTOR_REGEXP = /* @__PURE__ */ new RegExp( `^(\\d+)*(${REFERENCE_NODE_BODY}|${REFERENCE_NODE_HOST})*(.*)`, ); diff --git a/packages/core/src/hydration/event_replay.ts b/packages/core/src/hydration/event_replay.ts index ce26374f0787..93dca86a3cfe 100644 --- a/packages/core/src/hydration/event_replay.ts +++ b/packages/core/src/hydration/event_replay.ts @@ -118,8 +118,10 @@ export function withEventReplay(): Provider[] { { provide: APP_BOOTSTRAP_LISTENER, useFactory: () => { + const appId = inject(APP_ID); const injector = inject(Injector); const appRef = inject(ApplicationRef); + return () => { // We have to check for the appRef here due to the possibility of multiple apps // being present on the same page. We only want to enable event replay for the @@ -129,7 +131,21 @@ export function withEventReplay(): Provider[] { } appsWithEventReplay.add(appRef); - appRef.onDestroy(() => appsWithEventReplay.delete(appRef)); + + appRef.onDestroy(() => { + appsWithEventReplay.delete(appRef); + // Ensure that we're always safe calling this in the browser. + if (typeof ngServerMode !== 'undefined' && !ngServerMode) { + // `_ejsa` should be deleted when the app is destroyed, ensuring that + // no elements are still captured in the global list and are not prevented + // from being garbage collected. + clearAppScopedEarlyEventContract(appId); + // Clean up the reference to the function set by the environment initializer, + // as the function closure may capture injected elements and prevent them + // from being properly garbage collected. + setStashFn(() => {}); + } + }); // Kick off event replay logic once hydration for the initial part // of the application is completed. This timing is similar to the unclaimed diff --git a/packages/core/src/hydration/i18n.ts b/packages/core/src/hydration/i18n.ts index 4aa20960eec0..9b7569ddcbba 100644 --- a/packages/core/src/hydration/i18n.ts +++ b/packages/core/src/hydration/i18n.ts @@ -14,7 +14,8 @@ import {isTNodeShape, TNode, TNodeType} from '../render3/interfaces/node'; import type {Renderer} from '../render3/interfaces/renderer'; import type {RNode} from '../render3/interfaces/renderer_dom'; import {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView, TVIEW} from '../render3/interfaces/view'; -import {getFirstNativeNode, nativeRemoveNode} from '../render3/node_manipulation'; +import {getFirstNativeNode} from '../render3/node_manipulation'; +import {nativeRemoveNode} from '../render3/dom_node_manipulation'; import {unwrapRNode} from '../render3/util/view_utils'; import {assertDefined, assertNotEqual} from '../util/assert'; diff --git a/packages/core/src/hydration/interfaces.ts b/packages/core/src/hydration/interfaces.ts index 5808b1795710..f1ef831ec31c 100644 --- a/packages/core/src/hydration/interfaces.ts +++ b/packages/core/src/hydration/interfaces.ts @@ -19,11 +19,15 @@ export const REFERENCE_NODE_BODY = 'b'; /** * Describes navigation steps that the runtime logic need to perform, * starting from a given (known) element. + * We're not using enum `NodeNavigationStep` because it produces more code overhead; + * thus, using plain `const` eliminates extra bytes. We can't use `const enum` due + * to single-file compilation restrictions. */ -export enum NodeNavigationStep { - FirstChild = 'f', - NextSibling = 'n', -} + +export type NodeNavigationStep = 'f' | 'n'; + +export const NODE_NAVIGATION_STEP_FIRST_CHILD = 'f'; +export const NODE_NAVIGATION_STEP_NEXT_SIBLING = 'n'; /** * Keys within serialized view data structure to represent various @@ -158,7 +162,7 @@ export interface SerializedDeferBlock { /** * This contains the unique id of this defer block's parent, if it exists. */ - [DEFER_PARENT_BLOCK_ID]: string | null; + [DEFER_PARENT_BLOCK_ID]?: string; /** * This field represents a status, based on the `DeferBlockState` enum. diff --git a/packages/core/src/hydration/node_lookup_utils.ts b/packages/core/src/hydration/node_lookup_utils.ts index 48a26b4d5f64..f3b73c794cc4 100644 --- a/packages/core/src/hydration/node_lookup_utils.ts +++ b/packages/core/src/hydration/node_lookup_utils.ts @@ -29,6 +29,8 @@ import { } from './error_handling'; import { DehydratedView, + NODE_NAVIGATION_STEP_FIRST_CHILD, + NODE_NAVIGATION_STEP_NEXT_SIBLING, NodeNavigationStep, NODES, REFERENCE_NODE_BODY, @@ -198,7 +200,7 @@ function stringifyNavigationInstructions(instructions: (number | NodeNavigationS const step = instructions[i]; const repeat = instructions[i + 1] as number; for (let r = 0; r < repeat; r++) { - container.push(step === NodeNavigationStep.FirstChild ? 'firstChild' : 'nextSibling'); + container.push(step === NODE_NAVIGATION_STEP_FIRST_CHILD ? 'firstChild' : 'nextSibling'); } } return container.join('.'); @@ -218,10 +220,10 @@ function navigateToNode(from: Node, instructions: (number | NodeNavigationStep)[ throw nodeNotFoundAtPathError(from, stringifyNavigationInstructions(instructions)); } switch (step) { - case NodeNavigationStep.FirstChild: + case NODE_NAVIGATION_STEP_FIRST_CHILD: node = node.firstChild!; break; - case NodeNavigationStep.NextSibling: + case NODE_NAVIGATION_STEP_NEXT_SIBLING: node = node.nextSibling!; break; } @@ -279,7 +281,7 @@ export function navigateBetween(start: Node, finish: Node): NodeNavigationStep[] // First navigate to `finish`'s parent ...parentPath, // Then to its first child. - NodeNavigationStep.FirstChild, + NODE_NAVIGATION_STEP_FIRST_CHILD, // And finally from that node to `finish` (maybe a no-op if we're already there). ...childPath, ]; @@ -294,7 +296,7 @@ function navigateBetweenSiblings(start: Node, finish: Node): NodeNavigationStep[ const nav: NodeNavigationStep[] = []; let node: Node | null = null; for (node = start; node != null && node !== finish; node = node.nextSibling) { - nav.push(NodeNavigationStep.NextSibling); + nav.push(NODE_NAVIGATION_STEP_NEXT_SIBLING); } // If the `node` becomes `null` or `undefined` at the end, that means that we // didn't find the `end` node, thus return `null` (which would trigger serialization diff --git a/packages/core/src/hydration/utils.ts b/packages/core/src/hydration/utils.ts index eb9b549d3598..49ee3b126e46 100644 --- a/packages/core/src/hydration/utils.ts +++ b/packages/core/src/hydration/utils.ts @@ -571,7 +571,7 @@ export function getParentBlockHydrationQueue( const deferBlockParents = transferState.get(NGH_DEFER_BLOCKS_KEY, {}); let isTopMostDeferBlock = false; - let currentBlockId: string | null = deferBlockId; + let currentBlockId: string | undefined = deferBlockId; let parentBlockPromise: Promise | null = null; const hydrationQueue: string[] = []; diff --git a/packages/core/src/image_performance_warning.ts b/packages/core/src/image_performance_warning.ts index cc3c66119833..cbdb8502b2ea 100644 --- a/packages/core/src/image_performance_warning.ts +++ b/packages/core/src/image_performance_warning.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {IMAGE_CONFIG, ImageConfig, PLATFORM_ID} from './application/application_tokens'; +import {IMAGE_CONFIG, ImageConfig} from './application/application_tokens'; import {Injectable} from './di'; import {inject} from './di/injector_compatibility'; import {formatRuntimeError, RuntimeErrorCode} from './errors'; @@ -27,12 +27,11 @@ export class ImagePerformanceWarning implements OnDestroy { private window: Window | null = null; private observer: PerformanceObserver | null = null; private options: ImageConfig = inject(IMAGE_CONFIG); - private readonly isBrowser = inject(PLATFORM_ID) === 'browser'; private lcpImageUrl?: string; public start() { if ( - !this.isBrowser || + (typeof ngServerMode !== 'undefined' && ngServerMode) || typeof PerformanceObserver === 'undefined' || (this.options?.disableImageSizeWarning && this.options?.disableImageLazyLoadWarning) ) { @@ -41,7 +40,7 @@ export class ImagePerformanceWarning implements OnDestroy { this.observer = this.initPerformanceObserver(); const doc = getDocument(); const win = doc.defaultView; - if (typeof win !== 'undefined') { + if (win) { this.window = win; // Wait to avoid race conditions where LCP image triggers // load event before it's recorded by the performance observer diff --git a/packages/core/src/linker/view_container_ref.ts b/packages/core/src/linker/view_container_ref.ts index 76549fa754bd..5a9f74da421c 100644 --- a/packages/core/src/linker/view_container_ref.ts +++ b/packages/core/src/linker/view_container_ref.ts @@ -22,7 +22,6 @@ import {assertNodeInjector} from '../render3/assert'; import {ComponentFactory as R3ComponentFactory} from '../render3/component_ref'; import {getComponentDef} from '../render3/def_getters'; import {getParentInjectorLocation, NodeInjector} from '../render3/di'; -import {addToEndOfViewTree, createLContainer} from '../render3/instructions/shared'; import { CONTAINER_HEADER_OFFSET, DEHYDRATED_VIEWS, @@ -51,13 +50,8 @@ import { TVIEW, } from '../render3/interfaces/view'; import {assertTNodeType} from '../render3/node_assert'; -import { - destroyLView, - detachView, - nativeInsertBefore, - nativeNextSibling, - nativeParentNode, -} from '../render3/node_manipulation'; +import {destroyLView} from '../render3/node_manipulation'; +import {nativeInsertBefore} from '../render3/dom_node_manipulation'; import {getCurrentTNode, getLView} from '../render3/state'; import { getParentInjectorIndex, @@ -65,7 +59,7 @@ import { hasParentInjector, } from '../render3/util/injector_utils'; import {getNativeByTNode, unwrapRNode, viewAttachedToContainer} from '../render3/util/view_utils'; -import {addLViewToLContainer, shouldAddViewToDom} from '../render3/view_manipulation'; +import {shouldAddViewToDom} from '../render3/view_manipulation'; import {ViewRef as R3ViewRef} from '../render3/view_ref'; import {addToArray, removeFromArray} from '../util/array_utils'; import { @@ -81,6 +75,8 @@ import {createElementRef, ElementRef} from './element_ref'; import {NgModuleRef} from './ng_module_factory'; import {TemplateRef} from './template_ref'; import {EmbeddedViewRef, ViewRef} from './view_ref'; +import {addLViewToLContainer, createLContainer, detachView} from '../render3/view/container'; +import {addToEndOfViewTree} from '../render3/view/construction'; /** * Represents a container where one or more views can be attached to a component. @@ -723,12 +719,12 @@ function insertAnchorNode(hostLView: LView, hostTNode: TNode): RComment { const commentNode = renderer.createComment(ngDevMode ? 'container' : ''); const hostNative = getNativeByTNode(hostTNode, hostLView)!; - const parentOfHostNative = nativeParentNode(renderer, hostNative); + const parentOfHostNative = renderer.parentNode(hostNative); nativeInsertBefore( renderer, parentOfHostNative!, commentNode, - nativeNextSibling(renderer, hostNative), + renderer.nextSibling(hostNative), false, ); return commentNode; diff --git a/packages/core/src/metadata/ng_module.ts b/packages/core/src/metadata/ng_module.ts index 38d32839e282..841eb4aa39f2 100644 --- a/packages/core/src/metadata/ng_module.ts +++ b/packages/core/src/metadata/ng_module.ts @@ -57,7 +57,7 @@ export interface NgModule { * The following example defines a class that is injected in * the HelloWorld NgModule: * - * ``` + * ```ts * class Greeter { * greet(name:string) { * return 'Hello ' + name + '!'; diff --git a/packages/core/src/pending_tasks.ts b/packages/core/src/pending_tasks.ts index b9042a81bbec..fa859a54c9af 100644 --- a/packages/core/src/pending_tasks.ts +++ b/packages/core/src/pending_tasks.ts @@ -107,7 +107,7 @@ export class PendingTasks { /** * Runs an asynchronous function and blocks the application's stability until the function completes. * - * ``` + * ```ts * pendingTasks.run(async () => { * const userData = await fetch('/api/user'); * this.userData.set(userData); @@ -117,7 +117,7 @@ export class PendingTasks { * Application stability is at least delayed until the next tick after the `run` method resolves * so it is safe to make additional updates to application state that would require UI synchronization: * - * ``` + * ```ts * const userData = await pendingTasks.run(() => fetch('/api/user')); * this.userData.set(userData); * ``` diff --git a/packages/core/src/platform/bootstrap.ts b/packages/core/src/platform/bootstrap.ts index 3fdce7155df1..017bc3f4e0af 100644 --- a/packages/core/src/platform/bootstrap.ts +++ b/packages/core/src/platform/bootstrap.ts @@ -20,11 +20,12 @@ import {setLocaleId} from '../render3/i18n/i18n_locale_id'; import {NgZone} from '../zone/ng_zone'; import {ApplicationInitStatus} from '../application/application_init'; -import {_callAndReportToErrorHandler, ApplicationRef, remove} from '../application/application_ref'; +import {ApplicationRef, remove} from '../application/application_ref'; import {PROVIDED_ZONELESS} from '../change_detection/scheduling/zoneless_scheduling'; import {InjectionToken, Injector} from '../di'; import {InternalNgModuleRef, NgModuleRef} from '../linker/ng_module_factory'; import {stringify} from '../util/stringify'; +import {isPromise} from '../util/lang'; /** * InjectionToken to control root component bootstrap behavior. @@ -200,3 +201,26 @@ function moduleDoBootstrap( } allPlatformModules.push(moduleRef); } + +function _callAndReportToErrorHandler( + errorHandler: ErrorHandler, + ngZone: NgZone, + callback: () => any, +): any { + try { + const result = callback(); + if (isPromise(result)) { + return result.catch((e: any) => { + ngZone.runOutsideAngular(() => errorHandler.handleError(e)); + // rethrow as the exception handler might not do it + throw e; + }); + } + + return result; + } catch (e) { + ngZone.runOutsideAngular(() => errorHandler.handleError(e)); + // rethrow as the exception handler might not do it + throw e; + } +} diff --git a/packages/core/src/platform/platform_ref.ts b/packages/core/src/platform/platform_ref.ts index 9ac30bacc750..86b6d7787fff 100644 --- a/packages/core/src/platform/platform_ref.ts +++ b/packages/core/src/platform/platform_ref.ts @@ -7,11 +7,7 @@ */ import {compileNgModuleFactory} from '../application/application_ngmodule_factory_compiler'; -import { - _callAndReportToErrorHandler, - BootstrapOptions, - optionsReducer, -} from '../application/application_ref'; +import {BootstrapOptions, optionsReducer} from '../application/application_ref'; import { getNgZoneOptions, internalProvideZoneChangeDetection, diff --git a/packages/core/src/render3/after_render/manager.ts b/packages/core/src/render3/after_render/manager.ts index f29b8258f019..79c5264eec9e 100644 --- a/packages/core/src/render3/after_render/manager.ts +++ b/packages/core/src/render3/after_render/manager.ts @@ -17,6 +17,8 @@ import {ErrorHandler} from '../../error_handler'; import {type DestroyRef} from '../../linker/destroy_ref'; import {NgZone} from '../../zone'; import {AFTER_RENDER_SEQUENCES_TO_ADD, FLAGS, LView, LViewFlags} from '../interfaces/view'; +import {profiler} from '../profiler'; +import {ProfilerEvent} from '../profiler_types'; import {markAncestorsForTraversal} from '../util/view_utils'; import {AfterRenderPhase, AfterRenderRef} from './api'; @@ -67,6 +69,12 @@ export class AfterRenderImpl { * might be scheduled. */ execute(): void { + const hasSequencesToExecute = this.sequences.size > 0; + + if (hasSequencesToExecute) { + profiler(ProfilerEvent.AfterRenderHooksStart); + } + this.executing = true; for (const phase of AFTER_RENDER_PHASES) { for (const sequence of this.sequences) { @@ -76,10 +84,11 @@ export class AfterRenderImpl { try { sequence.pipelinedValue = this.ngZone.runOutsideAngular(() => - this.maybeTrace( - () => sequence.hooks[phase]!(sequence.pipelinedValue), - sequence.snapshot, - ), + this.maybeTrace(() => { + const hookFn = sequence.hooks[phase]!; + const value = hookFn(sequence.pipelinedValue); + return value; + }, sequence.snapshot), ); } catch (err) { sequence.erroredOrDestroyed = true; @@ -107,6 +116,10 @@ export class AfterRenderImpl { this.scheduler.notify(NotificationSource.RenderHook); } this.deferredRegistrations.clear(); + + if (hasSequencesToExecute) { + profiler(ProfilerEvent.AfterRenderHooksEnd); + } } register(sequence: AfterRenderSequence): void { diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 80862a6a44ed..0e961834ba34 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -16,8 +16,6 @@ import { import {Injector} from '../di/injector'; import {EnvironmentInjector} from '../di/r3_injector'; import {RuntimeError, RuntimeErrorCode} from '../errors'; -import {DehydratedView} from '../hydration/interfaces'; -import {retrieveHydrationInfo} from '../hydration/utils'; import {Type} from '../interface/type'; import { ComponentFactory as AbstractComponentFactory, @@ -26,49 +24,29 @@ import { import {ComponentFactoryResolver as AbstractComponentFactoryResolver} from '../linker/component_factory_resolver'; import {createElementRef, ElementRef} from '../linker/element_ref'; import {NgModuleRef} from '../linker/ng_module_factory'; -import {Renderer2, RendererFactory2} from '../render/api'; +import {RendererFactory2} from '../render/api'; import {Sanitizer} from '../sanitization/sanitizer'; -import {assertDefined, assertGreaterThan, assertIndexInRange} from '../util/assert'; -import {assertComponentType, assertNoDuplicateDirectives} from './assert'; +import {assertComponentType} from './assert'; import {attachPatchData} from './context_discovery'; import {getComponentDef} from './def_getters'; import {depsTracker} from './deps_tracker/deps_tracker'; -import {getNodeInjectable, NodeInjector} from './di'; -import {registerPostOrderHooks} from './hooks'; +import {NodeInjector} from './di'; import {reportUnknownPropertyError} from './instructions/element_validation'; import {markViewDirty} from './instructions/mark_view_dirty'; import {renderView} from './instructions/render'; import { - addToEndOfViewTree, - createLView, - createTView, - executeContentQueries, - getInitialLViewFlagsFromDef, - getOrCreateComponentTView, - getOrCreateTNode, - initializeDirectives, - invokeDirectivesHostBindings, + createDirectivesInstances, locateHostElement, - markAsComponentHost, - setInputsForProperty, + setAllInputsForProperty, } from './instructions/shared'; -import {ComponentDef, DirectiveDef, HostDirectiveDefs} from './interfaces/definition'; +import {ComponentDef, DirectiveDef} from './interfaces/definition'; import {InputFlags} from './interfaces/input_flags'; -import { - NodeInputBindings, - TContainerNode, - TElementContainerNode, - TElementNode, - TNode, - TNodeType, -} from './interfaces/node'; -import {Renderer} from './interfaces/renderer'; +import {TContainerNode, TElementContainerNode, TElementNode, TNode} from './interfaces/node'; import {RElement, RNode} from './interfaces/renderer_dom'; import { CONTEXT, HEADER_OFFSET, - INJECTOR, LView, LViewEnvironment, LViewFlags, @@ -76,19 +54,25 @@ import { TViewType, } from './interfaces/view'; import {MATH_ML_NAMESPACE, SVG_NAMESPACE} from './namespaces'; -import {createElementNode, setupStaticAttributes, writeDirectClass} from './node_manipulation'; + +import {retrieveHydrationInfo} from '../hydration/utils'; +import {ChainedInjector} from './chained_injector'; +import {createElementNode, setupStaticAttributes} from './dom_node_manipulation'; +import {unregisterLView} from './interfaces/lview_tracking'; +import {Renderer} from './interfaces/renderer'; import { extractAttrsAndClassesFromSelector, stringifyCSSSelectorList, } from './node_selector_matcher'; -import {enterView, getCurrentTNode, getLView, leaveView} from './state'; -import {computeStaticStyling} from './styling/static_styling'; -import {mergeHostAttrs, setUpAttributes} from './util/attrs_utils'; +import {profiler} from './profiler'; +import {ProfilerEvent} from './profiler_types'; +import {executeContentQueries} from './queries/query_execution'; +import {enterView, leaveView} from './state'; import {debugStringifyTypeForError, stringifyForError} from './util/stringify_utils'; -import {getComponentLViewByIndex, getNativeByTNode, getTNode} from './util/view_utils'; +import {getComponentLViewByIndex, getTNode} from './util/view_utils'; +import {elementEndFirstCreatePass, elementStartFirstCreatePass} from './view/elements'; import {ViewRef} from './view_ref'; -import {ChainedInjector} from './chained_injector'; -import {unregisterLView} from './interfaces/lview_tracking'; +import {createLView, createTView, getInitialLViewFlagsFromDef} from './view/construction'; export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { /** @@ -105,56 +89,93 @@ export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { } } -function toRefArray( - map: DirectiveDef['inputs'], - isInputMap: true, -): ComponentFactory['inputs']; -function toRefArray( - map: DirectiveDef['outputs'], - isInput: false, -): ComponentFactory['outputs']; - -function toRefArray< - T, - IsInputMap extends boolean, - Return extends IsInputMap extends true - ? ComponentFactory['inputs'] - : ComponentFactory['outputs'], ->(map: DirectiveDef['inputs'] | DirectiveDef['outputs'], isInputMap: IsInputMap): Return { - const array: Return = [] as unknown as Return; - for (const publicName in map) { - if (!map.hasOwnProperty(publicName)) { - continue; +function toInputRefArray(map: DirectiveDef['inputs']): ComponentFactory['inputs'] { + return Object.keys(map).map((name) => { + const [propName, flags, transform] = map[name]; + const inputData: ComponentFactory['inputs'][0] = { + propName: propName, + templateName: name, + isSignal: (flags & InputFlags.SignalBased) !== 0, + }; + if (transform) { + inputData.transform = transform; } + return inputData; + }); +} - const value = map[publicName]; - if (value === undefined) { - continue; - } +function toOutputRefArray(map: DirectiveDef['outputs']): ComponentFactory['outputs'] { + return Object.keys(map).map((name) => ({propName: map[name], templateName: name})); +} - const isArray = Array.isArray(value); - const propName: string = isArray ? value[0] : value; - const flags: InputFlags = isArray ? value[1] : InputFlags.None; - - if (isInputMap) { - (array as ComponentFactory['inputs']).push({ - propName: propName, - templateName: publicName, - isSignal: (flags & InputFlags.SignalBased) !== 0, - }); - } else { - (array as ComponentFactory['outputs']).push({ - propName: propName, - templateName: publicName, - }); +function verifyNotAnOrphanComponent(componentDef: ComponentDef) { + // TODO(pk): create assert that verifies ngDevMode + if ( + (typeof ngJitMode === 'undefined' || ngJitMode) && + componentDef.debugInfo?.forbidOrphanRendering + ) { + if (depsTracker.isOrphanComponent(componentDef.type)) { + throw new RuntimeError( + RuntimeErrorCode.RUNTIME_DEPS_ORPHAN_COMPONENT, + `Orphan component found! Trying to render the component ${debugStringifyTypeForError( + componentDef.type, + )} without first loading the NgModule that declares it. It is recommended to make this component standalone in order to avoid this error. If this is not possible now, import the component's NgModule in the appropriate NgModule, or the standalone component in which you are trying to render this component. If this is a lazy import, load the NgModule lazily as well and use its module injector.`, + ); } } - return array; } -function getNamespace(elementName: string): string | null { - const name = elementName.toLowerCase(); - return name === 'svg' ? SVG_NAMESPACE : name === 'math' ? MATH_ML_NAMESPACE : null; +function createRootViewInjector( + componentDef: ComponentDef, + environmentInjector: EnvironmentInjector | NgModuleRef | undefined, + injector: Injector, +): Injector { + let realEnvironmentInjector = + environmentInjector instanceof EnvironmentInjector + ? environmentInjector + : environmentInjector?.injector; + + if (realEnvironmentInjector && componentDef.getStandaloneInjector !== null) { + realEnvironmentInjector = + componentDef.getStandaloneInjector(realEnvironmentInjector) || realEnvironmentInjector; + } + + const rootViewInjector = realEnvironmentInjector + ? new ChainedInjector(injector, realEnvironmentInjector) + : injector; + return rootViewInjector; +} + +function createRootLViewEnvironment(rootLViewInjector: Injector): LViewEnvironment { + const rendererFactory = rootLViewInjector.get(RendererFactory2, null); + if (rendererFactory === null) { + throw new RuntimeError( + RuntimeErrorCode.RENDERER_NOT_FOUND, + ngDevMode && + 'Angular was not able to inject a renderer (RendererFactory2). ' + + 'Likely this is due to a broken DI hierarchy. ' + + 'Make sure that any injector used to create this component has a correct parent.', + ); + } + + const sanitizer = rootLViewInjector.get(Sanitizer, null); + const changeDetectionScheduler = rootLViewInjector.get(ChangeDetectionScheduler, null); + + return { + rendererFactory, + sanitizer, + changeDetectionScheduler, + }; +} + +function createHostElement(componentDef: ComponentDef, render: Renderer): RElement { + // Determine a tag name used for creating host elements when this component is created + // dynamically. Default to 'div' if this component did not specify any tag name in its + // selector. + const tagName = ((componentDef.selectors[0][0] as string) || 'div').toLowerCase(); + const namespace = + tagName === 'svg' ? SVG_NAMESPACE : tagName === 'math' ? MATH_ML_NAMESPACE : null; + return createElementNode(render, tagName, namespace); } /** @@ -172,23 +193,11 @@ export class ComponentFactory extends AbstractComponentFactory { isSignal: boolean; transform?: (value: any) => any; }[] { - const componentDef = this.componentDef; - const inputTransforms = componentDef.inputTransforms; - const refArray = toRefArray(componentDef.inputs, true); - - if (inputTransforms !== null) { - for (const input of refArray) { - if (inputTransforms.hasOwnProperty(input.propName)) { - input.transform = inputTransforms[input.propName]; - } - } - } - - return refArray; + return toInputRefArray(this.componentDef.inputs); } override get outputs(): {propName: string; templateName: string}[] { - return toRefArray(this.componentDef.outputs, false); + return toOutputRefArray(this.componentDef.outputs); } /** @@ -202,9 +211,7 @@ export class ComponentFactory extends AbstractComponentFactory { super(); this.componentType = componentDef.type; this.selector = stringifyCSSSelectorList(componentDef.selectors); - this.ngContentSelectors = componentDef.ngContentSelectors - ? componentDef.ngContentSelectors - : []; + this.ngContentSelectors = componentDef.ngContentSelectors ?? []; this.isBoundToModule = !!ngModule; } @@ -214,87 +221,17 @@ export class ComponentFactory extends AbstractComponentFactory { rootSelectorOrNode?: any, environmentInjector?: NgModuleRef | EnvironmentInjector | undefined, ): AbstractComponentRef { + profiler(ProfilerEvent.DynamicComponentStart); + const prevConsumer = setActiveConsumer(null); try { - // Check if the component is orphan - if ( - ngDevMode && - (typeof ngJitMode === 'undefined' || ngJitMode) && - this.componentDef.debugInfo?.forbidOrphanRendering - ) { - if (depsTracker.isOrphanComponent(this.componentType)) { - throw new RuntimeError( - RuntimeErrorCode.RUNTIME_DEPS_ORPHAN_COMPONENT, - `Orphan component found! Trying to render the component ${debugStringifyTypeForError( - this.componentType, - )} without first loading the NgModule that declares it. It is recommended to make this component standalone in order to avoid this error. If this is not possible now, import the component's NgModule in the appropriate NgModule, or the standalone component in which you are trying to render this component. If this is a lazy import, load the NgModule lazily as well and use its module injector.`, - ); - } - } - - environmentInjector = environmentInjector || this.ngModule; - - let realEnvironmentInjector = - environmentInjector instanceof EnvironmentInjector - ? environmentInjector - : environmentInjector?.injector; - - if (realEnvironmentInjector && this.componentDef.getStandaloneInjector !== null) { - realEnvironmentInjector = - this.componentDef.getStandaloneInjector(realEnvironmentInjector) || - realEnvironmentInjector; - } - - const rootViewInjector = realEnvironmentInjector - ? new ChainedInjector(injector, realEnvironmentInjector) - : injector; - - const rendererFactory = rootViewInjector.get(RendererFactory2, null); - if (rendererFactory === null) { - throw new RuntimeError( - RuntimeErrorCode.RENDERER_NOT_FOUND, - ngDevMode && - 'Angular was not able to inject a renderer (RendererFactory2). ' + - 'Likely this is due to a broken DI hierarchy. ' + - 'Make sure that any injector used to create this component has a correct parent.', - ); - } - const sanitizer = rootViewInjector.get(Sanitizer, null); - - const changeDetectionScheduler = rootViewInjector.get(ChangeDetectionScheduler, null); - - const environment: LViewEnvironment = { - rendererFactory, - sanitizer, - changeDetectionScheduler, - }; - - const hostRenderer = rendererFactory.createRenderer(null, this.componentDef); - // Determine a tag name used for creating host elements when this component is created - // dynamically. Default to 'div' if this component did not specify any tag name in its - // selector. - const elementName = (this.componentDef.selectors[0][0] as string) || 'div'; - const hostRNode = rootSelectorOrNode - ? locateHostElement( - hostRenderer, - rootSelectorOrNode, - this.componentDef.encapsulation, - rootViewInjector, - ) - : createElementNode(hostRenderer, elementName, getNamespace(elementName)); - - let rootFlags = LViewFlags.IsRoot; - if (this.componentDef.signals) { - rootFlags |= LViewFlags.SignalView; - } else if (!this.componentDef.onPush) { - rootFlags |= LViewFlags.CheckAlways; - } - - let hydrationInfo: DehydratedView | null = null; - if (hostRNode !== null) { - hydrationInfo = retrieveHydrationInfo(hostRNode, rootViewInjector, true /* isRootView */); - } + const cmpDef = this.componentDef; + ngDevMode && verifyNotAnOrphanComponent(cmpDef); + const tAttributes = rootSelectorOrNode + ? ['ng-version', '0.0.0-PLACEHOLDER'] + : // Extract attributes and classes from the first selector only to match VE behavior. + extractAttrsAndClassesFromSelector(this.componentDef.selectors[0]); // Create the root view. Uses empty TView and ContentTemplate. const rootTView = createTView( TViewType.Root, @@ -306,23 +243,43 @@ export class ComponentFactory extends AbstractComponentFactory { null, null, null, - null, + [tAttributes], null, ); - const rootLView = createLView( + + const rootViewInjector = createRootViewInjector( + cmpDef, + environmentInjector || this.ngModule, + injector, + ); + + const environment = createRootLViewEnvironment(rootViewInjector); + const hostRenderer = environment.rendererFactory.createRenderer(null, cmpDef); + const hostElement = rootSelectorOrNode + ? locateHostElement( + hostRenderer, + rootSelectorOrNode, + cmpDef.encapsulation, + rootViewInjector, + ) + : createHostElement(cmpDef, hostRenderer); + + const rootLView = createLView( null, rootTView, null, - rootFlags, + LViewFlags.IsRoot | getInitialLViewFlagsFromDef(cmpDef), null, null, environment, hostRenderer, rootViewInjector, null, - hydrationInfo, + retrieveHydrationInfo(hostElement, rootViewInjector, true /* isRootView */), ); + rootLView[HEADER_OFFSET] = hostElement; + // rootView is the parent when bootstrapping // TODO(misko): it looks like we are entering view here but we don't really need to as // `renderView` does that. However as the code is written it is needed because @@ -330,63 +287,44 @@ export class ComponentFactory extends AbstractComponentFactory { // issues would allow us to drop this. enterView(rootLView); - let component: T; - let tElementNode: TElementNode; let componentView: LView | null = null; try { - const rootComponentDef = this.componentDef; - let rootDirectives: DirectiveDef[]; - let hostDirectiveDefs: HostDirectiveDefs | null = null; - - if (rootComponentDef.findHostDirectiveDefs) { - rootDirectives = []; - hostDirectiveDefs = new Map(); - rootComponentDef.findHostDirectiveDefs( - rootComponentDef, - rootDirectives, - hostDirectiveDefs, - ); - rootDirectives.push(rootComponentDef); - ngDevMode && assertNoDuplicateDirectives(rootDirectives); - } else { - rootDirectives = [rootComponentDef]; - } - - const hostTNode = createRootComponentTNode(rootLView, hostRNode); - componentView = createRootComponentView( - hostTNode, - hostRNode, - rootComponentDef, - rootDirectives, + const hostTNode = elementStartFirstCreatePass( + HEADER_OFFSET, + rootTView, rootLView, - environment, - hostRenderer, + '#host', + () => [this.componentDef], + true, + 0, ); - tElementNode = getTNode(rootTView, HEADER_OFFSET) as TElementNode; + // ---- element instruction // TODO(crisbeto): in practice `hostRNode` should always be defined, but there are some // tests where the renderer is mocked out and `undefined` is returned. We should update the // tests so that this check can be removed. - if (hostRNode) { - setRootNodeAttributes(hostRenderer, rootComponentDef, hostRNode, rootSelectorOrNode); + if (hostElement) { + setupStaticAttributes(hostRenderer, hostElement, hostTNode); + attachPatchData(hostElement, rootLView); } + // TODO(pk): this logic is similar to the instruction code where a node can have directives + createDirectivesInstances(rootTView, rootLView, hostTNode); + executeContentQueries(rootTView, hostTNode, rootLView); + + elementEndFirstCreatePass(rootTView, hostTNode); + if (projectableNodes !== undefined) { - projectNodes(tElementNode, this.ngContentSelectors, projectableNodes); + projectNodes(hostTNode, this.ngContentSelectors, projectableNodes); } - // TODO: should LifecycleHooksFeature and other host features be generated by the compiler - // and executed here? Angular 5 reference: https://stackblitz.com/edit/lifecycle-hooks-vcref - component = createRootComponent( - componentView, - rootComponentDef, - rootDirectives, - hostDirectiveDefs, - rootLView, - [LifecycleHooksFeature], - ); + componentView = getComponentLViewByIndex(hostTNode.index, rootLView); + + // TODO(pk): why do we need this logic? + rootLView[CONTEXT] = componentView[CONTEXT] as T; + renderView(rootTView, rootLView, null); } catch (e) { // Stop tracking the views if creation failed since @@ -397,16 +335,11 @@ export class ComponentFactory extends AbstractComponentFactory { unregisterLView(rootLView); throw e; } finally { + profiler(ProfilerEvent.DynamicComponentEnd); leaveView(); } - return new ComponentRef( - this.componentType, - component, - createElementRef(tElementNode, rootLView), - rootLView, - tElementNode, - ); + return new ComponentRef(this.componentType, rootLView); } finally { setActiveConsumer(prevConsumer); } @@ -426,17 +359,18 @@ export class ComponentRef extends AbstractComponentRef { override hostView: ViewRef; override changeDetectorRef: ChangeDetectorRef; override componentType: Type; + override location: ElementRef; private previousInputValues: Map | null = null; + private _tNode: TElementNode | TContainerNode | TElementContainerNode; constructor( componentType: Type, - instance: T, - public location: ElementRef, private _rootLView: LView, - private _tNode: TElementNode | TContainerNode | TElementContainerNode, ) { super(); - this.instance = instance; + this._tNode = getTNode(_rootLView[TVIEW], HEADER_OFFSET) as TElementNode; + this.location = createElementRef(this._tNode, _rootLView); + this.instance = getComponentLViewByIndex(this._tNode.index, _rootLView)[CONTEXT] as T; this.hostView = this.changeDetectorRef = new ViewRef( _rootLView, undefined /* _cdRefInjectingView */, @@ -446,31 +380,28 @@ export class ComponentRef extends AbstractComponentRef { } override setInput(name: string, value: unknown): void { - const inputData = this._tNode.inputs; - let dataValue: NodeInputBindings[typeof name] | undefined; - if (inputData !== null && (dataValue = inputData[name])) { - this.previousInputValues ??= new Map(); - // Do not set the input if it is the same as the last value - // This behavior matches `bindingUpdated` when binding inputs in templates. - if ( - this.previousInputValues.has(name) && - Object.is(this.previousInputValues.get(name), value) - ) { - return; - } + const tNode = this._tNode; + this.previousInputValues ??= new Map(); + // Do not set the input if it is the same as the last value + // This behavior matches `bindingUpdated` when binding inputs in templates. + if ( + this.previousInputValues.has(name) && + Object.is(this.previousInputValues.get(name), value) + ) { + return; + } - const lView = this._rootLView; - setInputsForProperty(lView[TVIEW], lView, dataValue, name, value); - this.previousInputValues.set(name, value); - const childComponentLView = getComponentLViewByIndex(this._tNode.index, lView); - markViewDirty(childComponentLView, NotificationSource.SetInput); - } else { - if (ngDevMode) { - const cmpNameForError = stringifyForError(this.componentType); - let message = `Can't set value of the '${name}' input on the '${cmpNameForError}' component. `; - message += `Make sure that the '${name}' property is annotated with @Input() or a mapped @Input('${name}') exists.`; - reportUnknownPropertyError(message); - } + const lView = this._rootLView; + const hasSetInput = setAllInputsForProperty(tNode, lView[TVIEW], lView, name, value); + this.previousInputValues.set(name, value); + const childComponentLView = getComponentLViewByIndex(tNode.index, lView); + markViewDirty(childComponentLView, NotificationSource.SetInput); + + if (ngDevMode && !hasSetInput) { + const cmpNameForError = stringifyForError(this.componentType); + let message = `Can't set value of the '${name}' input on the '${cmpNameForError}' component. `; + message += `Make sure that the '${name}' property is annotated with @Input() or a mapped @Input('${name}') exists.`; + reportUnknownPropertyError(message); } } @@ -487,177 +418,6 @@ export class ComponentRef extends AbstractComponentRef { } } -/** Represents a HostFeature function. */ -type HostFeature = (component: T, componentDef: ComponentDef) => void; - -/** Creates a TNode that can be used to instantiate a root component. */ -function createRootComponentTNode(lView: LView, rNode: RNode): TElementNode { - const tView = lView[TVIEW]; - const index = HEADER_OFFSET; - ngDevMode && assertIndexInRange(lView, index); - lView[index] = rNode; - - // '#host' is added here as we don't know the real host DOM name (we don't want to read it) and at - // the same time we want to communicate the debug `TNode` that this is a special `TNode` - // representing a host element. - return getOrCreateTNode(tView, index, TNodeType.Element, '#host', null); -} - -/** - * Creates the root component view and the root component node. - * - * @param hostRNode Render host element. - * @param rootComponentDef ComponentDef - * @param rootView The parent view where the host node is stored - * @param rendererFactory Factory to be used for creating child renderers. - * @param hostRenderer The current renderer - * @param sanitizer The sanitizer, if provided - * - * @returns Component view created - */ -function createRootComponentView( - tNode: TElementNode, - hostRNode: RElement | null, - rootComponentDef: ComponentDef, - rootDirectives: DirectiveDef[], - rootView: LView, - environment: LViewEnvironment, - hostRenderer: Renderer, -): LView { - const tView = rootView[TVIEW]; - applyRootComponentStyling(rootDirectives, tNode, hostRNode, hostRenderer); - - // Hydration info is on the host element and needs to be retrieved - // and passed to the component LView. - let hydrationInfo: DehydratedView | null = null; - if (hostRNode !== null) { - hydrationInfo = retrieveHydrationInfo(hostRNode, rootView[INJECTOR]); - } - const viewRenderer = environment.rendererFactory.createRenderer(hostRNode, rootComponentDef); - const componentView = createLView( - rootView, - getOrCreateComponentTView(rootComponentDef), - null, - getInitialLViewFlagsFromDef(rootComponentDef), - rootView[tNode.index], - tNode, - environment, - viewRenderer, - null, - null, - hydrationInfo, - ); - - if (tView.firstCreatePass) { - markAsComponentHost(tView, tNode, rootDirectives.length - 1); - } - - addToEndOfViewTree(rootView, componentView); - - // Store component view at node index, with node as the HOST - return (rootView[tNode.index] = componentView); -} - -/** Sets up the styling information on a root component. */ -function applyRootComponentStyling( - rootDirectives: DirectiveDef[], - tNode: TElementNode, - rNode: RElement | null, - hostRenderer: Renderer, -): void { - for (const def of rootDirectives) { - tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, def.hostAttrs); - } - - if (tNode.mergedAttrs !== null) { - computeStaticStyling(tNode, tNode.mergedAttrs, true); - - if (rNode !== null) { - setupStaticAttributes(hostRenderer, rNode, tNode); - } - } -} - -/** - * Creates a root component and sets it up with features and host bindings.Shared by - * renderComponent() and ViewContainerRef.createComponent(). - */ -function createRootComponent( - componentView: LView, - rootComponentDef: ComponentDef, - rootDirectives: DirectiveDef[], - hostDirectiveDefs: HostDirectiveDefs | null, - rootLView: LView, - hostFeatures: HostFeature[] | null, -): any { - const rootTNode = getCurrentTNode() as TElementNode; - ngDevMode && assertDefined(rootTNode, 'tNode should have been already created'); - const tView = rootLView[TVIEW]; - const native = getNativeByTNode(rootTNode, rootLView); - - initializeDirectives(tView, rootLView, rootTNode, rootDirectives, null, hostDirectiveDefs); - - for (let i = 0; i < rootDirectives.length; i++) { - const directiveIndex = rootTNode.directiveStart + i; - const directiveInstance = getNodeInjectable(rootLView, tView, directiveIndex, rootTNode); - attachPatchData(directiveInstance, rootLView); - } - - invokeDirectivesHostBindings(tView, rootLView, rootTNode); - - if (native) { - attachPatchData(native, rootLView); - } - - // We're guaranteed for the `componentOffset` to be positive here - // since a root component always matches a component def. - ngDevMode && - assertGreaterThan(rootTNode.componentOffset, -1, 'componentOffset must be great than -1'); - const component = getNodeInjectable( - rootLView, - tView, - rootTNode.directiveStart + rootTNode.componentOffset, - rootTNode, - ); - componentView[CONTEXT] = rootLView[CONTEXT] = component; - - if (hostFeatures !== null) { - for (const feature of hostFeatures) { - feature(component, rootComponentDef); - } - } - - // We want to generate an empty QueryList for root content queries for backwards - // compatibility with ViewEngine. - executeContentQueries(tView, rootTNode, rootLView); - - return component; -} - -/** Sets the static attributes on a root component. */ -function setRootNodeAttributes( - hostRenderer: Renderer2, - componentDef: ComponentDef, - hostRNode: RElement, - rootSelectorOrNode: any, -) { - if (rootSelectorOrNode) { - // The placeholder will be replaced with the actual version at build time. - setUpAttributes(hostRenderer, hostRNode, ['ng-version', '0.0.0-PLACEHOLDER']); - } else { - // If host element is created as a part of this function call (i.e. `rootSelectorOrNode` - // is not defined), also apply attributes and classes extracted from component selector. - // Extract attributes and classes from the first selector only to match VE behavior. - const {attrs, classes} = extractAttrsAndClassesFromSelector(componentDef.selectors[0]); - if (attrs) { - setUpAttributes(hostRenderer, hostRNode, attrs); - } - if (classes && classes.length > 0) { - writeDirectClass(hostRenderer, hostRNode, classes.join(' ')); - } - } -} - /** Projects the `projectableNodes` that were specified when creating a root component. */ function projectNodes( tNode: TElementNode, @@ -675,22 +435,3 @@ function projectNodes( projection.push(nodesforSlot != null && nodesforSlot.length ? Array.from(nodesforSlot) : null); } } - -/** - * Used to enable lifecycle hooks on the root component. - * - * Include this feature when calling `renderComponent` if the root component - * you are rendering has lifecycle hooks defined. Otherwise, the hooks won't - * be called properly. - * - * Example: - * - * ```ts - * renderComponent(AppComponent, {hostFeatures: [LifecycleHooksFeature]}); - * ``` - */ -export function LifecycleHooksFeature(): void { - const tNode = getCurrentTNode()!; - ngDevMode && assertDefined(tNode, 'TNode is required'); - registerPostOrderHooks(getLView()[TVIEW], tNode); -} diff --git a/packages/core/src/render3/context_discovery.ts b/packages/core/src/render3/context_discovery.ts index 26fbe9d16348..b59c11375a29 100644 --- a/packages/core/src/render3/context_discovery.ts +++ b/packages/core/src/render3/context_discovery.ts @@ -15,7 +15,7 @@ import {LContext} from './interfaces/context'; import {getLViewById, registerLView} from './interfaces/lview_tracking'; import {TNode} from './interfaces/node'; import {RElement, RNode} from './interfaces/renderer_dom'; -import {isLView} from './interfaces/type_checks'; +import {isComponentHost, isLView} from './interfaces/type_checks'; import {CONTEXT, HEADER_OFFSET, HOST, ID, LView, TVIEW} from './interfaces/view'; import {getComponentLViewByIndex, unwrapRNode} from './util/view_utils'; @@ -331,8 +331,7 @@ export function getDirectivesAtNodeIndex(nodeIndex: number, lView: LView): any[] export function getComponentAtNodeIndex(nodeIndex: number, lView: LView): {} | null { const tNode = lView[TVIEW].data[nodeIndex] as TNode; - const {directiveStart, componentOffset} = tNode; - return componentOffset > -1 ? lView[directiveStart + componentOffset] : null; + return isComponentHost(tNode) ? lView[tNode.directiveStart + tNode.componentOffset] : null; } /** diff --git a/packages/core/src/render3/definition.ts b/packages/core/src/render3/definition.ts index 6b022c06d144..fb10faadffed 100644 --- a/packages/core/src/render3/definition.ts +++ b/packages/core/src/render3/definition.ts @@ -242,7 +242,7 @@ interface ComponentDefinition extends Omit, 'features' * * This function has following structure. * - * ``` + * ```ts * function Template(ctx:T, creationMode: boolean) { * if (creationMode) { * // Contains creation mode instructions. @@ -508,45 +508,50 @@ export function ɵɵdefineNgModule(def: { * */ -function parseAndConvertBindingsForDefinition( - obj: DirectiveDefinition['outputs'] | undefined, -): Record; -function parseAndConvertBindingsForDefinition( - obj: DirectiveInputs | undefined, +function parseAndConvertInputsForDefinition( + obj: DirectiveDefinition['inputs'], declaredInputs: Record, -): Record; - -function parseAndConvertBindingsForDefinition( - obj: undefined | DirectiveInputs | DirectiveDefinition['outputs'], - declaredInputs?: Record, -): Record { +) { if (obj == null) return EMPTY_OBJ as any; - const newLookup: any = {}; + const newLookup: Record< + string, + [minifiedName: string, flags: InputFlags, transform: InputTransformFunction | null] + > = {}; for (const minifiedKey in obj) { if (obj.hasOwnProperty(minifiedKey)) { const value = obj[minifiedKey]!; let publicName: string; let declaredName: string; - let inputFlags = InputFlags.None; + let inputFlags: InputFlags; + let transform: InputTransformFunction | null; if (Array.isArray(value)) { inputFlags = value[0]; publicName = value[1]; declaredName = value[2] ?? publicName; // declared name might not be set to save bytes. + transform = value[3] || null; } else { publicName = value; declaredName = value; + inputFlags = InputFlags.None; + transform = null; } - // For inputs, capture the declared name, or if some flags are set. - if (declaredInputs) { - // Perf note: An array is only allocated for the input if there are flags. - newLookup[publicName] = - inputFlags !== InputFlags.None ? [minifiedKey, inputFlags] : minifiedKey; - declaredInputs[publicName] = declaredName as string; - } else { - newLookup[publicName] = minifiedKey; - } + newLookup[publicName] = [minifiedKey, inputFlags, transform]; + declaredInputs[publicName] = declaredName as string; + } + } + return newLookup; +} + +function parseAndConvertOutputsForDefinition( + obj: DirectiveDefinition['outputs'], +): Record { + if (obj == null) return EMPTY_OBJ as any; + const newLookup: any = {}; + for (const minifiedKey in obj) { + if (obj.hasOwnProperty(minifiedKey)) { + newLookup[obj[minifiedKey]!] = minifiedKey; } } return newLookup; @@ -632,7 +637,6 @@ function getNgDirectiveDef(directiveDefinition: DirectiveDefinition): Dire hostAttrs: directiveDefinition.hostAttrs || null, contentQueries: directiveDefinition.contentQueries || null, declaredInputs: declaredInputs, - inputTransforms: null, inputConfig: directiveDefinition.inputs || EMPTY_OBJ, exportAs: directiveDefinition.exportAs || null, standalone: directiveDefinition.standalone ?? true, @@ -643,8 +647,8 @@ function getNgDirectiveDef(directiveDefinition: DirectiveDefinition): Dire setInput: null, findHostDirectiveDefs: null, hostDirectives: null, - inputs: parseAndConvertBindingsForDefinition(directiveDefinition.inputs, declaredInputs), - outputs: parseAndConvertBindingsForDefinition(directiveDefinition.outputs), + inputs: parseAndConvertInputsForDefinition(directiveDefinition.inputs, declaredInputs), + outputs: parseAndConvertOutputsForDefinition(directiveDefinition.outputs), debugInfo: null, }; } @@ -750,7 +754,13 @@ function getComponentId(componentDef: ComponentDef): string { const compId = 'c' + hash; - if (typeof ngDevMode === 'undefined' || ngDevMode) { + if ( + (typeof ngDevMode === 'undefined' || ngDevMode) && + // Skip the check on the server since we can't guarantee the same component instance between + // requests. Note that we can't use DI to check if we're on the server, because the component + // hasn't been instantiated yet. + (typeof ngServerMode === 'undefined' || !ngServerMode) + ) { if (GENERATED_COMP_IDS.has(compId)) { const previousCompDefType = GENERATED_COMP_IDS.get(compId)!; if (previousCompDefType !== componentDef.type) { diff --git a/packages/core/src/render3/di.ts b/packages/core/src/render3/di.ts index 5fc171f34c1d..4f1c0f568bac 100644 --- a/packages/core/src/render3/di.ts +++ b/packages/core/src/render3/di.ts @@ -47,7 +47,7 @@ import { TNodeProviderIndexes, TNodeType, } from './interfaces/node'; -import {isComponentDef, isComponentHost} from './interfaces/type_checks'; +import {isComponentDef, isComponentHost, isRootView} from './interfaces/type_checks'; import { DECLARATION_COMPONENT_VIEW, DECLARATION_VIEW, @@ -958,7 +958,7 @@ function lookupTokenUsingEmbeddedInjector( currentTNode !== null && currentLView !== null && currentLView[FLAGS] & LViewFlags.HasEmbeddedViewInjector && - !(currentLView[FLAGS] & LViewFlags.IsRoot) + !isRootView(currentLView) ) { ngDevMode && assertTNodeForLView(currentTNode, currentLView); diff --git a/packages/core/src/render3/dom_node_manipulation.ts b/packages/core/src/render3/dom_node_manipulation.ts new file mode 100644 index 000000000000..c6c87946eb25 --- /dev/null +++ b/packages/core/src/render3/dom_node_manipulation.ts @@ -0,0 +1,158 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {Renderer} from './interfaces/renderer'; +import {RComment, RElement, RNode, RText} from './interfaces/renderer_dom'; +import {escapeCommentText} from '../util/dom'; +import {assertDefined, assertString} from '../util/assert'; +import {setUpAttributes} from './util/attrs_utils'; +import {TNode} from './interfaces/node'; + +export function createTextNode(renderer: Renderer, value: string): RText { + ngDevMode && ngDevMode.rendererCreateTextNode++; + ngDevMode && ngDevMode.rendererSetText++; + return renderer.createText(value); +} + +export function updateTextNode(renderer: Renderer, rNode: RText, value: string): void { + ngDevMode && ngDevMode.rendererSetText++; + renderer.setValue(rNode, value); +} + +export function createCommentNode(renderer: Renderer, value: string): RComment { + ngDevMode && ngDevMode.rendererCreateComment++; + return renderer.createComment(escapeCommentText(value)); +} + +/** + * Creates a native element from a tag name, using a renderer. + * @param renderer A renderer to use + * @param name the tag name + * @param namespace Optional namespace for element. + * @returns the element created + */ +export function createElementNode( + renderer: Renderer, + name: string, + namespace: string | null, +): RElement { + ngDevMode && ngDevMode.rendererCreateElement++; + return renderer.createElement(name, namespace); +} + +/** + * Inserts a native node before another native node for a given parent. + * This is a utility function that can be used when native nodes were determined. + */ +export function nativeInsertBefore( + renderer: Renderer, + parent: RElement, + child: RNode, + beforeNode: RNode | null, + isMove: boolean, +): void { + ngDevMode && ngDevMode.rendererInsertBefore++; + renderer.insertBefore(parent, child, beforeNode, isMove); +} + +export function nativeAppendChild(renderer: Renderer, parent: RElement, child: RNode): void { + ngDevMode && ngDevMode.rendererAppendChild++; + ngDevMode && assertDefined(parent, 'parent node must be defined'); + renderer.appendChild(parent, child); +} + +export function nativeAppendOrInsertBefore( + renderer: Renderer, + parent: RElement, + child: RNode, + beforeNode: RNode | null, + isMove: boolean, +) { + if (beforeNode !== null) { + nativeInsertBefore(renderer, parent, child, beforeNode, isMove); + } else { + nativeAppendChild(renderer, parent, child); + } +} + +/** + * Removes a native node itself using a given renderer. To remove the node we are looking up its + * parent from the native tree as not all platforms / browsers support the equivalent of + * node.remove(). + * + * @param renderer A renderer to be used + * @param rNode The native node that should be removed + * @param isHostElement A flag indicating if a node to be removed is a host of a component. + */ +export function nativeRemoveNode(renderer: Renderer, rNode: RNode, isHostElement?: boolean): void { + ngDevMode && ngDevMode.rendererRemoveNode++; + renderer.removeChild(null, rNode, isHostElement); +} + +/** + * Clears the contents of a given RElement. + * + * @param rElement the native RElement to be cleared + */ +export function clearElementContents(rElement: RElement): void { + rElement.textContent = ''; +} + +/** + * Write `cssText` to `RElement`. + * + * This function does direct write without any reconciliation. Used for writing initial values, so + * that static styling values do not pull in the style parser. + * + * @param renderer Renderer to use + * @param element The element which needs to be updated. + * @param newValue The new class list to write. + */ +function writeDirectStyle(renderer: Renderer, element: RElement, newValue: string) { + ngDevMode && assertString(newValue, "'newValue' should be a string"); + renderer.setAttribute(element, 'style', newValue); + ngDevMode && ngDevMode.rendererSetStyle++; +} + +/** + * Write `className` to `RElement`. + * + * This function does direct write without any reconciliation. Used for writing initial values, so + * that static styling values do not pull in the style parser. + * + * @param renderer Renderer to use + * @param element The element which needs to be updated. + * @param newValue The new class list to write. + */ +function writeDirectClass(renderer: Renderer, element: RElement, newValue: string) { + ngDevMode && assertString(newValue, "'newValue' should be a string"); + if (newValue === '') { + // There are tests in `google3` which expect `element.getAttribute('class')` to be `null`. + renderer.removeAttribute(element, 'class'); + } else { + renderer.setAttribute(element, 'class', newValue); + } + ngDevMode && ngDevMode.rendererSetClassName++; +} + +/** Sets up the static DOM attributes on an `RNode`. */ +export function setupStaticAttributes(renderer: Renderer, element: RElement, tNode: TNode) { + const {mergedAttrs, classes, styles} = tNode; + + if (mergedAttrs !== null) { + setUpAttributes(renderer, element, mergedAttrs); + } + + if (classes !== null) { + writeDirectClass(renderer, element, classes); + } + + if (styles !== null) { + writeDirectStyle(renderer, element, styles); + } +} diff --git a/packages/core/src/render3/errors_di.ts b/packages/core/src/render3/errors_di.ts index 0762a4fff764..866dd2e6f3c2 100644 --- a/packages/core/src/render3/errors_di.ts +++ b/packages/core/src/render3/errors_di.ts @@ -16,10 +16,11 @@ import {stringifyForError} from './util/stringify_utils'; /** Called when directives inject each other (creating a circular dependency) */ export function throwCyclicDependencyError(token: string, path?: string[]): never { - const depPath = path ? `. Dependency path: ${path.join(' > ')} > ${token}` : ''; throw new RuntimeError( RuntimeErrorCode.CYCLIC_DI_DEPENDENCY, - ngDevMode ? `Circular dependency in DI detected for ${token}${depPath}` : token, + ngDevMode + ? `Circular dependency in DI detected for ${token}${path ? `. Dependency path: ${path.join(' > ')} > ${token}` : ''}` + : token, ); } diff --git a/packages/core/src/render3/features/external_styles_feature.ts b/packages/core/src/render3/features/external_styles_feature.ts index 0df3191e903a..b6759f5199f5 100644 --- a/packages/core/src/render3/features/external_styles_feature.ts +++ b/packages/core/src/render3/features/external_styles_feature.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ComponentDef, ComponentDefFeature} from '../interfaces/definition'; diff --git a/packages/core/src/render3/features/inherit_definition_feature.ts b/packages/core/src/render3/features/inherit_definition_feature.ts index 78a14ebb74a7..968546850dee 100644 --- a/packages/core/src/render3/features/inherit_definition_feature.ts +++ b/packages/core/src/render3/features/inherit_definition_feature.ts @@ -71,7 +71,6 @@ export function ɵɵInheritDefinitionFeature( // would've justified object creation. Unwrap them if necessary. const writeableDef = definition as WritableDef; writeableDef.inputs = maybeUnwrapEmpty(definition.inputs); - writeableDef.inputTransforms = maybeUnwrapEmpty(definition.inputTransforms); writeableDef.declaredInputs = maybeUnwrapEmpty(definition.declaredInputs); writeableDef.outputs = maybeUnwrapEmpty(definition.outputs); @@ -134,26 +133,12 @@ function mergeInputsWithTransforms(target: WritableDef, source: DirectiveDef< if (target.inputs.hasOwnProperty(key)) { continue; } + const value = source.inputs[key]; - if (value === undefined) { - continue; - } - target.inputs[key] = value; - target.declaredInputs[key] = source.declaredInputs[key]; - - // If the input is inherited, and we have a transform for it, we also inherit it. - // Note that transforms should not be inherited if the input has its own metadata - // in the `source` directive itself already (i.e. the input is re-declared/overridden). - if (source.inputTransforms !== null) { - // Note: transforms are stored with their minified names. - // Perf: only access the minified name when there are source transforms. - const minifiedName = Array.isArray(value) ? value[0] : value; - if (!source.inputTransforms.hasOwnProperty(minifiedName)) { - continue; - } - target.inputTransforms ??= {}; - target.inputTransforms[minifiedName] = source.inputTransforms[minifiedName]; + if (value !== undefined) { + target.inputs[key] = value; + target.declaredInputs[key] = source.declaredInputs[key]; } } } diff --git a/packages/core/src/render3/features/input_transforms_feature.ts b/packages/core/src/render3/features/input_transforms_feature.ts deleted file mode 100644 index 76aea41f1d18..000000000000 --- a/packages/core/src/render3/features/input_transforms_feature.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {Writable} from '../../interface/type'; -import {DirectiveDef, InputTransformFunction} from '../interfaces/definition'; - -/** - * Decorates the directive definition with support for input transform functions. - * - * If the directive uses inheritance, the feature should be included before the - * `InheritDefinitionFeature` to ensure that the `inputTransforms` field is populated. - * - * @codeGenApi - */ -export function ɵɵInputTransformsFeature(definition: DirectiveDef): void { - const inputs = definition.inputConfig; - const inputTransforms: Record = {}; - - for (const minifiedKey in inputs) { - if (inputs.hasOwnProperty(minifiedKey)) { - // Note: the private names are used for the keys, rather than the public ones, because public - // names can be re-aliased in host directives which would invalidate the lookup. - const value = inputs[minifiedKey]; - if (Array.isArray(value) && value[3]) { - inputTransforms[minifiedKey] = value[3]; - } - } - } - - (definition as Writable>).inputTransforms = inputTransforms; -} diff --git a/packages/core/src/render3/hmr.ts b/packages/core/src/render3/hmr.ts index 274933a6b37c..527f46415d00 100644 --- a/packages/core/src/render3/hmr.ts +++ b/packages/core/src/render3/hmr.ts @@ -7,40 +7,50 @@ */ import {Type} from '../interface/type'; -import {assertDefined} from '../util/assert'; +import {assertDefined, assertEqual, assertNotEqual} from '../util/assert'; import {assertLView} from './assert'; import {getComponentDef} from './def_getters'; import {assertComponentDef} from './errors'; import {refreshView} from './instructions/change_detection'; import {renderView} from './instructions/render'; -import { - createLView, - getInitialLViewFlagsFromDef, - getOrCreateComponentTView, -} from './instructions/shared'; import {CONTAINER_HEADER_OFFSET} from './interfaces/container'; import {ComponentDef} from './interfaces/definition'; import {getTrackedLViews} from './interfaces/lview_tracking'; import {isTNodeShape, TElementNode, TNodeFlags, TNodeType} from './interfaces/node'; -import {isLContainer, isLView} from './interfaces/type_checks'; +import {isLContainer, isLView, isRootView} from './interfaces/type_checks'; import { CHILD_HEAD, CHILD_TAIL, CONTEXT, ENVIRONMENT, - FLAGS, HEADER_OFFSET, HOST, + INJECTOR, LView, - LViewFlags, NEXT, PARENT, + RENDERER, T_HOST, TVIEW, } from './interfaces/view'; import {assertTNodeType} from './node_assert'; import {destroyLView, removeViewFromDOM} from './node_manipulation'; import {RendererFactory} from './interfaces/renderer'; +import {NgZone} from '../zone'; +import {ViewEncapsulation} from '../metadata/view'; +import {NG_COMP_DEF} from './fields'; +import { + createLView, + getInitialLViewFlagsFromDef, + getOrCreateComponentTView, +} from './view/construction'; + +/** Represents `import.meta` plus some information that's not in the built-in types. */ +type ImportMetaExtended = ImportMeta & { + hot?: { + send?: (name: string, payload: unknown) => void; + }; +}; /** * Replaces the metadata of a component type and re-renders all live instances of the component. @@ -48,6 +58,10 @@ import {RendererFactory} from './interfaces/renderer'; * @param applyMetadata Callback that will apply a new set of metadata on the `type` when invoked. * @param environment Syntehtic namespace imports that need to be passed along to the callback. * @param locals Local symbols from the source location that have to be exposed to the callback. + * @param importMeta `import.meta` from the call site of the replacement function. Optional since + * it isn't used internally. + * @param id ID to the class being replaced. **Not** the same as the component definition ID. + * Optional since the ID might not be available internally. * @codeGenApi */ export function ɵɵreplaceMetadata( @@ -55,9 +69,11 @@ export function ɵɵreplaceMetadata( applyMetadata: (...args: [Type, unknown[], ...unknown[]]) => void, namespaces: unknown[], locals: unknown[], + importMeta: ImportMetaExtended | null = null, + id: string | null = null, ) { ngDevMode && assertComponentDef(type); - const oldDef = getComponentDef(type)!; + const currentDef = getComponentDef(type)!; // The reason `applyMetadata` is a callback that is invoked (almost) immediately is because // the compiler usually produces more code than just the component definition, e.g. there @@ -66,6 +82,13 @@ export function ɵɵreplaceMetadata( // them at the right time. applyMetadata.apply(null, [type, namespaces, ...locals]); + const {newDef, oldDef} = mergeWithExistingDefinition(currentDef, getComponentDef(type)!); + + // TODO(crisbeto): the `applyMetadata` call above will replace the definition on the type. + // Ideally we should adjust the compiler output so the metadata is returned, however that'll + // require some internal changes. We re-add the metadata here manually. + (type as any)[NG_COMP_DEF] = newDef; + // If a `tView` hasn't been created yet, it means that this component hasn't been instantianted // before. In this case there's nothing left for us to do aside from patching it in. if (oldDef.tView) { @@ -73,22 +96,67 @@ export function ɵɵreplaceMetadata( for (const root of trackedViews) { // Note: we have the additional check, because `IsRoot` can also indicate // a component created through something like `createComponent`. - if (root[FLAGS] & LViewFlags.IsRoot && root[PARENT] === null) { - recreateMatchingLViews(oldDef, root); + if (isRootView(root) && root[PARENT] === null) { + recreateMatchingLViews(importMeta, id, newDef, oldDef, root); } } } } +/** + * Merges two component definitions while preseving the original one in place. + * @param currentDef Definition that should receive the new metadata. + * @param newDef Source of the new metadata. + */ +function mergeWithExistingDefinition( + currentDef: ComponentDef, + newDef: ComponentDef, +) { + // Clone the current definition since we reference its original data further + // down in the replacement process (e.g. when destroying the renderer). + const clone = {...currentDef}; + + // Assign the new metadata in place while preserving the object literal. It's important to + // Keep the object in place, because there can be references to it, for example in the + // `directiveDefs` of another definition. + const replacement = Object.assign(currentDef, newDef, { + // We need to keep the existing directive and pipe defs, because they can get patched on + // by a call to `setComponentScope` from a module file. That call won't make it into the + // HMR replacement function, because it lives in an entirely different file. + directiveDefs: clone.directiveDefs, + pipeDefs: clone.pipeDefs, + + // Preserve the old `setInput` function, because it has some state. + // This is fine, because the component instance is preserved as well. + setInput: clone.setInput, + + // Externally this is redundant since we redeclare the definition using the original type. + // Internally we may receive a definition with an alternate, but identical, type so we have + // to ensure that the original one is preserved. + type: clone.type, + }); + + ngDevMode && assertEqual(replacement, currentDef, 'Expected definition to be merged in place'); + return {newDef: replacement, oldDef: clone}; +} + /** * Finds all LViews matching a specific component definition and recreates them. - * @param def Component definition to search for. + * @param importMeta `import.meta` information. + * @param id HMR ID of the component. + * @param oldDef Component definition to search for. * @param rootLView View from which to start the search. */ -function recreateMatchingLViews(def: ComponentDef, rootLView: LView): void { +function recreateMatchingLViews( + importMeta: ImportMetaExtended | null, + id: string | null, + newDef: ComponentDef, + oldDef: ComponentDef, + rootLView: LView, +): void { ngDevMode && assertDefined( - def.tView, + oldDef.tView, 'Expected a component definition that has been instantiated at least once', ); @@ -96,9 +164,9 @@ function recreateMatchingLViews(def: ComponentDef, rootLView: LView): v // Use `tView` to match the LView since `instanceof` can // produce false positives when using inheritance. - if (tView === def.tView) { - ngDevMode && assertComponentDef(def.type); - recreateLView(getComponentDef(def.type)!, rootLView); + if (tView === oldDef.tView) { + ngDevMode && assertComponentDef(oldDef.type); + recreateLView(importMeta, id, newDef, oldDef, rootLView); return; } @@ -106,11 +174,16 @@ function recreateMatchingLViews(def: ComponentDef, rootLView: LView): v const current = rootLView[i]; if (isLContainer(current)) { - for (let i = CONTAINER_HEADER_OFFSET; i < current.length; i++) { - recreateMatchingLViews(def, current[i]); + // The host can be an LView if a component is injecting `ViewContainerRef`. + if (isLView(current[HOST])) { + recreateMatchingLViews(importMeta, id, newDef, oldDef, current[HOST]); + } + + for (let j = CONTAINER_HEADER_OFFSET; j < current.length; j++) { + recreateMatchingLViews(importMeta, id, newDef, oldDef, current[j]); } } else if (isLView(current)) { - recreateMatchingLViews(def, current); + recreateMatchingLViews(importMeta, id, newDef, oldDef, current); } } } @@ -131,63 +204,122 @@ function clearRendererCache(factory: RendererFactory, def: ComponentDef /** * Recreates an LView in-place from a new component definition. - * @param def Definition from which to recreate the view. + * @param importMeta `import.meta` information. + * @param id HMR ID for the component. + * @param newDef Definition from which to recreate the view. + * @param oldDef Previous component definition being swapped out. * @param lView View to be recreated. */ -function recreateLView(def: ComponentDef, lView: LView): void { +function recreateLView( + importMeta: ImportMetaExtended | null, + id: string | null, + newDef: ComponentDef, + oldDef: ComponentDef, + lView: LView, +): void { const instance = lView[CONTEXT]; - const host = lView[HOST]!; + let host = lView[HOST]! as HTMLElement; // In theory the parent can also be an LContainer, but it appears like that's // only the case for embedded views which we won't be replacing here. const parentLView = lView[PARENT] as LView; ngDevMode && assertLView(parentLView); const tNode = lView[T_HOST] as TElementNode; ngDevMode && assertTNodeType(tNode, TNodeType.Element); + ngDevMode && assertNotEqual(newDef, oldDef, 'Expected different component definition'); + const zone = lView[INJECTOR].get(NgZone, null); + const recreate = () => { + // If we're recreating a component with shadow DOM encapsulation, it will have attached a + // shadow root. The browser will throw if we attempt to attach another one and there's no way + // to detach it. Our only option is to make a clone only of the root node, replace the node + // with the clone and use it for the newly-created LView. + if (oldDef.encapsulation === ViewEncapsulation.ShadowDom) { + const newHost = host.cloneNode(false) as HTMLElement; + host.replaceWith(newHost); + host = newHost; + } + + // Recreate the TView since the template might've changed. + const newTView = getOrCreateComponentTView(newDef); + + // Create a new LView from the new TView, but reusing the existing TNode and DOM node. + const newLView = createLView( + parentLView, + newTView, + instance, + getInitialLViewFlagsFromDef(newDef), + host, + tNode, + null, + null, // The renderer will be created a bit further down once the old one is destroyed. + null, + null, + null, + ); + + // Detach the LView from its current place in the tree so we don't + // start traversing any siblings and modifying their structure. + replaceLViewInTree(parentLView, lView, newLView, tNode.index); + + // Destroy the detached LView. + destroyLView(lView[TVIEW], lView); + + // Always force the creation of a new renderer to ensure state captured during construction + // stays consistent with the new component definition by clearing any old ached factories. + const rendererFactory = lView[ENVIRONMENT].rendererFactory; + clearRendererCache(rendererFactory, oldDef); + + // Patch a brand-new renderer onto the new view only after the old + // view is destroyed so that the runtime doesn't try to reuse it. + newLView[RENDERER] = rendererFactory.createRenderer(host, newDef); + + // Remove the nodes associated with the destroyed LView. This removes the + // descendants, but not the host which we want to stay in place. + removeViewFromDOM(lView[TVIEW], lView); + + // Reset the content projection state of the TNode before the first render. + // Note that this has to happen after the LView has been destroyed or we + // risk some projected nodes not being removed correctly. + resetProjectionState(tNode); + + // Creation pass for the new view. + renderView(newTView, newLView, instance); - // Recreate the TView since the template might've changed. - const newTView = getOrCreateComponentTView(def); - - // Always force the creation of a new renderer to ensure state captured during construction - // stays consistent with the new component definition by clearing any old cached factories. - const rendererFactory = lView[ENVIRONMENT].rendererFactory; - clearRendererCache(rendererFactory, def); - - // Create a new LView from the new TView, but reusing the existing TNode and DOM node. - const newLView = createLView( - parentLView, - newTView, - instance, - getInitialLViewFlagsFromDef(def), - host, - tNode, - null, - rendererFactory.createRenderer(host, def), - null, - null, - null, - ); - - // Detach the LView from its current place in the tree so we don't - // start traversing any siblings and modifying their structure. - replaceLViewInTree(parentLView, lView, newLView, tNode.index); - - // Destroy the detached LView. - destroyLView(lView[TVIEW], lView); - - // Remove the nodes associated with the destroyed LView. This removes the - // descendants, but not the host which we want to stay in place. - removeViewFromDOM(lView[TVIEW], lView); - - // Reset the content projection state of the TNode before the first render. - // Note that this has to happen after the LView has been destroyed or we - // risk some projected nodes not being removed correctly. - resetProjectionState(tNode); - - // Creation pass for the new view. - renderView(newTView, newLView, instance); - - // Update pass for the new view. - refreshView(newTView, newLView, newTView.template, instance); + // Update pass for the new view. + refreshView(newTView, newLView, newTView.template, instance); + }; + + // The callback isn't guaranteed to be inside the Zone so we need to bring it in ourselves. + if (zone === null) { + executeWithInvalidateFallback(importMeta, id, recreate); + } else { + zone.run(() => executeWithInvalidateFallback(importMeta, id, recreate)); + } +} + +/** + * Runs an HMR-related function and falls back to + * invalidating the HMR data if it throws an error. + */ +function executeWithInvalidateFallback( + importMeta: ImportMetaExtended | null, + id: string | null, + callback: () => void, +) { + try { + callback(); + } catch (e) { + const error = e as {message?: string; stack?: string}; + + // If we have all the necessary information and APIs to send off the invalidation + // request, send it before rethrowing so the dev server can decide what to do. + if (id !== null && error.message) { + const toLog = error.message + (error.stack ? '\n' + error.stack : ''); + importMeta?.hot?.send?.('angular:invalidate', {id, message: toLog, error: true}); + } + + // Throw the error in case the page doesn't get refreshed. + throw e; + } } /** diff --git a/packages/core/src/render3/i18n/i18n_apply.ts b/packages/core/src/render3/i18n/i18n_apply.ts index 93c4a47981ba..09245a957059 100644 --- a/packages/core/src/render3/i18n/i18n_apply.ts +++ b/packages/core/src/render3/i18n/i18n_apply.ts @@ -44,10 +44,9 @@ import { createElementNode, createTextNode, nativeInsertBefore, - nativeParentNode, nativeRemoveNode, updateTextNode, -} from '../node_manipulation'; +} from '../dom_node_manipulation'; import { getBindingIndex, isInSkipHydrationBlock, @@ -272,7 +271,7 @@ export function applyMutableOpCodes( // must insert into the root. (Only subsequent operations can insert into a dynamic // parent) rootIdx = parentIdx; - rootRNode = nativeParentNode(renderer, anchorRNode); + rootRNode = renderer.parentNode(anchorRNode); } let insertInFrontOf: RNode | null; let parentRNode: RElement | null; diff --git a/packages/core/src/render3/i18n/i18n_parse.ts b/packages/core/src/render3/i18n/i18n_parse.ts index 713c977d2f58..6361cdfe213d 100644 --- a/packages/core/src/render3/i18n/i18n_parse.ts +++ b/packages/core/src/render3/i18n/i18n_parse.ts @@ -26,7 +26,7 @@ import { } from '../../util/assert'; import {CharCode} from '../../util/char_code'; import {loadIcuContainerVisitor} from '../instructions/i18n_icu_container_visitor'; -import {allocExpando, createTNodeAtIndex} from '../instructions/shared'; + import {getDocument} from '../interfaces/document'; import { ELEMENT_MARKER, @@ -68,6 +68,8 @@ import { setTIcu, setTNodeInsertBeforeIndex, } from './i18n_util'; +import {createTNodeAtIndex} from '../tnode_manipulation'; +import {allocExpando} from '../view/construction'; const BINDING_REGEXP = /�(\d+):?\d*�/gi; const ICU_REGEXP = /({\s*�\d+:?\d*�\s*,\s*\S{6}\s*,[\s\S]*})/gi; diff --git a/packages/core/src/render3/i18n/i18n_util.ts b/packages/core/src/render3/i18n/i18n_util.ts index 6a6e6079bc33..486c26ce1105 100644 --- a/packages/core/src/render3/i18n/i18n_util.ts +++ b/packages/core/src/render3/i18n/i18n_util.ts @@ -13,13 +13,13 @@ import { throwError, } from '../../util/assert'; import {assertTIcu, assertTNode} from '../assert'; -import {createTNodeAtIndex} from '../instructions/shared'; import {IcuCreateOpCode, TIcu} from '../interfaces/i18n'; import {TIcuContainerNode, TNode, TNodeType} from '../interfaces/node'; import {LView, TView} from '../interfaces/view'; import {assertTNodeType} from '../node_assert'; import {setI18nHandling} from '../node_manipulation'; import {getInsertInFrontOfRNodeWithI18n, processI18nInsertBefore} from '../node_manipulation_i18n'; +import {createTNodeAtIndex} from '../tnode_manipulation'; import {addTNodeAndUpdateInsertBeforeIndex} from './i18n_insert_before_index'; diff --git a/packages/core/src/render3/index.ts b/packages/core/src/render3/index.ts index 6b0a2b1b7067..2f67313fa04f 100644 --- a/packages/core/src/render3/index.ts +++ b/packages/core/src/render3/index.ts @@ -5,12 +5,10 @@ * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.dev/license */ -import {LifecycleHooksFeature} from './component_ref'; import {ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdefineNgModule, ɵɵdefinePipe} from './definition'; import {ɵɵCopyDefinitionFeature} from './features/copy_definition_feature'; import {ɵɵHostDirectivesFeature} from './features/host_directives_feature'; import {ɵɵInheritDefinitionFeature} from './features/inherit_definition_feature'; -import {ɵɵInputTransformsFeature} from './features/input_transforms_feature'; import {ɵɵNgOnChangesFeature} from './features/ng_onchanges_feature'; import {ɵɵProvidersFeature} from './features/providers_feature'; import {ɵɵExternalStylesFeature} from './features/external_styles_feature'; @@ -235,7 +233,6 @@ export { getDirectives, getHostElement, getRenderedText, - LifecycleHooksFeature, PipeDef, ɵɵComponentDeclaration, ɵɵCopyDefinitionFeature, @@ -248,7 +245,6 @@ export { ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵInjectorDeclaration, - ɵɵInputTransformsFeature, ɵɵNgModuleDeclaration, ɵɵNgOnChangesFeature, ɵɵPipeDeclaration, diff --git a/packages/core/src/render3/instructions/change_detection.ts b/packages/core/src/render3/instructions/change_detection.ts index 05b227fda383..406736d6315a 100644 --- a/packages/core/src/render3/instructions/change_detection.ts +++ b/packages/core/src/render3/instructions/change_detection.ts @@ -20,7 +20,7 @@ import {assertDefined, assertEqual} from '../../util/assert'; import {addAfterRenderSequencesForView} from '../after_render/view'; import {executeCheckHooks, executeInitAndCheckHooks, incrementInitPhaseFlags} from '../hooks'; import {CONTAINER_HEADER_OFFSET, LContainerFlags, MOVED_VIEWS} from '../interfaces/container'; -import {ComponentTemplate, RenderFlags} from '../interfaces/definition'; +import {ComponentTemplate, HostBindingsFunction, RenderFlags} from '../interfaces/definition'; import { CONTEXT, EFFECTS_TO_SCHEDULE, @@ -48,8 +48,10 @@ import { isRefreshingViews, leaveView, setBindingIndex, + setBindingRootForHostBindings, setIsInCheckNoChangesMode, setIsRefreshingViews, + setSelectedIndex, } from '../state'; import {getFirstLContainer, getNextLContainer} from '../util/view_traversal_utils'; import { @@ -63,14 +65,11 @@ import { } from '../util/view_utils'; import {isDestroyed} from '../interfaces/type_checks'; +import {profiler} from '../profiler'; +import {ProfilerEvent} from '../profiler_types'; +import {executeViewQueryFn, refreshContentQueries} from '../queries/query_execution'; import {runEffectsInView} from '../reactivity/view_effect_runner'; -import { - executeTemplate, - executeViewQueryFn, - handleError, - processHostBindingOpCodes, - refreshContentQueries, -} from './shared'; +import {executeTemplate, handleError} from './shared'; /** * The maximum number of times the change detection traversal will rerun before throwing an error. @@ -431,8 +430,12 @@ function detectChangesInComponent( mode: ChangeDetectionMode, ): void { ngDevMode && assertEqual(isCreationMode(hostLView), false, 'Should be run in update mode'); + profiler(ProfilerEvent.ComponentStart); + const componentView = getComponentLViewByIndex(componentHostIdx, hostLView); detectChangesInViewIfAttached(componentView, mode); + + profiler(ProfilerEvent.ComponentEnd, componentView[CONTEXT] as any as {}); } /** @@ -522,3 +525,38 @@ function detectChangesInChildComponents( detectChangesInComponent(hostLView, components[i], mode); } } + +/** + * Invoke `HostBindingsFunction`s for view. + * + * This methods executes `TView.hostBindingOpCodes`. It is used to execute the + * `HostBindingsFunction`s associated with the current `LView`. + * + * @param tView Current `TView`. + * @param lView Current `LView`. + */ +function processHostBindingOpCodes(tView: TView, lView: LView): void { + const hostBindingOpCodes = tView.hostBindingOpCodes; + if (hostBindingOpCodes === null) return; + try { + for (let i = 0; i < hostBindingOpCodes.length; i++) { + const opCode = hostBindingOpCodes[i] as number; + if (opCode < 0) { + // Negative numbers are element indexes. + setSelectedIndex(~opCode); + } else { + // Positive numbers are NumberTuple which store bindingRootIndex and directiveIndex. + const directiveIdx = opCode; + const bindingRootIndx = hostBindingOpCodes[++i] as number; + const hostBindingFn = hostBindingOpCodes[++i] as HostBindingsFunction; + setBindingRootForHostBindings(bindingRootIndx, directiveIdx); + const context = lView[directiveIdx]; + profiler(ProfilerEvent.HostBindingsUpdateStart, context); + hostBindingFn(RenderFlags.Update, context); + profiler(ProfilerEvent.HostBindingsUpdateEnd, context); + } + } + } finally { + setSelectedIndex(-1); + } +} diff --git a/packages/core/src/render3/instructions/control_flow.ts b/packages/core/src/render3/instructions/control_flow.ts index f2860b6d4e05..733280a8d412 100644 --- a/packages/core/src/render3/instructions/control_flow.ts +++ b/packages/core/src/render3/instructions/control_flow.ts @@ -29,19 +29,19 @@ import { TView, } from '../interfaces/view'; import {LiveCollection, reconcile} from '../list_reconciliation'; -import {destroyLView, detachView} from '../node_manipulation'; +import {destroyLView} from '../node_manipulation'; import {getLView, getSelectedIndex, getTView, nextBindingIndex} from '../state'; import {NO_CHANGE} from '../tokens'; import {getConstant, getTNode} from '../util/view_utils'; +import {createAndRenderEmbeddedLView, shouldAddViewToDom} from '../view_manipulation'; + +import {declareTemplate} from './template'; import { addLViewToLContainer, - createAndRenderEmbeddedLView, + detachView, getLViewFromLContainer, removeLViewFromLContainer, - shouldAddViewToDom, -} from '../view_manipulation'; - -import {declareTemplate} from './template'; +} from '../view/container'; /** * The conditional instruction represents the basic building block on the runtime side to support diff --git a/packages/core/src/render3/instructions/element.ts b/packages/core/src/render3/instructions/element.ts index 45696b1fa778..839342e133a2 100644 --- a/packages/core/src/render3/instructions/element.ts +++ b/packages/core/src/render3/instructions/element.ts @@ -25,33 +25,26 @@ import { } from '../../hydration/utils'; import {isDetachedByI18n} from '../../i18n/utils'; import {assertDefined, assertEqual, assertIndexInRange} from '../../util/assert'; -import {assertFirstCreatePass, assertHasParent} from '../assert'; +import {assertHasParent} from '../assert'; import {attachPatchData} from '../context_discovery'; -import {registerPostOrderHooks} from '../hooks'; import { - hasClassInput, - hasStyleInput, - TAttributes, - TElementNode, - TNode, - TNodeFlags, - TNodeType, -} from '../interfaces/node'; + clearElementContents, + createElementNode, + setupStaticAttributes, +} from '../dom_node_manipulation'; +import {hasClassInput, hasStyleInput, TElementNode, TNode, TNodeType} from '../interfaces/node'; import {Renderer} from '../interfaces/renderer'; import {RElement} from '../interfaces/renderer_dom'; -import {isComponentHost, isContentQueryHost, isDirectiveHost} from '../interfaces/type_checks'; +import {isComponentHost, isDirectiveHost} from '../interfaces/type_checks'; import {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView} from '../interfaces/view'; import {assertTNodeType} from '../node_assert'; -import { - appendChild, - clearElementContents, - createElementNode, - setupStaticAttributes, -} from '../node_manipulation'; +import {appendChild} from '../node_manipulation'; +import {executeContentQueries} from '../queries/query_execution'; import { decreaseElementDepthCount, enterSkipHydrationBlock, getBindingIndex, + getBindingsEnabled, getCurrentTNode, getElementDepthCount, getLView, @@ -67,51 +60,16 @@ import { setCurrentTNodeAsNotParent, wasLastNodeCreated, } from '../state'; -import {computeStaticStyling} from '../styling/static_styling'; -import {getConstant} from '../util/view_utils'; +import {elementEndFirstCreatePass, elementStartFirstCreatePass} from '../view/elements'; import {validateElementIsKnown} from './element_validation'; import {setDirectiveInputsWhichShadowsStyling} from './property'; import { createDirectivesInstances, - executeContentQueries, - getOrCreateTNode, - resolveDirectives, + findDirectiveDefMatches, saveResolvedLocalsInData, } from './shared'; -function elementStartFirstCreatePass( - index: number, - tView: TView, - lView: LView, - name: string, - attrsIndex?: number | null, - localRefsIndex?: number, -): TElementNode { - ngDevMode && assertFirstCreatePass(tView); - ngDevMode && ngDevMode.firstCreatePass++; - - const tViewConsts = tView.consts; - const attrs = getConstant(tViewConsts, attrsIndex); - const tNode = getOrCreateTNode(tView, index, TNodeType.Element, name, attrs); - - resolveDirectives(tView, lView, tNode, getConstant(tViewConsts, localRefsIndex)); - - if (tNode.attrs !== null) { - computeStaticStyling(tNode, tNode.attrs, false); - } - - if (tNode.mergedAttrs !== null) { - computeStaticStyling(tNode, tNode.mergedAttrs, true); - } - - if (tView.queries !== null) { - tView.queries.elementStart(tView, tNode); - } - - return tNode; -} - /** * Create DOM element. The instruction must later be followed by `elementEnd()` call. * @@ -147,7 +105,16 @@ export function ɵɵelementStart( const renderer = lView[RENDERER]; const tNode = tView.firstCreatePass - ? elementStartFirstCreatePass(adjustedIndex, tView, lView, name, attrsIndex, localRefsIndex) + ? elementStartFirstCreatePass( + adjustedIndex, + tView, + lView, + name, + findDirectiveDefMatches, + getBindingsEnabled(), + attrsIndex, + localRefsIndex, + ) : (tView.data[adjustedIndex] as TElementNode); const native = _locateOrCreateElementNode(tView, lView, tNode, renderer, name, index); @@ -171,7 +138,7 @@ export function ɵɵelementStart( // any immediate children of a component or template container must be pre-emptively // monkey-patched with the component view data so that the element can be inspected // later on using any element discovery utility methods (see `element_discovery.ts`) - if (getElementDepthCount() === 0) { + if (getElementDepthCount() === 0 || hasDirectives) { attachPatchData(native, lView); } increaseElementDepthCount(); @@ -214,10 +181,7 @@ export function ɵɵelementEnd(): typeof ɵɵelementEnd { const tView = getTView(); if (tView.firstCreatePass) { - registerPostOrderHooks(tView, currentTNode); - if (isContentQueryHost(currentTNode)) { - tView.queries!.elementEnd(currentTNode); - } + elementEndFirstCreatePass(tView, tNode); } if (tNode.classesWithoutHost != null && hasClassInput(tNode)) { diff --git a/packages/core/src/render3/instructions/element_container.ts b/packages/core/src/render3/instructions/element_container.ts index 4800c8c3ab55..db43d8a1a5cf 100644 --- a/packages/core/src/render3/instructions/element_container.ts +++ b/packages/core/src/render3/instructions/element_container.ts @@ -17,15 +17,18 @@ import {isDetachedByI18n} from '../../i18n/utils'; import {assertEqual, assertIndexInRange, assertNumber} from '../../util/assert'; import {assertHasParent} from '../assert'; import {attachPatchData} from '../context_discovery'; +import {createCommentNode} from '../dom_node_manipulation'; import {registerPostOrderHooks} from '../hooks'; import {TAttributes, TElementContainerNode, TNode, TNodeType} from '../interfaces/node'; import {RComment} from '../interfaces/renderer_dom'; import {isContentQueryHost, isDirectiveHost} from '../interfaces/type_checks'; import {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView} from '../interfaces/view'; import {assertTNodeType} from '../node_assert'; -import {appendChild, createCommentNode} from '../node_manipulation'; +import {appendChild} from '../node_manipulation'; +import {executeContentQueries} from '../queries/query_execution'; import { getBindingIndex, + getBindingsEnabled, getCurrentTNode, getLView, getTView, @@ -37,13 +40,14 @@ import { wasLastNodeCreated, } from '../state'; import {computeStaticStyling} from '../styling/static_styling'; +import {mergeHostAttrs} from '../util/attrs_utils'; import {getConstant} from '../util/view_utils'; +import {getOrCreateTNode} from '../tnode_manipulation'; +import {resolveDirectives} from '../view/directives'; import { createDirectivesInstances, - executeContentQueries, - getOrCreateTNode, - resolveDirectives, + findDirectiveDefMatches, saveResolvedLocalsInData, } from './shared'; @@ -67,7 +71,12 @@ function elementContainerStartFirstCreatePass( } const localRefs = getConstant(tViewConsts, localRefsIndex); - resolveDirectives(tView, lView, tNode, localRefs); + if (getBindingsEnabled()) { + resolveDirectives(tView, lView, tNode, localRefs, findDirectiveDefMatches); + } + + // Merge the template attrs last so that they have the highest priority. + tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs); if (tView.queries !== null) { tView.queries.elementStart(tView, tNode); diff --git a/packages/core/src/render3/instructions/i18n_icu_container_visitor.ts b/packages/core/src/render3/instructions/i18n_icu_container_visitor.ts index 993a7afc7e84..111a3a720458 100644 --- a/packages/core/src/render3/instructions/i18n_icu_container_visitor.ts +++ b/packages/core/src/render3/instructions/i18n_icu_container_visitor.ts @@ -74,7 +74,7 @@ export function loadIcuContainerVisitor() { * to determine which root belong to the ICU. * * Example of usage. - * ``` + * ```ts * const nextRNode = icuContainerIteratorStart(tIcuContainerNode, lView); * let rNode: RNode|null; * while(rNode = nextRNode()) { diff --git a/packages/core/src/render3/instructions/let_declaration.ts b/packages/core/src/render3/instructions/let_declaration.ts index 7b388a9932b7..77c16a845b05 100644 --- a/packages/core/src/render3/instructions/let_declaration.ts +++ b/packages/core/src/render3/instructions/let_declaration.ts @@ -11,8 +11,8 @@ import {performanceMarkFeature} from '../../util/performance'; import {TNodeType} from '../interfaces/node'; import {HEADER_OFFSET} from '../interfaces/view'; import {getContextLView, getLView, getSelectedIndex, getTView, setCurrentTNode} from '../state'; +import {getOrCreateTNode} from '../tnode_manipulation'; import {load} from '../util/view_utils'; -import {getOrCreateTNode} from './shared'; import {store} from './storage'; /** Object that indicates the value of a `@let` declaration that hasn't been initialized yet. */ diff --git a/packages/core/src/render3/instructions/listener.ts b/packages/core/src/render3/instructions/listener.ts index e4afa213be3e..7ad1869b5481 100644 --- a/packages/core/src/render3/instructions/listener.ts +++ b/packages/core/src/render3/instructions/listener.ts @@ -10,24 +10,26 @@ import {setActiveConsumer} from '@angular/core/primitives/signals'; import {NotificationSource} from '../../change_detection/scheduling/zoneless_scheduling'; import {assertIndexInRange} from '../../util/assert'; -import {NodeOutputBindings, TNode, TNodeType} from '../interfaces/node'; +import {TNode, TNodeType} from '../interfaces/node'; import {GlobalTargetResolver, Renderer} from '../interfaces/renderer'; import {RElement} from '../interfaces/renderer_dom'; -import {isDirectiveHost} from '../interfaces/type_checks'; +import {isComponentHost, isDirectiveHost} from '../interfaces/type_checks'; import {CLEANUP, CONTEXT, LView, RENDERER, TView} from '../interfaces/view'; import {assertTNodeType} from '../node_assert'; import {profiler} from '../profiler'; import {ProfilerEvent} from '../profiler_types'; import {getCurrentDirectiveDef, getCurrentTNode, getLView, getTView} from '../state'; -import {getComponentLViewByIndex, getNativeByTNode, unwrapRNode} from '../util/view_utils'; - -import {markViewDirty} from './mark_view_dirty'; import { + getComponentLViewByIndex, + getNativeByTNode, getOrCreateLViewCleanup, getOrCreateTViewCleanup, - handleError, - loadComponentRenderer, -} from './shared'; + unwrapRNode, +} from '../util/view_utils'; + +import {markViewDirty} from './mark_view_dirty'; +import {handleError, loadComponentRenderer} from './shared'; +import {DirectiveDef} from '../interfaces/definition'; /** * Contains a reference to a function that disables event replay feature @@ -158,7 +160,7 @@ export function listenerInternal( ): void { const isTNodeDirectiveHost = isDirectiveHost(tNode); const firstCreatePass = tView.firstCreatePass; - const tCleanup: false | any[] = firstCreatePass && getOrCreateTViewCleanup(tView); + const tCleanup = firstCreatePass ? getOrCreateTViewCleanup(tView) : null; const context = lView[CONTEXT]; // When the ɵɵlistener instruction was generated and is executed we know that there is either a @@ -229,34 +231,73 @@ export function listenerInternal( listenerFn = wrapListener(tNode, lView, context, listenerFn); } - // subscribe to directive outputs - const outputs = tNode.outputs; - let props: NodeOutputBindings[keyof NodeOutputBindings] | undefined; - if (processOutputs && outputs !== null && (props = outputs[eventName])) { - const propsLength = props.length; - if (propsLength) { - for (let i = 0; i < propsLength; i += 2) { - const index = props[i] as number; - ngDevMode && assertIndexInRange(lView, index); - const minifiedName = props[i + 1]; - const directiveInstance = lView[index]; - const output = directiveInstance[minifiedName]; + if (processOutputs) { + const outputConfig = tNode.outputs?.[eventName]; + const hostDirectiveOutputConfig = tNode.hostDirectiveOutputs?.[eventName]; - if (ngDevMode && !isOutputSubscribable(output)) { - throw new Error( - `@Output ${minifiedName} not initialized in '${directiveInstance.constructor.name}'.`, - ); - } + if (hostDirectiveOutputConfig && hostDirectiveOutputConfig.length) { + for (let i = 0; i < hostDirectiveOutputConfig.length; i += 2) { + const index = hostDirectiveOutputConfig[i] as number; + const lookupName = hostDirectiveOutputConfig[i + 1] as string; + listenToOutput( + tNode, + tView, + lView, + index, + lookupName, + eventName, + listenerFn, + lCleanup, + tCleanup, + ); + } + } - const subscription = (output as SubscribableOutput).subscribe(listenerFn); - const idx = lCleanup.length; - lCleanup.push(listenerFn, subscription); - tCleanup && tCleanup.push(eventName, tNode.index, idx, -(idx + 1)); + if (outputConfig && outputConfig.length) { + for (const index of outputConfig) { + listenToOutput( + tNode, + tView, + lView, + index, + eventName, + eventName, + listenerFn, + lCleanup, + tCleanup, + ); } } } } +function listenToOutput( + tNode: TNode, + tView: TView, + lView: LView, + index: number, + lookupName: string, + eventName: string, + listenerFn: (e?: any) => any, + lCleanup: any[], + tCleanup: any[] | null, +) { + ngDevMode && assertIndexInRange(lView, index); + const instance = lView[index]; + const def = tView.data[index] as DirectiveDef; + const propertyName = def.outputs[lookupName]; + const output = instance[propertyName]; + + if (ngDevMode && !isOutputSubscribable(output)) { + throw new Error(`@Output ${propertyName} not initialized in '${instance.constructor.name}'.`); + } + + const subscription = (output as SubscribableOutput).subscribe(listenerFn); + const idx = lCleanup.length; + lCleanup.push(listenerFn, subscription); + tCleanup && tCleanup.push(eventName, tNode.index, idx, -(idx + 1)); +} + function executeListenerWithErrorHandling( lView: LView, context: {} | null, @@ -304,8 +345,7 @@ function wrapListener( // In order to be backwards compatible with View Engine, events on component host nodes // must also mark the component view itself dirty (i.e. the view that it owns). - const startView = - tNode.componentOffset > -1 ? getComponentLViewByIndex(tNode.index, lView) : lView; + const startView = isComponentHost(tNode) ? getComponentLViewByIndex(tNode.index, lView) : lView; markViewDirty(startView, NotificationSource.Listener); let result = executeListenerWithErrorHandling(lView, context, listenerFn, e); diff --git a/packages/core/src/render3/instructions/projection.ts b/packages/core/src/render3/instructions/projection.ts index 2e8fee1a02c3..848c56049a06 100644 --- a/packages/core/src/render3/instructions/projection.ts +++ b/packages/core/src/render3/instructions/projection.ts @@ -6,10 +6,11 @@ * found in the LICENSE file at https://angular.dev/license */ import {findMatchingDehydratedView} from '../../hydration/views'; +import {isDetachedByI18n} from '../../i18n/utils'; import {newArray} from '../../util/array_utils'; import {assertLContainer, assertTNode} from '../assert'; import {ComponentTemplate} from '../interfaces/definition'; -import {TAttributes, TElementNode, TNode, TNodeFlags, TNodeType} from '../interfaces/node'; +import {TAttributes, TElementNode, TNode, TNodeType} from '../interfaces/node'; import {ProjectionSlots} from '../interfaces/projection'; import { DECLARATION_COMPONENT_VIEW, @@ -26,13 +27,10 @@ import { isSelectorInSelectorList, } from '../node_selector_matcher'; import {getLView, getTView, isInSkipHydrationBlock, setCurrentTNodeAsNotParent} from '../state'; -import { - addLViewToLContainer, - createAndRenderEmbeddedLView, - shouldAddViewToDom, -} from '../view_manipulation'; +import {getOrCreateTNode} from '../tnode_manipulation'; +import {addLViewToLContainer} from '../view/container'; +import {createAndRenderEmbeddedLView, shouldAddViewToDom} from '../view_manipulation'; -import {getOrCreateTNode} from './shared'; import {declareTemplate} from './template'; /** @@ -200,10 +198,7 @@ export function ɵɵprojection( if (isEmpty && fallbackIndex !== null) { insertFallbackContent(lView, tView, fallbackIndex); - } else if ( - isNodeCreationMode && - (tProjectionNode.flags & TNodeFlags.isDetached) !== TNodeFlags.isDetached - ) { + } else if (isNodeCreationMode && !isDetachedByI18n(tProjectionNode)) { // re-distribution of projectable nodes is stored on a component's view level applyProjection(tView, lView, tProjectionNode); } diff --git a/packages/core/src/render3/instructions/property.ts b/packages/core/src/render3/instructions/property.ts index b8280968ec19..8b476f08fbff 100644 --- a/packages/core/src/render3/instructions/property.ts +++ b/packages/core/src/render3/instructions/property.ts @@ -13,7 +13,7 @@ import {getLView, getSelectedTNode, getTView, nextBindingIndex} from '../state'; import { elementPropertyInternal, - setInputsForProperty, + setAllInputsForProperty, storePropertyBindingMetadata, } from './shared'; @@ -71,8 +71,6 @@ export function setDirectiveInputsWhichShadowsStyling( value: any, isClassBased: boolean, ) { - const inputs = tNode.inputs!; - const property = isClassBased ? 'class' : 'style'; // We support both 'class' and `className` hence the fallback. - setInputsForProperty(tView, lView, inputs[property], property, value); + setAllInputsForProperty(tNode, tView, lView, isClassBased ? 'class' : 'style', value); } diff --git a/packages/core/src/render3/instructions/queries.ts b/packages/core/src/render3/instructions/queries.ts index e69307f77086..6d91631d2b15 100644 --- a/packages/core/src/render3/instructions/queries.ts +++ b/packages/core/src/render3/instructions/queries.ts @@ -16,7 +16,7 @@ import { getQueryResults, getTQuery, loadQueryInternal, -} from '../query'; +} from '../queries/query'; import {getCurrentQueryIndex, getLView, getTView, setCurrentQueryIndex} from '../state'; import {isCreationMode} from '../util/view_utils'; diff --git a/packages/core/src/render3/instructions/queries_signals.ts b/packages/core/src/render3/instructions/queries_signals.ts index 1c4e9e45bcca..aaf3f2b7d535 100644 --- a/packages/core/src/render3/instructions/queries_signals.ts +++ b/packages/core/src/render3/instructions/queries_signals.ts @@ -8,8 +8,8 @@ import {ProviderToken} from '../../di/provider_token'; import {QueryFlags} from '../interfaces/query'; -import {createContentQuery, createViewQuery} from '../query'; -import {bindQueryToSignal} from '../query_reactive'; +import {createContentQuery, createViewQuery} from '../queries/query'; +import {bindQueryToSignal} from '../queries/query_reactive'; import {Signal} from '../reactivity/api'; import {getCurrentQueryIndex, setCurrentQueryIndex} from '../state'; diff --git a/packages/core/src/render3/instructions/render.ts b/packages/core/src/render3/instructions/render.ts index c4806cf5efec..01270cb454e3 100644 --- a/packages/core/src/render3/instructions/render.ts +++ b/packages/core/src/render3/instructions/render.ts @@ -21,10 +21,13 @@ import { TVIEW, TView, } from '../interfaces/view'; +import {profiler} from '../profiler'; +import {ProfilerEvent} from '../profiler_types'; +import {executeViewQueryFn, refreshContentQueries} from '../queries/query_execution'; import {enterView, leaveView} from '../state'; import {getComponentLViewByIndex, isCreationMode} from '../util/view_utils'; -import {executeTemplate, executeViewQueryFn, refreshContentQueries} from './shared'; +import {executeTemplate} from './shared'; export function renderComponent(hostLView: LView, componentHostIdx: number) { ngDevMode && assertEqual(isCreationMode(hostLView), true, 'Should be run in creation mode'); @@ -38,7 +41,11 @@ export function renderComponent(hostLView: LView, componentHostIdx: number) { componentView[HYDRATION] = retrieveHydrationInfo(hostRNode, componentView[INJECTOR]); } + profiler(ProfilerEvent.ComponentStart); + renderView(componentTView, componentView, componentView[CONTEXT]); + + profiler(ProfilerEvent.ComponentEnd, componentView[CONTEXT] as any as {}); } /** diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index 729b2fca26cf..dc1c6e4fea70 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -6,422 +6,76 @@ * found in the LICENSE file at https://angular.dev/license */ -import {setActiveConsumer} from '@angular/core/primitives/signals'; - import {Injector} from '../../di/injector'; import {ErrorHandler} from '../../error_handler'; -import {RuntimeError, RuntimeErrorCode} from '../../errors'; -import {DehydratedView} from '../../hydration/interfaces'; import {hasSkipHydrationAttrOnRElement} from '../../hydration/skip_hydration'; import {PRESERVE_HOST_CONTENT, PRESERVE_HOST_CONTENT_DEFAULT} from '../../hydration/tokens'; import {processTextNodeMarkersBeforeHydration} from '../../hydration/utils'; -import {DoCheck, OnChanges, OnInit} from '../../interface/lifecycle_hooks'; -import {Writable} from '../../interface/type'; -import {SchemaMetadata} from '../../metadata/schema'; import {ViewEncapsulation} from '../../metadata/view'; import { validateAgainstEventAttributes, validateAgainstEventProperties, } from '../../sanitization/sanitization'; -import { - assertDefined, - assertEqual, - assertGreaterThan, - assertGreaterThanOrEqual, - assertIndexInRange, - assertNotEqual, - assertNotSame, - assertSame, - assertString, -} from '../../util/assert'; +import {assertIndexInRange, assertNotSame} from '../../util/assert'; import {escapeCommentText} from '../../util/dom'; import {normalizeDebugBindingName, normalizeDebugBindingValue} from '../../util/ng_reflect'; import {stringify} from '../../util/stringify'; -import {applyValueToInputField} from '../apply_value_input_field'; -import { - assertFirstCreatePass, - assertFirstUpdatePass, - assertLView, - assertNoDuplicateDirectives, - assertTNodeForLView, - assertTNodeForTView, -} from '../assert'; +import {assertFirstCreatePass, assertLView} from '../assert'; import {attachPatchData} from '../context_discovery'; -import {getFactoryDef} from '../definition_factory'; -import {diPublicInInjector, getNodeInjectable, getOrCreateNodeInjectorForNode} from '../di'; +import {getNodeInjectable, getOrCreateNodeInjectorForNode} from '../di'; import {throwMultipleComponentError} from '../errors'; -import {AttributeMarker} from '../interfaces/attribute_marker'; -import {CONTAINER_HEADER_OFFSET, LContainer} from '../interfaces/container'; -import { - ComponentDef, - ComponentTemplate, - DirectiveDef, - DirectiveDefListOrFactory, - HostBindingsFunction, - HostDirectiveBindingMap, - HostDirectiveDefs, - PipeDefListOrFactory, - RenderFlags, - ViewQueriesFunction, -} from '../interfaces/definition'; -import {NodeInjectorFactory} from '../interfaces/injector'; -import {InputFlags} from '../interfaces/input_flags'; -import {getUniqueLViewId} from '../interfaces/lview_tracking'; +import {ComponentDef, ComponentTemplate, DirectiveDef, RenderFlags} from '../interfaces/definition'; import { InitialInputData, InitialInputs, LocalRefExtractor, NodeInputBindings, - NodeOutputBindings, - TAttributes, - TConstantsOrFactory, TContainerNode, TDirectiveHostNode, TElementContainerNode, TElementNode, - TIcuContainerNode, - TLetDeclarationNode, TNode, TNodeFlags, TNodeType, - TProjectionNode, } from '../interfaces/node'; import {Renderer} from '../interfaces/renderer'; -import {RComment, RElement, RNode, RText} from '../interfaces/renderer_dom'; +import {RComment, RElement} from '../interfaces/renderer_dom'; import {SanitizerFn} from '../interfaces/sanitization'; -import {TStylingRange} from '../interfaces/styling'; -import {isComponentDef, isComponentHost, isContentQueryHost} from '../interfaces/type_checks'; +import {isComponentDef, isComponentHost} from '../interfaces/type_checks'; import { - CHILD_HEAD, - CHILD_TAIL, - CLEANUP, CONTEXT, - DECLARATION_COMPONENT_VIEW, - DECLARATION_VIEW, - EMBEDDED_VIEW_INJECTOR, - ENVIRONMENT, FLAGS, HEADER_OFFSET, - HOST, - HostBindingOpCodes, - HYDRATION, - ID, INJECTOR, LView, - LViewEnvironment, LViewFlags, - NEXT, - PARENT, RENDERER, - T_HOST, TData, - TVIEW, TView, - TViewType, } from '../interfaces/view'; -import {assertPureTNodeType, assertTNodeType} from '../node_assert'; -import {clearElementContents, updateTextNode} from '../node_manipulation'; -import {isInlineTemplate, isNodeMatchingSelectorList} from '../node_selector_matcher'; +import {assertTNodeType} from '../node_assert'; +import {isNodeMatchingSelectorList} from '../node_selector_matcher'; import {profiler} from '../profiler'; import {ProfilerEvent} from '../profiler_types'; import { getBindingsEnabled, getCurrentDirectiveIndex, - getCurrentParentTNode, - getCurrentTNodePlaceholderOk, getSelectedIndex, - isCurrentTNodeParent, isInCheckNoChangesMode, - isInI18nBlock, - isInSkipHydrationBlock, - setBindingRootForHostBindings, setCurrentDirectiveIndex, - setCurrentQueryIndex, - setCurrentTNode, setSelectedIndex, } from '../state'; import {NO_CHANGE} from '../tokens'; -import {mergeHostAttrs} from '../util/attrs_utils'; import {INTERPOLATION_DELIMITER} from '../util/misc_utils'; import {renderStringify} from '../util/stringify_utils'; -import { - getComponentLViewByIndex, - getNativeByIndex, - getNativeByTNode, - resetPreOrderHookFlags, - unwrapLView, -} from '../util/view_utils'; +import {getComponentLViewByIndex, getNativeByTNode, unwrapLView} from '../util/view_utils'; +import {clearElementContents} from '../dom_node_manipulation'; +import {createComponentLView} from '../view/construction'; import {selectIndexInternal} from './advance'; -import {ɵɵdirectiveInject} from './di'; import {handleUnknownPropertyError, isPropertyValid, matchingSchemas} from './element_validation'; import {writeToDirectiveInput} from './write_to_directive_input'; -/** - * Invoke `HostBindingsFunction`s for view. - * - * This methods executes `TView.hostBindingOpCodes`. It is used to execute the - * `HostBindingsFunction`s associated with the current `LView`. - * - * @param tView Current `TView`. - * @param lView Current `LView`. - */ -export function processHostBindingOpCodes(tView: TView, lView: LView): void { - const hostBindingOpCodes = tView.hostBindingOpCodes; - if (hostBindingOpCodes === null) return; - try { - for (let i = 0; i < hostBindingOpCodes.length; i++) { - const opCode = hostBindingOpCodes[i] as number; - if (opCode < 0) { - // Negative numbers are element indexes. - setSelectedIndex(~opCode); - } else { - // Positive numbers are NumberTuple which store bindingRootIndex and directiveIndex. - const directiveIdx = opCode; - const bindingRootIndx = hostBindingOpCodes[++i] as number; - const hostBindingFn = hostBindingOpCodes[++i] as HostBindingsFunction; - setBindingRootForHostBindings(bindingRootIndx, directiveIdx); - const context = lView[directiveIdx]; - hostBindingFn(RenderFlags.Update, context); - } - } - } finally { - setSelectedIndex(-1); - } -} - -export function createLView( - parentLView: LView | null, - tView: TView, - context: T | null, - flags: LViewFlags, - host: RElement | null, - tHostNode: TNode | null, - environment: LViewEnvironment | null, - renderer: Renderer | null, - injector: Injector | null, - embeddedViewInjector: Injector | null, - hydrationInfo: DehydratedView | null, -): LView { - const lView = tView.blueprint.slice() as LView; - lView[HOST] = host; - lView[FLAGS] = - flags | - LViewFlags.CreationMode | - LViewFlags.Attached | - LViewFlags.FirstLViewPass | - LViewFlags.Dirty | - LViewFlags.RefreshView; - if ( - embeddedViewInjector !== null || - (parentLView && parentLView[FLAGS] & LViewFlags.HasEmbeddedViewInjector) - ) { - lView[FLAGS] |= LViewFlags.HasEmbeddedViewInjector; - } - resetPreOrderHookFlags(lView); - ngDevMode && tView.declTNode && parentLView && assertTNodeForLView(tView.declTNode, parentLView); - lView[PARENT] = lView[DECLARATION_VIEW] = parentLView; - lView[CONTEXT] = context; - lView[ENVIRONMENT] = (environment || (parentLView && parentLView[ENVIRONMENT]))!; - ngDevMode && assertDefined(lView[ENVIRONMENT], 'LViewEnvironment is required'); - lView[RENDERER] = (renderer || (parentLView && parentLView[RENDERER]))!; - ngDevMode && assertDefined(lView[RENDERER], 'Renderer is required'); - lView[INJECTOR as any] = injector || (parentLView && parentLView[INJECTOR]) || null; - lView[T_HOST] = tHostNode; - lView[ID] = getUniqueLViewId(); - lView[HYDRATION] = hydrationInfo; - lView[EMBEDDED_VIEW_INJECTOR as any] = embeddedViewInjector; - - ngDevMode && - assertEqual( - tView.type == TViewType.Embedded ? parentLView !== null : true, - true, - 'Embedded views must have parentLView', - ); - lView[DECLARATION_COMPONENT_VIEW] = - tView.type == TViewType.Embedded ? parentLView![DECLARATION_COMPONENT_VIEW] : lView; - return lView as LView; -} - -/** - * Create and stores the TNode, and hooks it up to the tree. - * - * @param tView The current `TView`. - * @param index The index at which the TNode should be saved (null if view, since they are not - * saved). - * @param type The type of TNode to create - * @param native The native element for this node, if applicable - * @param name The tag name of the associated native element, if applicable - * @param attrs Any attrs for the native element, if applicable - */ -export function getOrCreateTNode( - tView: TView, - index: number, - type: TNodeType.Element | TNodeType.Text, - name: string | null, - attrs: TAttributes | null, -): TElementNode; -export function getOrCreateTNode( - tView: TView, - index: number, - type: TNodeType.Container, - name: string | null, - attrs: TAttributes | null, -): TContainerNode; -export function getOrCreateTNode( - tView: TView, - index: number, - type: TNodeType.Projection, - name: null, - attrs: TAttributes | null, -): TProjectionNode; -export function getOrCreateTNode( - tView: TView, - index: number, - type: TNodeType.ElementContainer, - name: string | null, - attrs: TAttributes | null, -): TElementContainerNode; -export function getOrCreateTNode( - tView: TView, - index: number, - type: TNodeType.Icu, - name: null, - attrs: TAttributes | null, -): TElementContainerNode; -export function getOrCreateTNode( - tView: TView, - index: number, - type: TNodeType.LetDeclaration, - name: null, - attrs: null, -): TLetDeclarationNode; -export function getOrCreateTNode( - tView: TView, - index: number, - type: TNodeType, - name: string | null, - attrs: TAttributes | null, -): TElementNode & - TContainerNode & - TElementContainerNode & - TProjectionNode & - TIcuContainerNode & - TLetDeclarationNode { - ngDevMode && - index !== 0 && // 0 are bogus nodes and they are OK. See `createContainerRef` in - // `view_engine_compatibility` for additional context. - assertGreaterThanOrEqual(index, HEADER_OFFSET, "TNodes can't be in the LView header."); - // Keep this function short, so that the VM will inline it. - ngDevMode && assertPureTNodeType(type); - let tNode = tView.data[index] as TNode; - if (tNode === null) { - tNode = createTNodeAtIndex(tView, index, type, name, attrs); - if (isInI18nBlock()) { - // If we are in i18n block then all elements should be pre declared through `Placeholder` - // See `TNodeType.Placeholder` and `LFrame.inI18n` for more context. - // If the `TNode` was not pre-declared than it means it was not mentioned which means it was - // removed, so we mark it as detached. - tNode.flags |= TNodeFlags.isDetached; - } - } else if (tNode.type & TNodeType.Placeholder) { - tNode.type = type; - tNode.value = name; - tNode.attrs = attrs; - const parent = getCurrentParentTNode(); - tNode.injectorIndex = parent === null ? -1 : parent.injectorIndex; - ngDevMode && assertTNodeForTView(tNode, tView); - ngDevMode && assertEqual(index, tNode.index, 'Expecting same index'); - } - setCurrentTNode(tNode, true); - return tNode as TElementNode & - TContainerNode & - TElementContainerNode & - TProjectionNode & - TIcuContainerNode; -} - -export function createTNodeAtIndex( - tView: TView, - index: number, - type: TNodeType, - name: string | null, - attrs: TAttributes | null, -) { - const currentTNode = getCurrentTNodePlaceholderOk(); - const isParent = isCurrentTNodeParent(); - const parent = isParent ? currentTNode : currentTNode && currentTNode.parent; - // Parents cannot cross component boundaries because components will be used in multiple places. - const tNode = (tView.data[index] = createTNode( - tView, - parent as TElementNode | TContainerNode, - type, - index, - name, - attrs, - )); - // Assign a pointer to the first child node of a given view. The first node is not always the one - // at index 0, in case of i18n, index 0 can be the instruction `i18nStart` and the first node has - // the index 1 or more, so we can't just check node index. - if (tView.firstChild === null) { - tView.firstChild = tNode; - } - if (currentTNode !== null) { - if (isParent) { - // FIXME(misko): This logic looks unnecessarily complicated. Could we simplify? - if (currentTNode.child == null && tNode.parent !== null) { - // We are in the same view, which means we are adding content node to the parent view. - currentTNode.child = tNode; - } - } else { - if (currentTNode.next === null) { - // In the case of i18n the `currentTNode` may already be linked, in which case we don't want - // to break the links which i18n created. - currentTNode.next = tNode; - tNode.prev = currentTNode; - } - } - } - return tNode; -} - -/** - * When elements are created dynamically after a view blueprint is created (e.g. through - * i18nApply()), we need to adjust the blueprint for future - * template passes. - * - * @param tView `TView` associated with `LView` - * @param lView The `LView` containing the blueprint to adjust - * @param numSlotsToAlloc The number of slots to alloc in the LView, should be >0 - * @param initialValue Initial value to store in blueprint - */ -export function allocExpando( - tView: TView, - lView: LView, - numSlotsToAlloc: number, - initialValue: any, -): number { - if (numSlotsToAlloc === 0) return -1; - if (ngDevMode) { - assertFirstCreatePass(tView); - assertSame(tView, lView[TVIEW], '`LView` must be associated with `TView`!'); - assertEqual(tView.data.length, lView.length, 'Expecting LView to be same size as TView'); - assertEqual( - tView.data.length, - tView.blueprint.length, - 'Expecting Blueprint to be same size as TView', - ); - assertFirstUpdatePass(tView); - } - const allocIdx = lView.length; - for (let i = 0; i < numSlotsToAlloc; i++) { - lView.push(initialValue); - tView.blueprint.push(initialValue); - tView.data.push(null); - } - return allocIdx; -} - export function executeTemplate( tView: TView, lView: LView, @@ -454,40 +108,11 @@ export function executeTemplate( } } -////////////////////////// -//// Element -////////////////////////// - -export function executeContentQueries(tView: TView, tNode: TNode, lView: LView) { - if (isContentQueryHost(tNode)) { - const prevConsumer = setActiveConsumer(null); - try { - const start = tNode.directiveStart; - const end = tNode.directiveEnd; - for (let directiveIndex = start; directiveIndex < end; directiveIndex++) { - const def = tView.data[directiveIndex] as DirectiveDef; - if (def.contentQueries) { - const directiveInstance = lView[directiveIndex]; - ngDevMode && - assertDefined( - directiveIndex, - 'Incorrect reference to a directive defining a content query', - ); - def.contentQueries(RenderFlags.Create, directiveInstance, directiveIndex); - } - } - } finally { - setActiveConsumer(prevConsumer); - } - } -} - /** * Creates directive instances. */ export function createDirectivesInstances(tView: TView, lView: LView, tNode: TDirectiveHostNode) { - if (!getBindingsEnabled()) return; - instantiateAllDirectives(tView, lView, tNode, getNativeByTNode(tNode, lView)); + instantiateAllDirectives(tView, lView, tNode); if ((tNode.flags & TNodeFlags.hasHostBindings) === TNodeFlags.hasHostBindings) { invokeDirectivesHostBindings(tView, lView, tNode); } @@ -519,126 +144,6 @@ export function saveResolvedLocalsInData( } } -/** - * Gets TView from a template function or creates a new TView - * if it doesn't already exist. - * - * @param def ComponentDef - * @returns TView - */ -export function getOrCreateComponentTView(def: ComponentDef): TView { - const tView = def.tView; - - // Create a TView if there isn't one, or recreate it if the first create pass didn't - // complete successfully since we can't know for sure whether it's in a usable shape. - if (tView === null || tView.incompleteFirstPass) { - // Declaration node here is null since this function is called when we dynamically create a - // component and hence there is no declaration. - const declTNode = null; - return (def.tView = createTView( - TViewType.Component, - declTNode, - def.template, - def.decls, - def.vars, - def.directiveDefs, - def.pipeDefs, - def.viewQuery, - def.schemas, - def.consts, - def.id, - )); - } - - return tView; -} - -/** - * Creates a TView instance - * - * @param type Type of `TView`. - * @param declTNode Declaration location of this `TView`. - * @param templateFn Template function - * @param decls The number of nodes, local refs, and pipes in this template - * @param directives Registry of directives for this view - * @param pipes Registry of pipes for this view - * @param viewQuery View queries for this view - * @param schemas Schemas for this view - * @param consts Constants for this view - */ -export function createTView( - type: TViewType, - declTNode: TNode | null, - templateFn: ComponentTemplate | null, - decls: number, - vars: number, - directives: DirectiveDefListOrFactory | null, - pipes: PipeDefListOrFactory | null, - viewQuery: ViewQueriesFunction | null, - schemas: SchemaMetadata[] | null, - constsOrFactory: TConstantsOrFactory | null, - ssrId: string | null, -): TView { - ngDevMode && ngDevMode.tView++; - const bindingStartIndex = HEADER_OFFSET + decls; - // This length does not yet contain host bindings from child directives because at this point, - // we don't know which directives are active on this template. As soon as a directive is matched - // that has a host binding, we will update the blueprint with that def's hostVars count. - const initialViewLength = bindingStartIndex + vars; - const blueprint = createViewBlueprint(bindingStartIndex, initialViewLength); - const consts = typeof constsOrFactory === 'function' ? constsOrFactory() : constsOrFactory; - const tView = (blueprint[TVIEW as any] = { - type: type, - blueprint: blueprint, - template: templateFn, - queries: null, - viewQuery: viewQuery, - declTNode: declTNode, - data: blueprint.slice().fill(null, bindingStartIndex), - bindingStartIndex: bindingStartIndex, - expandoStartIndex: initialViewLength, - hostBindingOpCodes: null, - firstCreatePass: true, - firstUpdatePass: true, - staticViewQueries: false, - staticContentQueries: false, - preOrderHooks: null, - preOrderCheckHooks: null, - contentHooks: null, - contentCheckHooks: null, - viewHooks: null, - viewCheckHooks: null, - destroyHooks: null, - cleanup: null, - contentQueries: null, - components: null, - directiveRegistry: typeof directives === 'function' ? directives() : directives, - pipeRegistry: typeof pipes === 'function' ? pipes() : pipes, - firstChild: null, - schemas: schemas, - consts: consts, - incompleteFirstPass: false, - ssrId, - }); - if (ngDevMode) { - // For performance reasons it is important that the tView retains the same shape during runtime. - // (To make sure that all of the code is monomorphic.) For this reason we seal the object to - // prevent class transitions. - Object.seal(tView); - } - return tView; -} - -function createViewBlueprint(bindingStartIndex: number, initialViewLength: number): LView { - const blueprint = []; - - for (let i = 0; i < initialViewLength; i++) { - blueprint.push(i < bindingStartIndex ? null : NO_CHANGE); - } - - return blueprint as LView; -} - /** * Locates the host native element, used for bootstrapping existing nodes into rendering pipeline. * @@ -713,379 +218,6 @@ export function enableApplyRootElementTransformImpl() { _applyRootElementTransformImpl = applyRootElementTransformImpl; } -/** - * Saves context for this cleanup function in LView.cleanupInstances. - * - * On the first template pass, saves in TView: - * - Cleanup function - * - Index of context we just saved in LView.cleanupInstances - */ -export function storeCleanupWithContext( - tView: TView, - lView: LView, - context: any, - cleanupFn: Function, -): void { - const lCleanup = getOrCreateLViewCleanup(lView); - - // Historically the `storeCleanupWithContext` was used to register both framework-level and - // user-defined cleanup callbacks, but over time those two types of cleanups were separated. - // This dev mode checks assures that user-level cleanup callbacks are _not_ stored in data - // structures reserved for framework-specific hooks. - ngDevMode && - assertDefined( - context, - 'Cleanup context is mandatory when registering framework-level destroy hooks', - ); - lCleanup.push(context); - - if (tView.firstCreatePass) { - getOrCreateTViewCleanup(tView).push(cleanupFn, lCleanup.length - 1); - } else { - // Make sure that no new framework-level cleanup functions are registered after the first - // template pass is done (and TView data structures are meant to fully constructed). - if (ngDevMode) { - Object.freeze(getOrCreateTViewCleanup(tView)); - } - } -} - -/** - * Constructs a TNode object from the arguments. - * - * @param tView `TView` to which this `TNode` belongs - * @param tParent Parent `TNode` - * @param type The type of the node - * @param index The index of the TNode in TView.data, adjusted for HEADER_OFFSET - * @param tagName The tag name of the node - * @param attrs The attributes defined on this node - * @returns the TNode object - */ -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType.Container, - index: number, - tagName: string | null, - attrs: TAttributes | null, -): TContainerNode; -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType.Element | TNodeType.Text, - index: number, - tagName: string | null, - attrs: TAttributes | null, -): TElementNode; -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType.ElementContainer, - index: number, - tagName: string | null, - attrs: TAttributes | null, -): TElementContainerNode; -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType.Icu, - index: number, - tagName: string | null, - attrs: TAttributes | null, -): TIcuContainerNode; -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType.Projection, - index: number, - tagName: string | null, - attrs: TAttributes | null, -): TProjectionNode; -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType.LetDeclaration, - index: number, - tagName: null, - attrs: null, -): TLetDeclarationNode; -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType, - index: number, - tagName: string | null, - attrs: TAttributes | null, -): TNode; -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType, - index: number, - value: string | null, - attrs: TAttributes | null, -): TNode { - ngDevMode && - index !== 0 && // 0 are bogus nodes and they are OK. See `createContainerRef` in - // `view_engine_compatibility` for additional context. - assertGreaterThanOrEqual(index, HEADER_OFFSET, "TNodes can't be in the LView header."); - ngDevMode && assertNotSame(attrs, undefined, "'undefined' is not valid value for 'attrs'"); - ngDevMode && ngDevMode.tNode++; - ngDevMode && tParent && assertTNodeForTView(tParent, tView); - let injectorIndex = tParent ? tParent.injectorIndex : -1; - let flags = 0; - if (isInSkipHydrationBlock()) { - flags |= TNodeFlags.inSkipHydrationBlock; - } - const tNode = { - type, - index, - insertBeforeIndex: null, - injectorIndex, - directiveStart: -1, - directiveEnd: -1, - directiveStylingLast: -1, - componentOffset: -1, - propertyBindings: null, - flags, - providerIndexes: 0, - value: value, - attrs: attrs, - mergedAttrs: null, - localNames: null, - initialInputs: undefined, - inputs: null, - outputs: null, - tView: null, - next: null, - prev: null, - projectionNext: null, - child: null, - parent: tParent, - projection: null, - styles: null, - stylesWithoutHost: null, - residualStyles: undefined, - classes: null, - classesWithoutHost: null, - residualClasses: undefined, - classBindings: 0 as TStylingRange, - styleBindings: 0 as TStylingRange, - }; - if (ngDevMode) { - // For performance reasons it is important that the tNode retains the same shape during runtime. - // (To make sure that all of the code is monomorphic.) For this reason we seal the object to - // prevent class transitions. - Object.seal(tNode); - } - return tNode; -} - -/** Mode for capturing node bindings. */ -const enum CaptureNodeBindingMode { - Inputs, - Outputs, -} - -/** - * Captures node input bindings for the given directive based on the inputs metadata. - * This will be called multiple times to combine inputs from various directives on a node. - * - * The host binding alias map is used to alias and filter out properties for host directives. - * If the mapping is provided, it'll act as an allowlist, as well as a mapping of what public - * name inputs/outputs should be exposed under. - */ -function captureNodeBindings( - mode: CaptureNodeBindingMode.Inputs, - inputs: DirectiveDef['inputs'], - directiveIndex: number, - bindingsResult: NodeInputBindings | null, - hostDirectiveAliasMap: HostDirectiveBindingMap | null, -): NodeInputBindings | null; -/** - * Captures node output bindings for the given directive based on the output metadata. - * This will be called multiple times to combine inputs from various directives on a node. - * - * The host binding alias map is used to alias and filter out properties for host directives. - * If the mapping is provided, it'll act as an allowlist, as well as a mapping of what public - * name inputs/outputs should be exposed under. - */ -function captureNodeBindings( - mode: CaptureNodeBindingMode.Outputs, - outputs: DirectiveDef['outputs'], - directiveIndex: number, - bindingsResult: NodeOutputBindings | null, - hostDirectiveAliasMap: HostDirectiveBindingMap | null, -): NodeOutputBindings | null; - -function captureNodeBindings( - mode: CaptureNodeBindingMode, - aliasMap: DirectiveDef['inputs'] | DirectiveDef['outputs'], - directiveIndex: number, - bindingsResult: NodeInputBindings | NodeOutputBindings | null, - hostDirectiveAliasMap: HostDirectiveBindingMap | null, -): NodeInputBindings | NodeOutputBindings | null { - for (let publicName in aliasMap) { - if (!aliasMap.hasOwnProperty(publicName)) { - continue; - } - - const value = aliasMap[publicName]; - if (value === undefined) { - continue; - } - - bindingsResult ??= {}; - - let internalName: string; - let inputFlags = InputFlags.None; - - // For inputs, the value might be an array capturing additional - // input flags. - if (Array.isArray(value)) { - internalName = value[0]; - inputFlags = value[1]; - } else { - internalName = value; - } - - // If there are no host directive mappings, we want to remap using the alias map from the - // definition itself. If there is an alias map, it has two functions: - // 1. It serves as an allowlist of bindings that are exposed by the host directives. Only the - // ones inside the host directive map will be exposed on the host. - // 2. The public name of the property is aliased using the host directive alias map, rather - // than the alias map from the definition. - let finalPublicName: string = publicName; - if (hostDirectiveAliasMap !== null) { - // If there is no mapping, it's not part of the allowlist and this input/output - // is not captured and should be ignored. - if (!hostDirectiveAliasMap.hasOwnProperty(publicName)) { - continue; - } - finalPublicName = hostDirectiveAliasMap[publicName]; - } - - if (mode === CaptureNodeBindingMode.Inputs) { - addPropertyBinding( - bindingsResult as NodeInputBindings, - directiveIndex, - finalPublicName, - internalName, - inputFlags, - ); - } else { - addPropertyBinding( - bindingsResult as NodeOutputBindings, - directiveIndex, - finalPublicName, - internalName, - ); - } - } - return bindingsResult; -} - -function addPropertyBinding( - bindings: NodeInputBindings, - directiveIndex: number, - publicName: string, - internalName: string, - inputFlags: InputFlags, -): void; -function addPropertyBinding( - bindings: NodeOutputBindings, - directiveIndex: number, - publicName: string, - internalName: string, -): void; - -function addPropertyBinding( - bindings: NodeInputBindings | NodeOutputBindings, - directiveIndex: number, - publicName: string, - internalName: string, - inputFlags?: InputFlags, -) { - let values: (typeof bindings)[typeof publicName]; - - if (bindings.hasOwnProperty(publicName)) { - (values = bindings[publicName]).push(directiveIndex, internalName); - } else { - values = bindings[publicName] = [directiveIndex, internalName]; - } - - if (inputFlags !== undefined) { - (values as NodeInputBindings[typeof publicName]).push(inputFlags); - } -} - -/** - * Initializes data structures required to work with directive inputs and outputs. - * Initialization is done for all directives matched on a given TNode. - */ -function initializeInputAndOutputAliases( - tView: TView, - tNode: TNode, - hostDirectiveDefinitionMap: HostDirectiveDefs | null, -): void { - ngDevMode && assertFirstCreatePass(tView); - - const start = tNode.directiveStart; - const end = tNode.directiveEnd; - const tViewData = tView.data; - - const tNodeAttrs = tNode.attrs; - const inputsFromAttrs: InitialInputData = []; - let inputsStore: NodeInputBindings | null = null; - let outputsStore: NodeOutputBindings | null = null; - - for (let directiveIndex = start; directiveIndex < end; directiveIndex++) { - const directiveDef = tViewData[directiveIndex] as DirectiveDef; - const aliasData = hostDirectiveDefinitionMap - ? hostDirectiveDefinitionMap.get(directiveDef) - : null; - const aliasedInputs = aliasData ? aliasData.inputs : null; - const aliasedOutputs = aliasData ? aliasData.outputs : null; - - inputsStore = captureNodeBindings( - CaptureNodeBindingMode.Inputs, - directiveDef.inputs, - directiveIndex, - inputsStore, - aliasedInputs, - ); - outputsStore = captureNodeBindings( - CaptureNodeBindingMode.Outputs, - directiveDef.outputs, - directiveIndex, - outputsStore, - aliasedOutputs, - ); - // Do not use unbound attributes as inputs to structural directives, since structural - // directive inputs can only be set using microsyntax (e.g. `
    `). - // TODO(FW-1930): microsyntax expressions may also contain unbound/static attributes, which - // should be set for inline templates. - const initialInputs = - inputsStore !== null && tNodeAttrs !== null && !isInlineTemplate(tNode) - ? generateInitialInputs(inputsStore, directiveIndex, tNodeAttrs) - : null; - inputsFromAttrs.push(initialInputs); - } - - if (inputsStore !== null) { - if (inputsStore.hasOwnProperty('class')) { - tNode.flags |= TNodeFlags.hasClassInput; - } - if (inputsStore.hasOwnProperty('style')) { - tNode.flags |= TNodeFlags.hasStyleInput; - } - } - - tNode.initialInputs = inputsFromAttrs; - tNode.inputs = inputsStore; - tNode.outputs = outputsStore; -} - /** * Mapping between attributes names that don't correspond to their element property names. * @@ -1117,16 +249,19 @@ export function elementPropertyInternal( nativeOnly: boolean, ): void { ngDevMode && assertNotSame(value, NO_CHANGE as any, 'Incoming value should never be NO_CHANGE.'); - const element = getNativeByTNode(tNode, lView) as RElement | RComment; - let inputData = tNode.inputs; - let dataValue: NodeInputBindings[typeof propName] | undefined; - if (!nativeOnly && inputData != null && (dataValue = inputData[propName])) { - setInputsForProperty(tView, lView, dataValue, propName, value); - if (isComponentHost(tNode)) markDirtyIfOnPush(lView, tNode.index); - if (ngDevMode) { - setNgReflectProperties(lView, element, tNode.type, dataValue, value); + + if (!nativeOnly) { + const hasSetInput = setAllInputsForProperty(tNode, tView, lView, propName, value); + + if (hasSetInput) { + isComponentHost(tNode) && markDirtyIfOnPush(lView, tNode.index); + ngDevMode && setNgReflectProperties(lView, tView, tNode, propName, value); + return; // Stop propcessing if we've matched at least one input. } - } else if (tNode.type & TNodeType.AnyRNode) { + } + + if (tNode.type & TNodeType.AnyRNode) { + const element = getNativeByTNode(tNode, lView) as RElement | RComment; propName = mapPropName(propName); if (ngDevMode) { @@ -1159,17 +294,12 @@ export function markDirtyIfOnPush(lView: LView, viewIndex: number): void { } } -function setNgReflectProperty( - lView: LView, - element: RElement | RComment, - type: TNodeType, - attrName: string, - value: any, -) { +function setNgReflectProperty(lView: LView, tNode: TNode, attrName: string, value: any) { + const element = getNativeByTNode(tNode, lView) as RElement | RComment; const renderer = lView[RENDERER]; attrName = normalizeDebugBindingName(attrName); const debugValue = normalizeDebugBindingValue(value); - if (type & TNodeType.AnyRNode) { + if (tNode.type & TNodeType.AnyRNode) { if (value == null) { renderer.removeAttribute(element as RElement, attrName); } else { @@ -1183,202 +313,42 @@ function setNgReflectProperty( } } -export function setNgReflectProperties( +function setNgReflectProperties( lView: LView, - element: RElement | RComment, - type: TNodeType, - dataValue: NodeInputBindings[string], - value: any, -) { - if (type & (TNodeType.AnyRNode | TNodeType.Container)) { - /** - * dataValue is an array containing runtime input or output names for the directives: - * i+0: directive instance index - * i+1: privateName - * - * e.g. [0, 'change', 'change-minified'] - * we want to set the reflected property with the privateName: dataValue[i+1] - */ - for (let i = 0; i < dataValue.length; i += 3) { - setNgReflectProperty(lView, element, type, dataValue[i + 1] as string, value); - } - } -} - -/** - * Resolve the matched directives on a node. - */ -export function resolveDirectives( tView: TView, - lView: LView, - tNode: TElementNode | TContainerNode | TElementContainerNode, - localRefs: string[] | null, -): void { - // Please make sure to have explicit type for `exportsMap`. Inferred type triggers bug in - // tsickle. - ngDevMode && assertFirstCreatePass(tView); - - if (getBindingsEnabled()) { - const exportsMap: {[key: string]: number} | null = localRefs === null ? null : {'': -1}; - const matchResult = findDirectiveDefMatches(tView, tNode); - let directiveDefs: DirectiveDef[] | null; - let hostDirectiveDefs: HostDirectiveDefs | null; - - if (matchResult === null) { - directiveDefs = hostDirectiveDefs = null; - } else { - [directiveDefs, hostDirectiveDefs] = matchResult; - } - - if (directiveDefs !== null) { - initializeDirectives(tView, lView, tNode, directiveDefs, exportsMap, hostDirectiveDefs); - } - if (exportsMap) cacheMatchingLocalNames(tNode, localRefs, exportsMap); - } - // Merge the template attrs last so that they have the highest priority. - tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs); -} - -/** Initializes the data structures necessary for a list of directives to be instantiated. */ -export function initializeDirectives( - tView: TView, - lView: LView, - tNode: TElementNode | TContainerNode | TElementContainerNode, - directives: DirectiveDef[], - exportsMap: {[key: string]: number} | null, - hostDirectiveDefs: HostDirectiveDefs | null, + tNode: TNode, + publicName: string, + value: any, ) { - ngDevMode && assertFirstCreatePass(tView); - - // Publishes the directive types to DI so they can be injected. Needs to - // happen in a separate pass before the TNode flags have been initialized. - for (let i = 0; i < directives.length; i++) { - diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, directives[i].type); - } - - initTNodeFlags(tNode, tView.data.length, directives.length); - - // When the same token is provided by several directives on the same node, some rules apply in - // the viewEngine: - // - viewProviders have priority over providers - // - the last directive in NgModule.declarations has priority over the previous one - // So to match these rules, the order in which providers are added in the arrays is very - // important. - for (let i = 0; i < directives.length; i++) { - const def = directives[i]; - if (def.providersResolver) def.providersResolver(def); + if (!(tNode.type & (TNodeType.AnyRNode | TNodeType.Container))) { + return; } - let preOrderHooksFound = false; - let preOrderCheckHooksFound = false; - let directiveIdx = allocExpando(tView, lView, directives.length, null); - ngDevMode && - assertSame( - directiveIdx, - tNode.directiveStart, - 'TNode.directiveStart should point to just allocated space', - ); - - for (let i = 0; i < directives.length; i++) { - const def = directives[i]; - // Merge the attrs in the order of matches. This assumes that the first directive is the - // component itself, so that the component has the least priority. - tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, def.hostAttrs); - - configureViewWithDirective(tView, tNode, lView, directiveIdx, def); - saveNameToExportMap(directiveIdx, def, exportsMap); - - if (def.contentQueries !== null) tNode.flags |= TNodeFlags.hasContentQuery; - if (def.hostBindings !== null || def.hostAttrs !== null || def.hostVars !== 0) - tNode.flags |= TNodeFlags.hasHostBindings; - - const lifeCycleHooks: Partial = def.type.prototype; - // Only push a node index into the preOrderHooks array if this is the first - // pre-order hook found on this node. - if ( - !preOrderHooksFound && - (lifeCycleHooks.ngOnChanges || lifeCycleHooks.ngOnInit || lifeCycleHooks.ngDoCheck) - ) { - // We will push the actual hook function into this array later during dir instantiation. - // We cannot do it now because we must ensure hooks are registered in the same - // order that directives are created (i.e. injection order). - (tView.preOrderHooks ??= []).push(tNode.index); - preOrderHooksFound = true; - } - - if (!preOrderCheckHooksFound && (lifeCycleHooks.ngOnChanges || lifeCycleHooks.ngDoCheck)) { - (tView.preOrderCheckHooks ??= []).push(tNode.index); - preOrderCheckHooksFound = true; - } - - directiveIdx++; - } - - initializeInputAndOutputAliases(tView, tNode, hostDirectiveDefs); -} -/** - * Add `hostBindings` to the `TView.hostBindingOpCodes`. - * - * @param tView `TView` to which the `hostBindings` should be added. - * @param tNode `TNode` the element which contains the directive - * @param directiveIdx Directive index in view. - * @param directiveVarsIdx Where will the directive's vars be stored - * @param def `ComponentDef`/`DirectiveDef`, which contains the `hostVars`/`hostBindings` to add. - */ -export function registerHostBindingOpCodes( - tView: TView, - tNode: TNode, - directiveIdx: number, - directiveVarsIdx: number, - def: ComponentDef | DirectiveDef, -): void { - ngDevMode && assertFirstCreatePass(tView); + const inputConfig = tNode.inputs?.[publicName]; + const hostInputConfig = tNode.hostDirectiveInputs?.[publicName]; - const hostBindings = def.hostBindings; - if (hostBindings) { - let hostBindingOpCodes = tView.hostBindingOpCodes; - if (hostBindingOpCodes === null) { - hostBindingOpCodes = tView.hostBindingOpCodes = [] as any as HostBindingOpCodes; + if (hostInputConfig) { + for (let i = 0; i < hostInputConfig.length; i += 2) { + const index = hostInputConfig[i] as number; + const publicName = hostInputConfig[i + 1] as string; + const def = tView.data[index] as DirectiveDef; + setNgReflectProperty(lView, tNode, def.inputs[publicName][0], value); } - const elementIndx = ~tNode.index; - if (lastSelectedElementIdx(hostBindingOpCodes) != elementIndx) { - // Conditionally add select element so that we are more efficient in execution. - // NOTE: this is strictly not necessary and it trades code size for runtime perf. - // (We could just always add it.) - hostBindingOpCodes.push(elementIndx); - } - hostBindingOpCodes.push(directiveIdx, directiveVarsIdx, hostBindings); } -} -/** - * Returns the last selected element index in the `HostBindingOpCodes` - * - * For perf reasons we don't need to update the selected element index in `HostBindingOpCodes` only - * if it changes. This method returns the last index (or '0' if not found.) - * - * Selected element index are only the ones which are negative. - */ -function lastSelectedElementIdx(hostBindingOpCodes: HostBindingOpCodes): number { - let i = hostBindingOpCodes.length; - while (i > 0) { - const value = hostBindingOpCodes[--i]; - if (typeof value === 'number' && value < 0) { - return value; + // Note: we set the private name of the input as the reflected property, not the public one. + if (inputConfig) { + for (const index of inputConfig) { + const def = tView.data[index] as DirectiveDef; + setNgReflectProperty(lView, tNode, def.inputs[publicName][0], value); } } - return 0; } /** * Instantiate all the directives that were previously resolved on the current node. */ -function instantiateAllDirectives( - tView: TView, - lView: LView, - tNode: TDirectiveHostNode, - native: RNode, -) { +function instantiateAllDirectives(tView: TView, lView: LView, tNode: TDirectiveHostNode) { const start = tNode.directiveStart; const end = tNode.directiveEnd; @@ -1386,7 +356,7 @@ function instantiateAllDirectives( // since it is used to inject some special symbols like `ChangeDetectorRef`. if (isComponentHost(tNode)) { ngDevMode && assertTNodeType(tNode, TNodeType.AnyRNode); - addComponentLogic( + createComponentLView( lView, tNode as TElementNode, tView.data[start + tNode.componentOffset] as ComponentDef, @@ -1397,8 +367,6 @@ function instantiateAllDirectives( getOrCreateNodeInjectorForNode(tNode, lView); } - attachPatchData(native, lView); - const initialInputs = tNode.initialInputs; for (let i = start; i < end; i++) { const def = tView.data[i] as DirectiveDef; @@ -1453,21 +421,20 @@ export function invokeHostBindingsInCreationMode(def: DirectiveDef, directi * Matches the current node against all available selectors. * If a component is matched (at most one), it is returned in first position in the array. */ -function findDirectiveDefMatches( +export function findDirectiveDefMatches( tView: TView, tNode: TElementNode | TContainerNode | TElementContainerNode, -): [matches: DirectiveDef[], hostDirectiveDefs: HostDirectiveDefs | null] | null { +): DirectiveDef[] | null { ngDevMode && assertFirstCreatePass(tView); ngDevMode && assertTNodeType(tNode, TNodeType.AnyRNode | TNodeType.AnyContainer); const registry = tView.directiveRegistry; let matches: DirectiveDef[] | null = null; - let hostDirectiveDefs: HostDirectiveDefs | null = null; if (registry) { for (let i = 0; i < registry.length; i++) { const def = registry[i] as ComponentDef | DirectiveDef; if (isNodeMatchingSelectorList(tNode, def.selectors!, /* isProjectionMode */ false)) { - matches || (matches = []); + matches ??= []; if (isComponentDef(def)) { if (ngDevMode) { @@ -1478,210 +445,20 @@ function findDirectiveDefMatches( `Please use a different tag to activate the ${stringify(def.type)} component.`, ); - if (isComponentHost(tNode)) { + if (matches.length && isComponentDef(matches[0])) { throwMultipleComponentError(tNode, matches.find(isComponentDef)!.type, def.type); } } - // Components are inserted at the front of the matches array so that their lifecycle - // hooks run before any directive lifecycle hooks. This appears to be for ViewEngine - // compatibility. This logic doesn't make sense with host directives, because it - // would allow the host directives to undo any overrides the host may have made. - // To handle this case, the host directives of components are inserted at the beginning - // of the array, followed by the component. As such, the insertion order is as follows: - // 1. Host directives belonging to the selector-matched component. - // 2. Selector-matched component. - // 3. Host directives belonging to selector-matched directives. - // 4. Selector-matched directives. - if (def.findHostDirectiveDefs !== null) { - const hostDirectiveMatches: DirectiveDef[] = []; - hostDirectiveDefs = hostDirectiveDefs || new Map(); - def.findHostDirectiveDefs(def, hostDirectiveMatches, hostDirectiveDefs); - // Add all host directives declared on this component, followed by the component itself. - // Host directives should execute first so the host has a chance to override changes - // to the DOM made by them. - matches.unshift(...hostDirectiveMatches, def); - // Component is offset starting from the beginning of the host directives array. - const componentOffset = hostDirectiveMatches.length; - markAsComponentHost(tView, tNode, componentOffset); - } else { - // No host directives on this component, just add the - // component def to the beginning of the matches. - matches.unshift(def); - markAsComponentHost(tView, tNode, 0); - } + matches.unshift(def); } else { - // Append any host directives to the matches first. - hostDirectiveDefs = hostDirectiveDefs || new Map(); - def.findHostDirectiveDefs?.(def, matches, hostDirectiveDefs); matches.push(def); } } } } - ngDevMode && matches !== null && assertNoDuplicateDirectives(matches); - return matches === null ? null : [matches, hostDirectiveDefs]; -} -/** - * Marks a given TNode as a component's host. This consists of: - * - setting the component offset on the TNode. - * - storing index of component's host element so it will be queued for view refresh during CD. - */ -export function markAsComponentHost(tView: TView, hostTNode: TNode, componentOffset: number): void { - ngDevMode && assertFirstCreatePass(tView); - ngDevMode && assertGreaterThan(componentOffset, -1, 'componentOffset must be great than -1'); - hostTNode.componentOffset = componentOffset; - (tView.components ??= []).push(hostTNode.index); -} - -/** Caches local names and their matching directive indices for query and template lookups. */ -function cacheMatchingLocalNames( - tNode: TNode, - localRefs: string[] | null, - exportsMap: {[key: string]: number}, -): void { - if (localRefs) { - const localNames: (string | number)[] = (tNode.localNames = []); - - // Local names must be stored in tNode in the same order that localRefs are defined - // in the template to ensure the data is loaded in the same slots as their refs - // in the template (for template queries). - for (let i = 0; i < localRefs.length; i += 2) { - const index = exportsMap[localRefs[i + 1]]; - if (index == null) - throw new RuntimeError( - RuntimeErrorCode.EXPORT_NOT_FOUND, - ngDevMode && `Export of name '${localRefs[i + 1]}' not found!`, - ); - localNames.push(localRefs[i], index); - } - } -} - -/** - * Builds up an export map as directives are created, so local refs can be quickly mapped - * to their directive instances. - */ -function saveNameToExportMap( - directiveIdx: number, - def: DirectiveDef | ComponentDef, - exportsMap: {[key: string]: number} | null, -) { - if (exportsMap) { - if (def.exportAs) { - for (let i = 0; i < def.exportAs.length; i++) { - exportsMap[def.exportAs[i]] = directiveIdx; - } - } - if (isComponentDef(def)) exportsMap[''] = directiveIdx; - } -} - -/** - * Initializes the flags on the current node, setting all indices to the initial index, - * the directive count to 0, and adding the isComponent flag. - * @param index the initial index - */ -export function initTNodeFlags(tNode: TNode, index: number, numberOfDirectives: number) { - ngDevMode && - assertNotEqual( - numberOfDirectives, - tNode.directiveEnd - tNode.directiveStart, - 'Reached the max number of directives', - ); - tNode.flags |= TNodeFlags.isDirectiveHost; - // When the first directive is created on a node, save the index - tNode.directiveStart = index; - tNode.directiveEnd = index + numberOfDirectives; - tNode.providerIndexes = index; -} - -/** - * Setup directive for instantiation. - * - * We need to create a `NodeInjectorFactory` which is then inserted in both the `Blueprint` as well - * as `LView`. `TView` gets the `DirectiveDef`. - * - * @param tView `TView` - * @param tNode `TNode` - * @param lView `LView` - * @param directiveIndex Index where the directive will be stored in the Expando. - * @param def `DirectiveDef` - */ -export function configureViewWithDirective( - tView: TView, - tNode: TNode, - lView: LView, - directiveIndex: number, - def: DirectiveDef, -): void { - ngDevMode && - assertGreaterThanOrEqual(directiveIndex, HEADER_OFFSET, 'Must be in Expando section'); - tView.data[directiveIndex] = def; - const directiveFactory = - def.factory || ((def as Writable>).factory = getFactoryDef(def.type, true)); - // Even though `directiveFactory` will already be using `ɵɵdirectiveInject` in its generated code, - // we also want to support `inject()` directly from the directive constructor context so we set - // `ɵɵdirectiveInject` as the inject implementation here too. - const nodeInjectorFactory = new NodeInjectorFactory( - directiveFactory, - isComponentDef(def), - ɵɵdirectiveInject, - ); - tView.blueprint[directiveIndex] = nodeInjectorFactory; - lView[directiveIndex] = nodeInjectorFactory; - - registerHostBindingOpCodes( - tView, - tNode, - directiveIndex, - allocExpando(tView, lView, def.hostVars, NO_CHANGE), - def, - ); -} - -/** - * Gets the initial set of LView flags based on the component definition that the LView represents. - * @param def Component definition from which to determine the flags. - */ -export function getInitialLViewFlagsFromDef(def: ComponentDef): LViewFlags { - let flags = LViewFlags.CheckAlways; - if (def.signals) { - flags = LViewFlags.SignalView; - } else if (def.onPush) { - flags = LViewFlags.Dirty; - } - return flags; -} - -function addComponentLogic(lView: LView, hostTNode: TElementNode, def: ComponentDef): void { - const native = getNativeByTNode(hostTNode, lView) as RElement; - const tView = getOrCreateComponentTView(def); - - // Only component views should be added to the view tree directly. Embedded views are - // accessed through their containers because they may be removed / re-added later. - const rendererFactory = lView[ENVIRONMENT].rendererFactory; - const componentView = addToEndOfViewTree( - lView, - createLView( - lView, - tView, - null, - getInitialLViewFlagsFromDef(def), - native, - hostTNode as TElementNode, - null, - rendererFactory.createRenderer(native, def), - null, - null, - null, - ), - ); - - // Component view will always be created before any injected LContainers, - // so this is a regular element, wrap it with the component view - lView[hostTNode.index] = componentView; + return matches; } export function elementAttributeInternal( @@ -1746,198 +523,19 @@ function setInputsFromAttrs( ): void { const initialInputs: InitialInputs | null = initialInputData![directiveIndex]; if (initialInputs !== null) { - for (let i = 0; i < initialInputs.length; ) { - const publicName = initialInputs[i++] as string; - const privateName = initialInputs[i++] as string; - const flags = initialInputs[i++] as InputFlags; - const value = initialInputs[i++] as string; + for (let i = 0; i < initialInputs.length; i += 2) { + const lookupName = initialInputs[i]; + const value = initialInputs[i + 1]; - writeToDirectiveInput(def, instance, publicName, privateName, flags, value); + writeToDirectiveInput(def, instance, lookupName, value); if (ngDevMode) { - const nativeElement = getNativeByTNode(tNode, lView) as RElement; - setNgReflectProperty(lView, nativeElement, tNode.type, privateName, value); + setNgReflectProperty(lView, tNode, def.inputs[lookupName][0], value); } } } } -/** - * Generates initialInputData for a node and stores it in the template's static storage - * so subsequent template invocations don't have to recalculate it. - * - * initialInputData is an array containing values that need to be set as input properties - * for directives on this node, but only once on creation. We need this array to support - * the case where you set an @Input property of a directive using attribute-like syntax. - * e.g. if you have a `name` @Input, you can set it once like this: - * - * - * - * @param inputs Input alias map that was generated from the directive def inputs. - * @param directiveIndex Index of the directive that is currently being processed. - * @param attrs Static attrs on this node. - */ -function generateInitialInputs( - inputs: NodeInputBindings, - directiveIndex: number, - attrs: TAttributes, -): InitialInputs | null { - let inputsToStore: InitialInputs | null = null; - let i = 0; - while (i < attrs.length) { - const attrName = attrs[i]; - if (attrName === AttributeMarker.NamespaceURI) { - // We do not allow inputs on namespaced attributes. - i += 4; - continue; - } else if (attrName === AttributeMarker.ProjectAs) { - // Skip over the `ngProjectAs` value. - i += 2; - continue; - } - - // If we hit any other attribute markers, we're done anyway. None of those are valid inputs. - if (typeof attrName === 'number') break; - - if (inputs.hasOwnProperty(attrName as string)) { - if (inputsToStore === null) inputsToStore = []; - - // Find the input's public name from the input store. Note that we can be found easier - // through the directive def, but we want to do it using the inputs store so that it can - // account for host directive aliases. - const inputConfig = inputs[attrName as string]; - for (let j = 0; j < inputConfig.length; j += 3) { - if (inputConfig[j] === directiveIndex) { - inputsToStore.push( - attrName as string, - inputConfig[j + 1] as string, - inputConfig[j + 2] as InputFlags, - attrs[i + 1] as string, - ); - // A directive can't have multiple inputs with the same name so we can break here. - break; - } - } - } - - i += 2; - } - return inputsToStore; -} - -////////////////////////// -//// ViewContainer & View -////////////////////////// - -/** - * Creates a LContainer, either from a container instruction, or for a ViewContainerRef. - * - * @param hostNative The host element for the LContainer - * @param hostTNode The host TNode for the LContainer - * @param currentView The parent view of the LContainer - * @param native The native comment element - * @param isForViewContainerRef Optional a flag indicating the ViewContainerRef case - * @returns LContainer - */ -export function createLContainer( - hostNative: RElement | RComment | LView, - currentView: LView, - native: RComment, - tNode: TNode, -): LContainer { - ngDevMode && assertLView(currentView); - const lContainer: LContainer = [ - hostNative, // host native - true, // Boolean `true` in this position signifies that this is an `LContainer` - 0, // flags - currentView, // parent - null, // next - tNode, // t_host - null, // dehydrated views - native, // native, - null, // view refs - null, // moved views - ]; - ngDevMode && - assertEqual( - lContainer.length, - CONTAINER_HEADER_OFFSET, - 'Should allocate correct number of slots for LContainer header.', - ); - return lContainer; -} - -/** Refreshes all content queries declared by directives in a given view */ -export function refreshContentQueries(tView: TView, lView: LView): void { - const contentQueries = tView.contentQueries; - if (contentQueries !== null) { - const prevConsumer = setActiveConsumer(null); - try { - for (let i = 0; i < contentQueries.length; i += 2) { - const queryStartIdx = contentQueries[i]; - const directiveDefIdx = contentQueries[i + 1]; - if (directiveDefIdx !== -1) { - const directiveDef = tView.data[directiveDefIdx] as DirectiveDef; - ngDevMode && assertDefined(directiveDef, 'DirectiveDef not found.'); - ngDevMode && - assertDefined(directiveDef.contentQueries, 'contentQueries function should be defined'); - setCurrentQueryIndex(queryStartIdx); - directiveDef.contentQueries!(RenderFlags.Update, lView[directiveDefIdx], directiveDefIdx); - } - } - } finally { - setActiveConsumer(prevConsumer); - } - } -} - -/** - * Adds LView or LContainer to the end of the current view tree. - * - * This structure will be used to traverse through nested views to remove listeners - * and call onDestroy callbacks. - * - * @param lView The view where LView or LContainer should be added - * @param adjustedHostIndex Index of the view's host node in LView[], adjusted for header - * @param lViewOrLContainer The LView or LContainer to add to the view tree - * @returns The state passed in - */ -export function addToEndOfViewTree( - lView: LView, - lViewOrLContainer: T, -): T { - // TODO(benlesh/misko): This implementation is incorrect, because it always adds the LContainer - // to the end of the queue, which means if the developer retrieves the LContainers from RNodes out - // of order, the change detection will run out of order, as the act of retrieving the the - // LContainer from the RNode is what adds it to the queue. - if (lView[CHILD_HEAD]) { - lView[CHILD_TAIL]![NEXT] = lViewOrLContainer; - } else { - lView[CHILD_HEAD] = lViewOrLContainer; - } - lView[CHILD_TAIL] = lViewOrLContainer; - return lViewOrLContainer; -} - -/////////////////////////////// -//// Change detection -/////////////////////////////// - -export function executeViewQueryFn( - flags: RenderFlags, - viewQueryFn: ViewQueriesFunction, - component: T, -): void { - ngDevMode && assertDefined(viewQueryFn, 'View queries function to execute must be defined.'); - setCurrentQueryIndex(0); - const prevConsumer = setActiveConsumer(null); - try { - viewQueryFn(flags, component); - } finally { - setActiveConsumer(prevConsumer); - } -} - /////////////////////////////// //// Bindings & interpolations /////////////////////////////// @@ -1974,7 +572,7 @@ export function storePropertyBindingMetadata( // Since we don't have a concept of the "first update pass" we need to check for presence of the // binding meta-data to decide if one should be stored (or if was stored already). if (tData[bindingIndex] === null) { - if (tNode.inputs == null || !tNode.inputs[propertyName]) { + if (!tNode.inputs?.[propertyName] && !tNode.hostDirectiveInputs?.[propertyName]) { const propBindingIdxs = tNode.propertyBindings || (tNode.propertyBindings = []); propBindingIdxs.push(bindingIndex); let bindingMetadata = propertyName; @@ -1987,15 +585,6 @@ export function storePropertyBindingMetadata( } } -export function getOrCreateLViewCleanup(view: LView): any[] { - // top level variables should not be exported for performance reasons (PERF_NOTES.md) - return (view[CLEANUP] ??= []); -} - -export function getOrCreateTViewCleanup(tView: TView): any[] { - return (tView.cleanup ??= []); -} - /** * There are cases where the sub component's renderer needs to be included * instead of the current renderer (see the componentSyntheticHost* instructions). @@ -2025,41 +614,111 @@ export function handleError(lView: LView, error: any): void { } /** - * Set the inputs of directives at the current node to corresponding value. + * Set all directive inputs with the specific public name on the node. * - * @param tView The current TView - * @param lView the `LView` which contains the directives. - * @param inputs mapping between the public "input" name and privately-known, - * possibly minified, property names to write to. + * @param tNode TNode on which the input is being set. + * @param tView Current TView + * @param lView `LView` which contains the directives. + * @param publicName Public name of the input being set. * @param value Value to set. */ -export function setInputsForProperty( +export function setAllInputsForProperty( + tNode: TNode, tView: TView, lView: LView, - inputs: NodeInputBindings[typeof publicName], publicName: string, value: unknown, -): void { - for (let i = 0; i < inputs.length; ) { - const index = inputs[i++] as number; - const privateName = inputs[i++] as string; - const flags = inputs[i++] as InputFlags; - const instance = lView[index]; - ngDevMode && assertIndexInRange(lView, index); - const def = tView.data[index] as DirectiveDef; +): boolean { + const inputs = tNode.inputs?.[publicName]; + const hostDirectiveInputs = tNode.hostDirectiveInputs?.[publicName]; + let hasMatch = false; + + if (hostDirectiveInputs) { + for (let i = 0; i < hostDirectiveInputs.length; i += 2) { + const index = hostDirectiveInputs[i] as number; + ngDevMode && assertIndexInRange(lView, index); + const publicName = hostDirectiveInputs[i + 1] as string; + const def = tView.data[index] as DirectiveDef; + writeToDirectiveInput(def, lView[index], publicName, value); + hasMatch = true; + } + } - writeToDirectiveInput(def, instance, publicName, privateName, flags, value); + if (inputs) { + for (const index of inputs) { + ngDevMode && assertIndexInRange(lView, index); + const instance = lView[index]; + const def = tView.data[index] as DirectiveDef; + writeToDirectiveInput(def, instance, publicName, value); + hasMatch = true; + } } + + return hasMatch; } /** - * Updates a text binding at a given index in a given LView. + * Sets an input value only on a specific directive and its host directives. + * @param tNode TNode on which the input is being set. + * @param tView Current TView + * @param lView `LView` which contains the directives. + * @param target Directive on which to set the input. + * @param publicName Public name of the input being set. + * @param value Value to set. */ -export function textBindingInternal(lView: LView, index: number, value: string): void { - ngDevMode && assertString(value, 'Value should be a string'); - ngDevMode && assertNotSame(value, NO_CHANGE as any, 'value should not be NO_CHANGE'); - ngDevMode && assertIndexInRange(lView, index); - const element = getNativeByIndex(index, lView) as any as RText; - ngDevMode && assertDefined(element, 'native element should exist'); - updateTextNode(lView[RENDERER], element, value); +export function setDirectiveInput( + tNode: TNode, + tView: TView, + lView: LView, + target: DirectiveDef, + publicName: string, + value: string, +): boolean { + let hostIndex: number | null = null; + let hostDirectivesStart: number | null = null; + let hostDirectivesEnd: number | null = null; + let hasSet = false; + + if (ngDevMode && !tNode.directiveToIndex?.has(target.type)) { + throw new Error(`Node does not have a directive with type ${target.type.name}`); + } + + const data = tNode.directiveToIndex!.get(target.type)!; + + if (typeof data === 'number') { + hostIndex = data; + } else { + [hostIndex, hostDirectivesStart, hostDirectivesEnd] = data; + } + + if ( + hostDirectivesStart !== null && + hostDirectivesEnd !== null && + tNode.hostDirectiveInputs?.hasOwnProperty(publicName) + ) { + const hostDirectiveInputs = tNode.hostDirectiveInputs[publicName]; + + for (let i = 0; i < hostDirectiveInputs.length; i += 2) { + const index = hostDirectiveInputs[i] as number; + + if (index >= hostDirectivesStart && index <= hostDirectivesEnd) { + ngDevMode && assertIndexInRange(lView, index); + const def = tView.data[index] as DirectiveDef; + const hostDirectivePublicName = hostDirectiveInputs[i + 1] as string; + writeToDirectiveInput(def, lView[index], hostDirectivePublicName, value); + hasSet = true; + } else if (index > hostDirectivesEnd) { + // Directives here are in ascending order so we can stop looking once we're past the range. + break; + } + } + } + + if (hostIndex !== null) { + ngDevMode && assertIndexInRange(lView, hostIndex); + writeToDirectiveInput(target, lView[hostIndex], publicName, value); + hasSet = true; + } + + return hasSet; } diff --git a/packages/core/src/render3/instructions/template.ts b/packages/core/src/render3/instructions/template.ts index ce9ca7c292f8..f4f456ea7977 100644 --- a/packages/core/src/render3/instructions/template.ts +++ b/packages/core/src/render3/instructions/template.ts @@ -27,6 +27,7 @@ import {isDirectiveHost} from '../interfaces/type_checks'; import {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView, TViewType} from '../interfaces/view'; import {appendChild} from '../node_manipulation'; import { + getBindingsEnabled, getLView, getTView, isInSkipHydrationBlock, @@ -34,15 +35,16 @@ import { setCurrentTNode, wasLastNodeCreated, } from '../state'; +import {getOrCreateTNode} from '../tnode_manipulation'; +import {mergeHostAttrs} from '../util/attrs_utils'; import {getConstant} from '../util/view_utils'; +import {addToEndOfViewTree, createTView} from '../view/construction'; +import {createLContainer} from '../view/container'; +import {resolveDirectives} from '../view/directives'; import { - addToEndOfViewTree, createDirectivesInstances, - createLContainer, - createTView, - getOrCreateTNode, - resolveDirectives, + findDirectiveDefMatches, saveResolvedLocalsInData, } from './shared'; @@ -64,7 +66,19 @@ function templateFirstCreatePass( // TODO(pk): refactor getOrCreateTNode to have the "create" only version const tNode = getOrCreateTNode(tView, index, TNodeType.Container, tagName || null, attrs || null); - resolveDirectives(tView, lView, tNode, getConstant(tViewConsts, localRefsIndex)); + if (getBindingsEnabled()) { + resolveDirectives( + tView, + lView, + tNode, + getConstant(tViewConsts, localRefsIndex), + findDirectiveDefMatches, + ); + } + + // Merge the template attrs last so that they have the highest priority. + tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs); + registerPostOrderHooks(tView, tNode); const embeddedTView = (tNode.tView = createTView( diff --git a/packages/core/src/render3/instructions/text.ts b/packages/core/src/render3/instructions/text.ts index 13c52c295173..722d7446818f 100644 --- a/packages/core/src/render3/instructions/text.ts +++ b/packages/core/src/render3/instructions/text.ts @@ -12,8 +12,9 @@ import {isDetachedByI18n} from '../../i18n/utils'; import {assertEqual, assertIndexInRange} from '../../util/assert'; import {TElementNode, TNode, TNodeType} from '../interfaces/node'; import {RText} from '../interfaces/renderer_dom'; -import {HEADER_OFFSET, HYDRATION, LView, RENDERER, T_HOST, TView} from '../interfaces/view'; -import {appendChild, createTextNode} from '../node_manipulation'; +import {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView} from '../interfaces/view'; +import {appendChild} from '../node_manipulation'; +import {createTextNode} from '../dom_node_manipulation'; import { getBindingIndex, getLView, @@ -23,8 +24,7 @@ import { setCurrentTNode, wasLastNodeCreated, } from '../state'; - -import {getOrCreateTNode} from './shared'; +import {getOrCreateTNode} from '../tnode_manipulation'; /** * Create static text node diff --git a/packages/core/src/render3/instructions/text_interpolation.ts b/packages/core/src/render3/instructions/text_interpolation.ts index 85342cae3cbf..c8afff83d992 100644 --- a/packages/core/src/render3/instructions/text_interpolation.ts +++ b/packages/core/src/render3/instructions/text_interpolation.ts @@ -5,8 +5,13 @@ * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.dev/license */ +import {assertDefined, assertIndexInRange, assertNotSame, assertString} from '../../util/assert'; +import {RText} from '../interfaces/renderer_dom'; +import {LView, RENDERER} from '../interfaces/view'; +import {updateTextNode} from '../dom_node_manipulation'; import {getLView, getSelectedIndex} from '../state'; import {NO_CHANGE} from '../tokens'; +import {getNativeByIndex} from '../util/view_utils'; import { interpolation1, @@ -19,7 +24,6 @@ import { interpolation8, interpolationV, } from './interpolation'; -import {textBindingInternal} from './shared'; /** * @@ -449,3 +453,15 @@ export function ɵɵtextInterpolateV(values: any[]): typeof ɵɵtextInterpolateV } return ɵɵtextInterpolateV; } + +/** + * Updates a text binding at a given index in a given LView. + */ +function textBindingInternal(lView: LView, index: number, value: string): void { + ngDevMode && assertString(value, 'Value should be a string'); + ngDevMode && assertNotSame(value, NO_CHANGE as any, 'value should not be NO_CHANGE'); + ngDevMode && assertIndexInRange(lView, index); + const element = getNativeByIndex(index, lView) as any as RText; + ngDevMode && assertDefined(element, 'native element should exist'); + updateTextNode(lView[RENDERER], element, value); +} diff --git a/packages/core/src/render3/instructions/write_to_directive_input.ts b/packages/core/src/render3/instructions/write_to_directive_input.ts index c896004b6b1f..8e9101c53a05 100644 --- a/packages/core/src/render3/instructions/write_to_directive_input.ts +++ b/packages/core/src/render3/instructions/write_to_directive_input.ts @@ -13,17 +13,35 @@ import {InputSignalNode} from '../../authoring/input/input_signal_node'; import {applyValueToInputField} from '../apply_value_input_field'; import {DirectiveDef} from '../interfaces/definition'; import {InputFlags} from '../interfaces/input_flags'; +import {isFactory} from '../interfaces/injector'; export function writeToDirectiveInput( def: DirectiveDef, instance: T, publicName: string, - privateName: string, - flags: InputFlags, value: unknown, ) { const prevConsumer = setActiveConsumer(null); try { + if (ngDevMode) { + if (!def.inputs.hasOwnProperty(publicName)) { + throw new Error( + `ASSERTION ERROR: Directive ${def.type.name} does not have an input with a public name of "${publicName}"`, + ); + } + + // Usually we resolve the directive instance using `LView[someIndex]` before writing to an + // input, however if the read happens to early, the `LView[someIndex]` might actually be a + // `NodeInjectorFactory`. Check for this specific case here since it can break in subtle ways. + if (isFactory(instance)) { + throw new Error( + `ASSERTION ERROR: Cannot write input to factory for type ${def.type.name}. Directive has not been created yet.`, + ); + } + } + + const [privateName, flags, transform] = def.inputs[publicName]; + // If we know we are dealing with a signal input, we cache its reference // in a tree-shakable way. The input signal node can then be used for // value transform execution or actual value updates without introducing @@ -38,10 +56,9 @@ export function writeToDirectiveInput( // delegating to features like `NgOnChanges`. if (inputSignalNode !== null && inputSignalNode.transformFn !== undefined) { value = inputSignalNode.transformFn(value); - } - // If there is a decorator input transform, run it. - if ((flags & InputFlags.HasDecoratorInputTransform) !== 0) { - value = def.inputTransforms![privateName]!.call(instance, value); + } else if (transform !== null) { + // If there is a decorator input transform, run it. + value = transform.call(instance, value); } if (def.setInput !== null) { diff --git a/packages/core/src/render3/interfaces/attribute_marker.ts b/packages/core/src/render3/interfaces/attribute_marker.ts index 4b2e4261c034..4be81ce23bb7 100644 --- a/packages/core/src/render3/interfaces/attribute_marker.ts +++ b/packages/core/src/render3/interfaces/attribute_marker.ts @@ -34,12 +34,12 @@ export const enum AttributeMarker { * ## Example: * * Given: - * ``` - *
    ... + * ```html + *
    ...
    * ``` * * the generated code is: - * ``` + * ```ts * var _c1 = [AttributeMarker.Classes, 'foo', 'bar', 'baz']; * ``` */ @@ -53,12 +53,12 @@ export const enum AttributeMarker { * ## Example: * * Given: - * ``` + * ```html *
    ...
    * ``` * * the generated code is: - * ``` + * ```ts * var _c1 = [AttributeMarker.Styles, 'width', '100px', 'height'. '200px', 'color', 'red']; * ``` */ @@ -69,13 +69,13 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *
    * ``` * * the generated code is: * - * ``` + * ```ts * var _c1 = ['moo', 'car', AttributeMarker.Bindings, 'foo', 'bar']; * ``` */ @@ -86,7 +86,7 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *
    * ``` * @@ -112,13 +112,13 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *

    * ``` * * the generated code for the `element()` instruction would include: * - * ``` + * ```ts * ['attr', 'value', AttributeMarker.ProjectAs, ['', 'title', '']] * ``` */ @@ -129,14 +129,15 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *
    * ``` * * the generated code is: * - * ``` + * ```ts * var _c1 = ['moo', 'car', AttributeMarker.I18n, 'foo', 'bar']; + * ``` */ I18n = 6, } diff --git a/packages/core/src/render3/interfaces/container.ts b/packages/core/src/render3/interfaces/container.ts index e0fdd5e7ae2e..92bae6e40c54 100644 --- a/packages/core/src/render3/interfaces/container.ts +++ b/packages/core/src/render3/interfaces/container.ts @@ -118,7 +118,7 @@ export interface LContainer extends Array { } /** Flags associated with an LContainer (saved in LContainer[FLAGS]) */ -export enum LContainerFlags { +export const enum LContainerFlags { None = 0, /** * Flag to signify that this `LContainer` may have transplanted views which need to be change diff --git a/packages/core/src/render3/interfaces/definition.ts b/packages/core/src/render3/interfaces/definition.ts index 0828b51a0292..e2da569dd552 100644 --- a/packages/core/src/render3/interfaces/definition.ts +++ b/packages/core/src/render3/interfaces/definition.ts @@ -110,17 +110,10 @@ export interface DirectiveDef { * A dictionary mapping the inputs' public name to their minified property names * (along with flags if there are any). */ - readonly inputs: {[P in keyof T]?: string | [minifiedName: string, flags: InputFlags]}; - - /** - * A dictionary mapping the private names of inputs to their transformation functions. - * Note: the private names are used for the keys, rather than the public ones, because public - * names can be re-aliased in host directives which would invalidate the lookup. - * - * Note: Signal inputs will not have transforms captured here. This is because their - * transform function is already integrated into the `InputSignal`. - */ - readonly inputTransforms: {[classPropertyName: string]: InputTransformFunction} | null; + readonly inputs: Record< + string, + [minifiedName: string, flags: InputFlags, transform: InputTransformFunction | null] + >; /** * Contains the raw input information produced by the compiler. Can be @@ -141,7 +134,7 @@ export interface DirectiveDef { * are their aliases if any, or their original unminified property names * (as in `@Output('alias') propertyName: any;`). */ - readonly outputs: {[P in keyof T]?: string}; + readonly outputs: Record; /** * Function to create and refresh content queries associated with a given directive. diff --git a/packages/core/src/render3/interfaces/injector.ts b/packages/core/src/render3/interfaces/injector.ts index 6d51b13544c0..da035a2f9840 100644 --- a/packages/core/src/render3/interfaces/injector.ts +++ b/packages/core/src/render3/interfaces/injector.ts @@ -202,7 +202,7 @@ export class NodeInjectorFactory { * Example: * * If we have a component and directive active an a single element as declared here - * ``` + * ```ts * component: * providers: [ {provide: String, useValue: 'component', multi: true} ], * viewProviders: [ {provide: String, useValue: 'componentView', multi: true} ], @@ -213,7 +213,7 @@ export class NodeInjectorFactory { * * Then the expected results are: * - * ``` + * ```ts * providers: ['component', 'directive'] * viewProviders: ['component', 'componentView', 'directive'] * ``` @@ -238,7 +238,7 @@ export class NodeInjectorFactory { * Example: * * Given: - * ``` + * ```ts * providers: [ {provide: String, useValue: 'all', multi: true} ], * viewProviders: [ {provide: String, useValue: 'viewOnly', multi: true} ], * ``` diff --git a/packages/core/src/render3/interfaces/node.ts b/packages/core/src/render3/interfaces/node.ts index 62e94bd828a9..f789847806b0 100644 --- a/packages/core/src/render3/interfaces/node.ts +++ b/packages/core/src/render3/interfaces/node.ts @@ -5,11 +5,11 @@ * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.dev/license */ +import {Type} from '../../interface/type'; import {KeyValueArray} from '../../util/array_utils'; import {TStylingRange} from '../interfaces/styling'; import {AttributeMarker} from './attribute_marker'; -import {InputFlags} from './input_flags'; import {TIcu} from './i18n'; import {CssSelector} from './projection'; import {RNode} from './renderer_dom'; @@ -244,7 +244,7 @@ export interface TNode { * such a case the value stores an array of text nodes to insert. * * Example: - * ``` + * ```html *
    * Hello World! *
    @@ -257,7 +257,7 @@ export interface TNode { * `` itself. * * Pseudo code: - * ``` + * ```ts * if (insertBeforeIndex === null) { * // append as normal * } else if (Array.isArray(insertBeforeIndex)) { @@ -417,7 +417,7 @@ export interface TNode { localNames: (string | number)[] | null; /** Information about input properties that need to be set once from attribute data. */ - initialInputs: InitialInputData | null | undefined; + initialInputs: InitialInputData | null; /** * Input data for all directives on this node. `null` means that there are no directives with @@ -425,12 +425,27 @@ export interface TNode { */ inputs: NodeInputBindings | null; + /** + * Input data for host directives applied to the node. + */ + hostDirectiveInputs: HostDirectiveInputs | null; + /** * Output data for all directives on this node. `null` means that there are no directives with * outputs on this node. */ outputs: NodeOutputBindings | null; + /** + * Input data for host directives applied to the node. + */ + hostDirectiveOutputs: HostDirectiveOutputs | null; + + /** + * Mapping between directive classes applied to the node and their indexes. + */ + directiveToIndex: DirectiveIndexMap | null; + /** * The TView attached to this node. * @@ -490,12 +505,12 @@ export interface TNode { * * For easier discussion assume this example: * ``'s view definition: - * ``` + * ```html * content1 * content2 * ``` * ``'s view definition: - * ``` + * ```html * * ``` * @@ -558,7 +573,7 @@ export interface TNode { * styling than the instruction. * * Imagine: - * ``` + * ```angular-ts *
    * * @Directive({ @@ -772,37 +787,28 @@ export interface TLetDeclarationNode extends TNode { export type TDirectiveHostNode = TElementNode | TContainerNode | TElementContainerNode; /** - * Store the runtime output names for all the directives. - * - * i+0: directive instance index - * i+1: privateName + * Maps the public names of outputs available on a specific node to the index + * of the directive instance that defines the output, for example: * - * e.g. * ``` * { - * "publicName": [0, 'change-minified'] + * "publicName": [0, 5] * } + * ``` */ -export type NodeOutputBindings = Record; +export type NodeOutputBindings = Record; /** - * Store the runtime input for all directives applied to a node. - * - * This allows efficiently setting the same input on a directive that - * might apply to multiple directives. - * - * i+0: directive instance index - * i+1: privateName - * i+2: input flags + * Maps the public names of inputs applied to a specific node to the index of the + * directive instance to which the input value should be written, for example: * - * e.g. * ``` * { - * "publicName": [0, 'change-minified', ] + * "publicName": [0, 5] * } * ``` */ -export type NodeInputBindings = Record; +export type NodeInputBindings = Record; /** * This array contains information about input properties that @@ -812,9 +818,8 @@ export type NodeInputBindings = Record * * Within each sub-array: * - * i+0: attribute name - * i+1: minified/internal input name - * i+2: initial value + * i+0: public name + * i+1: initial value * * If a directive on a node does not have any input properties * that should be set from attributes, its index is set to null @@ -835,7 +840,51 @@ export type InitialInputData = (InitialInputs | null)[]; * * e.g. ['role-min', 'minified-input', 'button'] */ -export type InitialInputs = (string | InputFlags)[]; +export type InitialInputs = string[]; + +/** + * Represents inputs coming from a host directive and exposed on a TNode. + * + * - The key is the public name of an input as it is exposed on the specific node. + * - The value is an array where: + * - i+0: Index of the host directive that should be written to. + * - i+1: Public name of the input as it was defined on the host directive before aliasing. + */ +export type HostDirectiveInputs = Record; + +/** + * Represents outputs coming from a host directive and exposed on a TNode. + * + * - The key is the public name of an output as it is exposed on the specific node. + * - The value is an array where: + * - i+0: Index of the host directive on which the output is defined.. + * - i+1: Public name of the output as it was defined on the host directive before aliasing. + */ +export type HostDirectiveOutputs = Record; + +/** + * Represents a map between a class reference and the index at which its directive is available on + * a specific TNode. The value can be either: + * 1. A number means that there's only one selector-matched directive on the node and it + * doesn't have any host directives. + * 2. An array means that there's a selector-matched directive and it has host directives. + * The array is structured as follows: + * - 0: Index of the selector-matched directive. + * - 1: Start index of the range within which the host directives are defined. + * - 2: End of the host directive range. + * + * Example: + * ``` + * Map { + * [NoHostDirectives]: 5, + * [HasHostDirectives]: [10, 6, 8], + * } + * ``` + */ +export type DirectiveIndexMap = Map< + Type, + number | [directiveIndex: number, hostDirectivesStart: number, hostDirectivesEnd: number] +>; /** * Type representing a set of TNodes that can have local refs (`#foo`) placed on them. diff --git a/packages/core/src/render3/interfaces/type_checks.ts b/packages/core/src/render3/interfaces/type_checks.ts index 48f3f8d8ab47..4b67f1fb307a 100644 --- a/packages/core/src/render3/interfaces/type_checks.ts +++ b/packages/core/src/render3/interfaces/type_checks.ts @@ -45,6 +45,7 @@ export function isComponentDef(def: DirectiveDef): def is ComponentDef } export function isRootView(target: LView): boolean { + // Determines whether a given LView is marked as a root view. return (target[FLAGS] & LViewFlags.IsRoot) !== 0; } diff --git a/packages/core/src/render3/interfaces/view.ts b/packages/core/src/render3/interfaces/view.ts index 56d88c003f8a..73bdbfb692a8 100644 --- a/packages/core/src/render3/interfaces/view.ts +++ b/packages/core/src/render3/interfaces/view.ts @@ -141,7 +141,7 @@ export interface LView extends Array { * Store the `TNode` of the location where the current `LView` is inserted into. * * Given: - * ``` + * ```html *
    * *
    @@ -156,7 +156,7 @@ export interface LView extends Array { * insertion information in the `TView` and instead we must store it in the `LView[T_HOST]`. * * So to determine where is our insertion parent we would execute: - * ``` + * ```ts * const parentLView = lView[PARENT]; * const parentTNode = lView[T_HOST]; * const insertionParent = parentLView[parentTNode.index]; @@ -251,7 +251,7 @@ export interface LView extends Array { * `DECLARATION_VIEW`. * * Example: - * ``` + * ```html * <#VIEW #myComp> *
    * ... @@ -276,7 +276,7 @@ export interface LView extends Array { * `DECLARATION_COMPONENT_VIEW` to differentiate them. As in this example. * * Example showing intra component `LView` movement. - * ``` + * ```html * <#VIEW #myComp> *
    * Content to render when condition is true. @@ -286,7 +286,7 @@ export interface LView extends Array { * The `thenBlock` and `elseBlock` is moved but not transplanted. * * Example showing inter component `LView` movement (transplanted view). - * ``` + * ```html * <#VIEW #myComp> * ... * diff --git a/packages/core/src/render3/jit/environment.ts b/packages/core/src/render3/jit/environment.ts index 9f5ef0eccbd0..5c0a8120465c 100644 --- a/packages/core/src/render3/jit/environment.ts +++ b/packages/core/src/render3/jit/environment.ts @@ -49,7 +49,6 @@ export const angularCoreEnv: {[name: string]: unknown} = (() => ({ 'ɵɵProvidersFeature': r3.ɵɵProvidersFeature, 'ɵɵCopyDefinitionFeature': r3.ɵɵCopyDefinitionFeature, 'ɵɵInheritDefinitionFeature': r3.ɵɵInheritDefinitionFeature, - 'ɵɵInputTransformsFeature': r3.ɵɵInputTransformsFeature, 'ɵɵExternalStylesFeature': r3.ɵɵExternalStylesFeature, 'ɵɵnextContext': r3.ɵɵnextContext, 'ɵɵnamespaceHTML': r3.ɵɵnamespaceHTML, diff --git a/packages/core/src/render3/node_manipulation.ts b/packages/core/src/render3/node_manipulation.ts index d4e1c4a9cce0..637adef065e5 100644 --- a/packages/core/src/render3/node_manipulation.ts +++ b/packages/core/src/render3/node_manipulation.ts @@ -12,33 +12,30 @@ import {NotificationSource} from '../change_detection/scheduling/zoneless_schedu import {hasInSkipHydrationBlockFlag} from '../hydration/skip_hydration'; import {ViewEncapsulation} from '../metadata/view'; import {RendererStyleFlags2} from '../render/api_flags'; -import {addToArray, removeFromArray} from '../util/array_utils'; import { assertDefined, assertEqual, assertFunction, assertNotReactive, assertNumber, - assertString, } from '../util/assert'; -import {escapeCommentText} from '../util/dom'; +import {isDetachedByI18n} from '../i18n/utils'; import { assertLContainer, - assertLView, assertParentView, assertProjectionSlots, assertTNodeForLView, } from './assert'; import {attachPatchData} from './context_discovery'; -import {icuContainerIterate} from './i18n/i18n_tree_shaking'; import { - CONTAINER_HEADER_OFFSET, - LContainer, - LContainerFlags, - MOVED_VIEWS, - NATIVE, -} from './interfaces/container'; + nativeAppendChild, + nativeAppendOrInsertBefore, + nativeInsertBefore, + nativeRemoveNode, +} from './dom_node_manipulation'; +import {icuContainerIterate} from './i18n/i18n_tree_shaking'; +import {CONTAINER_HEADER_OFFSET, LContainer, MOVED_VIEWS, NATIVE} from './interfaces/container'; import {ComponentDef} from './interfaces/definition'; import {NodeInjectorFactory} from './interfaces/injector'; import {unregisterLView} from './interfaces/lview_tracking'; @@ -51,8 +48,8 @@ import { TProjectionNode, } from './interfaces/node'; import {Renderer} from './interfaces/renderer'; -import {RComment, RElement, RNode, RText} from './interfaces/renderer_dom'; -import {isDestroyed, isLContainer, isLView} from './interfaces/type_checks'; +import {RElement, RNode} from './interfaces/renderer_dom'; +import {isComponentHost, isDestroyed, isLContainer, isLView} from './interfaces/type_checks'; import { CHILD_HEAD, CLEANUP, @@ -81,14 +78,7 @@ import { import {assertTNodeType} from './node_assert'; import {profiler} from './profiler'; import {ProfilerEvent} from './profiler_types'; -import {setUpAttributes} from './util/attrs_utils'; -import { - getLViewParent, - getNativeByTNode, - unwrapRNode, - updateAncestorTraversalFlagsOnAttach, -} from './util/view_utils'; -import {EMPTY_ARRAY} from '../util/empty'; +import {getLViewParent, getNativeByTNode, unwrapRNode} from './util/view_utils'; const enum WalkTNodeTreeAction { /** node create in the native environment. Run on initial creation. */ @@ -157,38 +147,6 @@ function applyToElementOrContainer( } } -export function createTextNode(renderer: Renderer, value: string): RText { - ngDevMode && ngDevMode.rendererCreateTextNode++; - ngDevMode && ngDevMode.rendererSetText++; - return renderer.createText(value); -} - -export function updateTextNode(renderer: Renderer, rNode: RText, value: string): void { - ngDevMode && ngDevMode.rendererSetText++; - renderer.setValue(rNode, value); -} - -export function createCommentNode(renderer: Renderer, value: string): RComment { - ngDevMode && ngDevMode.rendererCreateComment++; - return renderer.createComment(escapeCommentText(value)); -} - -/** - * Creates a native element from a tag name, using a renderer. - * @param renderer A renderer to use - * @param name the tag name - * @param namespace Optional namespace for element. - * @returns the element created - */ -export function createElementNode( - renderer: Renderer, - name: string, - namespace: string | null, -): RElement { - ngDevMode && ngDevMode.rendererCreateElement++; - return renderer.createElement(name, namespace); -} - /** * Removes all DOM elements associated with a view. * @@ -298,87 +256,6 @@ export function destroyViewTree(rootView: LView): void { } } -/** - * Inserts a view into a container. - * - * This adds the view to the container's array of active views in the correct - * position. It also adds the view's elements to the DOM if the container isn't a - * root node of another view (in that case, the view's elements will be added when - * the container's parent view is added later). - * - * @param tView The `TView' of the `LView` to insert - * @param lView The view to insert - * @param lContainer The container into which the view should be inserted - * @param index Which index in the container to insert the child view into - */ -export function insertView(tView: TView, lView: LView, lContainer: LContainer, index: number) { - ngDevMode && assertLView(lView); - ngDevMode && assertLContainer(lContainer); - const indexInContainer = CONTAINER_HEADER_OFFSET + index; - const containerLength = lContainer.length; - - if (index > 0) { - // This is a new view, we need to add it to the children. - lContainer[indexInContainer - 1][NEXT] = lView; - } - if (index < containerLength - CONTAINER_HEADER_OFFSET) { - lView[NEXT] = lContainer[indexInContainer]; - addToArray(lContainer, CONTAINER_HEADER_OFFSET + index, lView); - } else { - lContainer.push(lView); - lView[NEXT] = null; - } - - lView[PARENT] = lContainer; - - // track views where declaration and insertion points are different - const declarationLContainer = lView[DECLARATION_LCONTAINER]; - if (declarationLContainer !== null && lContainer !== declarationLContainer) { - trackMovedView(declarationLContainer, lView); - } - - // notify query that a new view has been added - const lQueries = lView[QUERIES]; - if (lQueries !== null) { - lQueries.insertView(tView); - } - - updateAncestorTraversalFlagsOnAttach(lView); - // Sets the attached flag - lView[FLAGS] |= LViewFlags.Attached; -} - -/** - * Track views created from the declaration container (TemplateRef) and inserted into a - * different LContainer or attached directly to ApplicationRef. - */ -export function trackMovedView(declarationContainer: LContainer, lView: LView) { - ngDevMode && assertDefined(lView, 'LView required'); - ngDevMode && assertLContainer(declarationContainer); - const movedViews = declarationContainer[MOVED_VIEWS]; - const parent = lView[PARENT]!; - ngDevMode && assertDefined(parent, 'missing parent'); - if (isLView(parent)) { - declarationContainer[FLAGS] |= LContainerFlags.HasTransplantedViews; - } else { - const insertedComponentLView = parent[PARENT]![DECLARATION_COMPONENT_VIEW]; - ngDevMode && assertDefined(insertedComponentLView, 'Missing insertedComponentLView'); - const declaredComponentLView = lView[DECLARATION_COMPONENT_VIEW]; - ngDevMode && assertDefined(declaredComponentLView, 'Missing declaredComponentLView'); - if (declaredComponentLView !== insertedComponentLView) { - // At this point the declaration-component is not same as insertion-component; this means that - // this is a transplanted view. Mark the declared lView as having transplanted views so that - // those views can participate in CD. - declarationContainer[FLAGS] |= LContainerFlags.HasTransplantedViews; - } - } - if (movedViews === null) { - declarationContainer[MOVED_VIEWS] = [lView]; - } else { - movedViews.push(lView); - } -} - export function detachMovedView(declarationContainer: LContainer, lView: LView) { ngDevMode && assertLContainer(declarationContainer); ngDevMode && @@ -391,48 +268,6 @@ export function detachMovedView(declarationContainer: LContainer, lView: LView) movedViews.splice(declarationViewIndex, 1); } -/** - * Detaches a view from a container. - * - * This method removes the view from the container's array of active views. It also - * removes the view's elements from the DOM. - * - * @param lContainer The container from which to detach a view - * @param removeIndex The index of the view to detach - * @returns Detached LView instance. - */ -export function detachView(lContainer: LContainer, removeIndex: number): LView | undefined { - if (lContainer.length <= CONTAINER_HEADER_OFFSET) return; - - const indexInContainer = CONTAINER_HEADER_OFFSET + removeIndex; - const viewToDetach = lContainer[indexInContainer]; - - if (viewToDetach) { - const declarationLContainer = viewToDetach[DECLARATION_LCONTAINER]; - if (declarationLContainer !== null && declarationLContainer !== lContainer) { - detachMovedView(declarationLContainer, viewToDetach); - } - - if (removeIndex > 0) { - lContainer[indexInContainer - 1][NEXT] = viewToDetach[NEXT] as LView; - } - const removedLView = removeFromArray(lContainer, CONTAINER_HEADER_OFFSET + removeIndex); - removeViewFromDOM(viewToDetach[TVIEW], viewToDetach); - - // notify query that a view has been removed - const lQueries = removedLView[QUERIES]; - if (lQueries !== null) { - lQueries.detachView(removedLView[TVIEW]); - } - - viewToDetach[PARENT] = null; - viewToDetach[NEXT] = null; - // Unsets the attached flag - viewToDetach[FLAGS] &= ~LViewFlags.Attached; - } - return viewToDetach; -} - /** * A standalone function which destroys an LView, * conducting clean up (e.g. removing listeners, calling onDestroys). @@ -661,11 +496,10 @@ export function getClosestRElement( return lView[HOST]; } else { ngDevMode && assertTNodeType(parentTNode, TNodeType.AnyRNode | TNodeType.Container); - const {componentOffset} = parentTNode; - if (componentOffset > -1) { + if (isComponentHost(parentTNode)) { ngDevMode && assertTNodeForLView(parentTNode, lView); const {encapsulation} = tView.data[ - parentTNode.directiveStart + componentOffset + parentTNode.directiveStart + parentTNode.componentOffset ] as ComponentDef; // We've got a parent which is an element in the current view. We just need to verify if the // parent element is not a component. Component's content nodes are not inserted immediately @@ -685,55 +519,6 @@ export function getClosestRElement( } } -/** - * Inserts a native node before another native node for a given parent. - * This is a utility function that can be used when native nodes were determined. - */ -export function nativeInsertBefore( - renderer: Renderer, - parent: RElement, - child: RNode, - beforeNode: RNode | null, - isMove: boolean, -): void { - ngDevMode && ngDevMode.rendererInsertBefore++; - renderer.insertBefore(parent, child, beforeNode, isMove); -} - -function nativeAppendChild(renderer: Renderer, parent: RElement, child: RNode): void { - ngDevMode && ngDevMode.rendererAppendChild++; - ngDevMode && assertDefined(parent, 'parent node must be defined'); - renderer.appendChild(parent, child); -} - -function nativeAppendOrInsertBefore( - renderer: Renderer, - parent: RElement, - child: RNode, - beforeNode: RNode | null, - isMove: boolean, -) { - if (beforeNode !== null) { - nativeInsertBefore(renderer, parent, child, beforeNode, isMove); - } else { - nativeAppendChild(renderer, parent, child); - } -} - -/** - * Returns a native parent of a given native node. - */ -export function nativeParentNode(renderer: Renderer, node: RNode): RElement | null { - return renderer.parentNode(node); -} - -/** - * Returns a native sibling of a given native node. - */ -export function nativeNextSibling(renderer: Renderer, node: RNode): RNode | null { - return renderer.nextSibling(node); -} - /** * Find a node in front of which `currentTNode` should be inserted. * @@ -934,29 +719,6 @@ export function getBeforeNodeForView( return lContainer[NATIVE]; } -/** - * Removes a native node itself using a given renderer. To remove the node we are looking up its - * parent from the native tree as not all platforms / browsers support the equivalent of - * node.remove(). - * - * @param renderer A renderer to be used - * @param rNode The native node that should be removed - * @param isHostElement A flag indicating if a node to be removed is a host of a component. - */ -export function nativeRemoveNode(renderer: Renderer, rNode: RNode, isHostElement?: boolean): void { - ngDevMode && ngDevMode.rendererRemoveNode++; - renderer.removeChild(null, rNode, isHostElement); -} - -/** - * Clears the contents of a given RElement. - * - * @param rElement the native RElement to be cleared - */ -export function clearElementContents(rElement: RElement): void { - rElement.textContent = ''; -} - /** * Performs the operation of `action` on the node. Typically this involves inserting or removing * nodes on the LView or projection boundary. @@ -992,7 +754,7 @@ function applyNodes( tNode.flags |= TNodeFlags.isProjected; } } - if ((tNode.flags & TNodeFlags.isDetached) !== TNodeFlags.isDetached) { + if (!isDetachedByI18n(tNode)) { if (tNodeType & TNodeType.ElementContainer) { applyNodes(renderer, action, tNode.child, lView, parentRElement, beforeNode, false); applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode); @@ -1242,57 +1004,3 @@ export function applyStyling( } } } - -/** - * Write `cssText` to `RElement`. - * - * This function does direct write without any reconciliation. Used for writing initial values, so - * that static styling values do not pull in the style parser. - * - * @param renderer Renderer to use - * @param element The element which needs to be updated. - * @param newValue The new class list to write. - */ -export function writeDirectStyle(renderer: Renderer, element: RElement, newValue: string) { - ngDevMode && assertString(newValue, "'newValue' should be a string"); - renderer.setAttribute(element, 'style', newValue); - ngDevMode && ngDevMode.rendererSetStyle++; -} - -/** - * Write `className` to `RElement`. - * - * This function does direct write without any reconciliation. Used for writing initial values, so - * that static styling values do not pull in the style parser. - * - * @param renderer Renderer to use - * @param element The element which needs to be updated. - * @param newValue The new class list to write. - */ -export function writeDirectClass(renderer: Renderer, element: RElement, newValue: string) { - ngDevMode && assertString(newValue, "'newValue' should be a string"); - if (newValue === '') { - // There are tests in `google3` which expect `element.getAttribute('class')` to be `null`. - renderer.removeAttribute(element, 'class'); - } else { - renderer.setAttribute(element, 'class', newValue); - } - ngDevMode && ngDevMode.rendererSetClassName++; -} - -/** Sets up the static DOM attributes on an `RNode`. */ -export function setupStaticAttributes(renderer: Renderer, element: RElement, tNode: TNode) { - const {mergedAttrs, classes, styles} = tNode; - - if (mergedAttrs !== null) { - setUpAttributes(renderer, element, mergedAttrs); - } - - if (classes !== null) { - writeDirectClass(renderer, element, classes); - } - - if (styles !== null) { - writeDirectStyle(renderer, element, styles); - } -} diff --git a/packages/core/src/render3/node_manipulation_i18n.ts b/packages/core/src/render3/node_manipulation_i18n.ts index 6c46e723ef8e..5f313b86bc11 100644 --- a/packages/core/src/render3/node_manipulation_i18n.ts +++ b/packages/core/src/render3/node_manipulation_i18n.ts @@ -8,11 +8,12 @@ import {assertDomNode, assertIndexInRange} from '../util/assert'; -import {TNode, TNodeFlags, TNodeType} from './interfaces/node'; +import {TNode, TNodeType} from './interfaces/node'; import {Renderer} from './interfaces/renderer'; import {RElement, RNode} from './interfaces/renderer_dom'; import {LView} from './interfaces/view'; -import {getInsertInFrontOfRNodeWithNoI18n, nativeInsertBefore} from './node_manipulation'; +import {getInsertInFrontOfRNodeWithNoI18n} from './node_manipulation'; +import {nativeInsertBefore} from './dom_node_manipulation'; import {unwrapRNode} from './util/view_utils'; /** diff --git a/packages/core/src/render3/node_selector_matcher.ts b/packages/core/src/render3/node_selector_matcher.ts index 9e47c8a71934..b18104c66dfc 100644 --- a/packages/core/src/render3/node_selector_matcher.ts +++ b/packages/core/src/render3/node_selector_matcher.ts @@ -440,11 +440,8 @@ export function stringifyCSSSelectorList(selectorList: CssSelectorList): string * @param selector CSS selector in parsed form (in a form of array) * @returns object with `attrs` and `classes` fields that contain extracted information */ -export function extractAttrsAndClassesFromSelector(selector: CssSelector): { - attrs: string[]; - classes: string[]; -} { - const attrs: string[] = []; +export function extractAttrsAndClassesFromSelector(selector: CssSelector): TAttributes { + const attrs: TAttributes = []; const classes: string[] = []; let i = 1; let mode = SelectorFlags.ATTRIBUTE; @@ -467,5 +464,9 @@ export function extractAttrsAndClassesFromSelector(selector: CssSelector): { } i++; } - return {attrs, classes}; + if (classes.length) { + attrs.push(AttributeMarker.Classes, ...classes); + } + + return attrs; } diff --git a/packages/core/src/render3/profiler.ts b/packages/core/src/render3/profiler.ts index 4684e1e42be2..d52d232e00a9 100644 --- a/packages/core/src/render3/profiler.ts +++ b/packages/core/src/render3/profiler.ts @@ -33,7 +33,7 @@ export const setProfiler = (profiler: Profiler | null) => { * execution context * @returns */ -export const profiler: Profiler = function (event, instance, hookOrListener) { +export const profiler: Profiler = function (event, instance = null, hookOrListener) { if (profilerCallback != null /* both `null` and `undefined` */) { profilerCallback(event, instance, hookOrListener); } diff --git a/packages/core/src/render3/profiler_types.ts b/packages/core/src/render3/profiler_types.ts index 5e7d155b55ae..f8a42a2d8447 100644 --- a/packages/core/src/render3/profiler_types.ts +++ b/packages/core/src/render3/profiler_types.ts @@ -160,5 +160,5 @@ export const enum ProfilerEvent { * Profiler function which the runtime will invoke before and after user code. */ export interface Profiler { - (event: ProfilerEvent, instance: {} | null, hookOrListener?: (e?: any) => any): void; + (event: ProfilerEvent, instance?: {} | null, hookOrListener?: (e?: any) => any): void; } diff --git a/packages/core/src/render3/query.ts b/packages/core/src/render3/queries/query.ts similarity index 96% rename from packages/core/src/render3/query.ts rename to packages/core/src/render3/queries/query.ts index 2e181e235e21..3060c4f20168 100644 --- a/packages/core/src/render3/query.ts +++ b/packages/core/src/render3/queries/query.ts @@ -9,29 +9,29 @@ // We are temporarily importing the existing viewEngine_from core so we can be sure we are // correctly implementing its interfaces for backwards compatibility. -import {ProviderToken} from '../di/provider_token'; -import {createElementRef, ElementRef as ViewEngine_ElementRef} from '../linker/element_ref'; -import {QueryList} from '../linker/query_list'; -import {createTemplateRef, TemplateRef as ViewEngine_TemplateRef} from '../linker/template_ref'; -import {createContainerRef, ViewContainerRef} from '../linker/view_container_ref'; -import {assertDefined, assertIndexInRange, assertNumber, throwError} from '../util/assert'; -import {stringify} from '../util/stringify'; - -import {assertFirstCreatePass, assertLContainer} from './assert'; -import {getNodeInjectable, locateDirectiveOrProvider} from './di'; -import {storeCleanupWithContext} from './instructions/shared'; -import {CONTAINER_HEADER_OFFSET, LContainer, MOVED_VIEWS} from './interfaces/container'; +import {ProviderToken} from '../../di/provider_token'; +import {createElementRef, ElementRef as ViewEngine_ElementRef} from '../../linker/element_ref'; +import {QueryList} from '../../linker/query_list'; +import {createTemplateRef, TemplateRef as ViewEngine_TemplateRef} from '../../linker/template_ref'; +import {createContainerRef, ViewContainerRef} from '../../linker/view_container_ref'; +import {assertDefined, assertIndexInRange, assertNumber, throwError} from '../../util/assert'; +import {stringify} from '../../util/stringify'; + +import {assertFirstCreatePass, assertLContainer} from '../assert'; +import {getNodeInjectable, locateDirectiveOrProvider} from '../di'; +import {CONTAINER_HEADER_OFFSET, LContainer, MOVED_VIEWS} from '../interfaces/container'; import { TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeType, -} from './interfaces/node'; -import {LQueries, LQuery, QueryFlags, TQueries, TQuery, TQueryMetadata} from './interfaces/query'; -import {DECLARATION_LCONTAINER, LView, PARENT, QUERIES, TVIEW, TView} from './interfaces/view'; -import {assertTNodeType} from './node_assert'; -import {getCurrentTNode, getLView, getTView} from './state'; +} from '../interfaces/node'; +import {LQueries, LQuery, QueryFlags, TQueries, TQuery, TQueryMetadata} from '../interfaces/query'; +import {DECLARATION_LCONTAINER, LView, PARENT, QUERIES, TVIEW, TView} from '../interfaces/view'; +import {assertTNodeType} from '../node_assert'; +import {getCurrentTNode, getLView, getTView} from '../state'; +import {storeCleanupWithContext} from '../util/view_utils'; class LQuery_ implements LQuery { matches: (T | null)[] | null = null; diff --git a/packages/core/src/render3/queries/query_execution.ts b/packages/core/src/render3/queries/query_execution.ts new file mode 100644 index 000000000000..3eada760eaa7 --- /dev/null +++ b/packages/core/src/render3/queries/query_execution.ts @@ -0,0 +1,78 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {setActiveConsumer} from '@angular/core/primitives/signals'; +import {LView, TView} from '../interfaces/view'; +import {DirectiveDef, RenderFlags, ViewQueriesFunction} from '../interfaces/definition'; +import {assertDefined} from '../../util/assert'; +import {setCurrentQueryIndex} from '../state'; +import {TNode} from '../interfaces/node'; +import {isContentQueryHost} from '../interfaces/type_checks'; + +/** Refreshes all content queries declared by directives in a given view */ +export function refreshContentQueries(tView: TView, lView: LView): void { + const contentQueries = tView.contentQueries; + if (contentQueries !== null) { + const prevConsumer = setActiveConsumer(null); + try { + for (let i = 0; i < contentQueries.length; i += 2) { + const queryStartIdx = contentQueries[i]; + const directiveDefIdx = contentQueries[i + 1]; + if (directiveDefIdx !== -1) { + const directiveDef = tView.data[directiveDefIdx] as DirectiveDef; + ngDevMode && assertDefined(directiveDef, 'DirectiveDef not found.'); + ngDevMode && + assertDefined(directiveDef.contentQueries, 'contentQueries function should be defined'); + setCurrentQueryIndex(queryStartIdx); + directiveDef.contentQueries!(RenderFlags.Update, lView[directiveDefIdx], directiveDefIdx); + } + } + } finally { + setActiveConsumer(prevConsumer); + } + } +} + +export function executeViewQueryFn( + flags: RenderFlags, + viewQueryFn: ViewQueriesFunction, + component: T, +): void { + ngDevMode && assertDefined(viewQueryFn, 'View queries function to execute must be defined.'); + setCurrentQueryIndex(0); + const prevConsumer = setActiveConsumer(null); + try { + viewQueryFn(flags, component); + } finally { + setActiveConsumer(prevConsumer); + } +} + +export function executeContentQueries(tView: TView, tNode: TNode, lView: LView) { + if (isContentQueryHost(tNode)) { + const prevConsumer = setActiveConsumer(null); + try { + const start = tNode.directiveStart; + const end = tNode.directiveEnd; + for (let directiveIndex = start; directiveIndex < end; directiveIndex++) { + const def = tView.data[directiveIndex] as DirectiveDef; + if (def.contentQueries) { + const directiveInstance = lView[directiveIndex]; + ngDevMode && + assertDefined( + directiveIndex, + 'Incorrect reference to a directive defining a content query', + ); + def.contentQueries(RenderFlags.Create, directiveInstance, directiveIndex); + } + } + } finally { + setActiveConsumer(prevConsumer); + } + } +} diff --git a/packages/core/src/render3/query_reactive.ts b/packages/core/src/render3/queries/query_reactive.ts similarity index 92% rename from packages/core/src/render3/query_reactive.ts rename to packages/core/src/render3/queries/query_reactive.ts index 0bf229c47352..0d062116e208 100644 --- a/packages/core/src/render3/query_reactive.ts +++ b/packages/core/src/render3/queries/query_reactive.ts @@ -8,16 +8,16 @@ import {ComputedNode, createComputed, SIGNAL} from '@angular/core/primitives/signals'; -import {RuntimeError, RuntimeErrorCode} from '../errors'; -import {unwrapElementRef} from '../linker/element_ref'; -import {QueryList} from '../linker/query_list'; -import {EMPTY_ARRAY} from '../util/empty'; - -import {FLAGS, LView, LViewFlags} from './interfaces/view'; +import {RuntimeError, RuntimeErrorCode} from '../../errors'; +import {unwrapElementRef} from '../../linker/element_ref'; +import {QueryList} from '../../linker/query_list'; +import {EMPTY_ARRAY} from '../../util/empty'; + +import {FLAGS, LView, LViewFlags} from '../interfaces/view'; +import {Signal} from '../reactivity/api'; +import {signal, WritableSignal} from '../reactivity/signal'; +import {getLView} from '../state'; import {getQueryResults, loadQueryInternal} from './query'; -import {Signal} from './reactivity/api'; -import {signal, WritableSignal} from './reactivity/signal'; -import {getLView} from './state'; interface QuerySignalNode extends ComputedNode> { _lView?: LView; diff --git a/packages/core/src/render3/reactivity/computed.ts b/packages/core/src/render3/reactivity/computed.ts index 31462ecb0e1e..d6cab319bd3b 100644 --- a/packages/core/src/render3/reactivity/computed.ts +++ b/packages/core/src/render3/reactivity/computed.ts @@ -31,7 +31,6 @@ export interface CreateComputedOptions { * Create a computed `Signal` which derives a reactive value from an expression. */ export function computed(computation: () => T, options?: CreateComputedOptions): Signal { - performanceMarkFeature('NgSignals'); const getter = createComputed(computation); if (options?.equal) { getter[SIGNAL].equal = options.equal; diff --git a/packages/core/src/render3/reactivity/effect.ts b/packages/core/src/render3/reactivity/effect.ts index dd8552e0fd0b..1c1e36eb8b34 100644 --- a/packages/core/src/render3/reactivity/effect.ts +++ b/packages/core/src/render3/reactivity/effect.ts @@ -157,7 +157,6 @@ export function effect( return microtaskEffect(effectFn, options); } - performanceMarkFeature('NgSignals'); ngDevMode && assertNotInReactiveContext( effect, diff --git a/packages/core/src/render3/reactivity/linked_signal.ts b/packages/core/src/render3/reactivity/linked_signal.ts index 781ff6815c58..6791a580dece 100644 --- a/packages/core/src/render3/reactivity/linked_signal.ts +++ b/packages/core/src/render3/reactivity/linked_signal.ts @@ -3,109 +3,26 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {signalAsReadonlyFn, WritableSignal} from './signal'; import {Signal, ValueEqualityFn} from './api'; +import {performanceMarkFeature} from '../../util/performance'; import { - producerMarkClean, - ReactiveNode, + ComputationFn, + createLinkedSignal, + LinkedSignalGetter, + LinkedSignalNode, SIGNAL, - signalSetFn, - signalUpdateFn, - producerUpdateValueVersion, - REACTIVE_NODE, - defaultEquals, - consumerBeforeComputation, - consumerAfterComputation, - producerAccessed, + linkedSignalSetFn, + linkedSignalUpdateFn, } from '@angular/core/primitives/signals'; -import {performanceMarkFeature} from '../../util/performance'; - -type ComputationFn = (source: S, previous?: {source: S; value: D}) => D; - -interface LinkedSignalNode extends ReactiveNode { - /** - * Value of the source signal that was used to derive the computed value. - */ - sourceValue: S; - - /** - * Current state value, or one of the sentinel values (`UNSET`, `COMPUTING`, - * `ERROR`). - */ - value: D; - - /** - * If `value` is `ERRORED`, the error caught from the last computation attempt which will - * be re-thrown. - */ - error: unknown; - - /** - * The source function represents reactive dependency based on which the linked state is reset. - */ - source: () => S; - - /** - * The computation function which will produce a new value based on the source and, optionally - previous values. - */ - computation: ComputationFn; - - equal: ValueEqualityFn; -} - -export type LinkedSignalGetter = (() => D) & { - [SIGNAL]: LinkedSignalNode; -}; const identityFn = (v: T) => v; /** - * Create a linked signal which represents state that is (re)set from a linked reactive expression. - */ -function createLinkedSignal(node: LinkedSignalNode): WritableSignal { - const linkedSignalGetter = () => { - // Check if the value needs updating before returning it. - producerUpdateValueVersion(node); - - // Record that someone looked at this signal. - producerAccessed(node); - - if (node.value === ERRORED) { - throw node.error; - } - - return node.value; - }; - - const getter = linkedSignalGetter as LinkedSignalGetter & WritableSignal; - getter[SIGNAL] = node; - - if (ngDevMode) { - getter.toString = () => `[LinkedSignal: ${getter()}]`; - } - - getter.set = (newValue: D) => { - producerUpdateValueVersion(node); - signalSetFn(node, newValue); - producerMarkClean(node); - }; - - getter.update = (updateFn: (value: D) => D) => { - producerUpdateValueVersion(node); - signalUpdateFn(node, updateFn); - producerMarkClean(node); - }; - - getter.asReadonly = signalAsReadonlyFn.bind(getter as any) as () => Signal; - - return getter; -} - -/** - * Creates a writable signals whose value is initialized and reset by the linked, reactive computation. + * Creates a writable signal whose value is initialized and reset by the linked, reactive computation. * * @developerPreview */ @@ -115,9 +32,11 @@ export function linkedSignal( ): WritableSignal; /** - * Creates a writable signals whose value is initialized and reset by the linked, reactive computation. + * Creates a writable signal whose value is initialized and reset by the linked, reactive computation. * This is an advanced API form where the computation has access to the previous value of the signal and the computation result. * + * Note: The computation is reactive, meaning the linked signal will automatically update whenever any of the signals used within the computation change. + * * @developerPreview */ export function linkedSignal(options: { @@ -125,6 +44,7 @@ export function linkedSignal(options: { computation: (source: NoInfer, previous?: {source: NoInfer; value: NoInfer}) => D; equal?: ValueEqualityFn>; }): WritableSignal; + export function linkedSignal( optionsOrComputation: | { @@ -135,97 +55,34 @@ export function linkedSignal( | (() => D), options?: {equal?: ValueEqualityFn}, ): WritableSignal { - performanceMarkFeature('NgSignals'); - - const isShorthand = typeof optionsOrComputation === 'function'; - const node: LinkedSignalNode = Object.create(LINKED_SIGNAL_NODE); - node.source = isShorthand ? optionsOrComputation : optionsOrComputation.source; - if (!isShorthand) { - node.computation = optionsOrComputation.computation as ComputationFn; - } - const equal = isShorthand ? options?.equal : optionsOrComputation.equal; - if (equal) { - node.equal = equal as ValueEqualityFn; + if (typeof optionsOrComputation === 'function') { + const getter = createLinkedSignal( + optionsOrComputation, + identityFn, + options?.equal, + ) as LinkedSignalGetter & WritableSignal; + return upgradeLinkedSignalGetter(getter); + } else { + const getter = createLinkedSignal( + optionsOrComputation.source, + optionsOrComputation.computation, + optionsOrComputation.equal, + ); + return upgradeLinkedSignalGetter(getter); } - return createLinkedSignal(node as LinkedSignalNode); } -/** - * A dedicated symbol used before a state value has been set / calculated for the first time. - * Explicitly typed as `any` so we can use it as signal's value. - */ -const UNSET: any = /* @__PURE__ */ Symbol('UNSET'); - -/** - * A dedicated symbol used in place of a linked signal value to indicate that a given computation - * is in progress. Used to detect cycles in computation chains. - * Explicitly typed as `any` so we can use it as signal's value. - */ -const COMPUTING: any = /* @__PURE__ */ Symbol('COMPUTING'); - -/** - * A dedicated symbol used in place of a linked signal value to indicate that a given computation - * failed. The thrown error is cached until the computation gets dirty again or the state is set. - * Explicitly typed as `any` so we can use it as signal's value. - */ -const ERRORED: any = /* @__PURE__ */ Symbol('ERRORED'); - -// Note: Using an IIFE here to ensure that the spread assignment is not considered -// a side-effect, ending up preserving `LINKED_SIGNAL_NODE` and `REACTIVE_NODE`. -// TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved. -const LINKED_SIGNAL_NODE = /* @__PURE__ */ (() => { - return { - ...REACTIVE_NODE, - value: UNSET, - dirty: true, - error: null, - equal: defaultEquals, - computation: identityFn, - - producerMustRecompute(node: LinkedSignalNode): boolean { - // Force a recomputation if there's no current value, or if the current value is in the - // process of being calculated (which should throw an error). - return node.value === UNSET || node.value === COMPUTING; - }, - - producerRecomputeValue(node: LinkedSignalNode): void { - if (node.value === COMPUTING) { - // Our computation somehow led to a cyclic read of itself. - throw new Error('Detected cycle in computations.'); - } - - const oldValue = node.value; - node.value = COMPUTING; +function upgradeLinkedSignalGetter(getter: LinkedSignalGetter): WritableSignal { + if (ngDevMode) { + getter.toString = () => `[LinkedSignal: ${getter()}]`; + } - const prevConsumer = consumerBeforeComputation(node); - let newValue: unknown; - try { - const newSourceValue = node.source(); - const prev = - oldValue === UNSET || oldValue === ERRORED - ? undefined - : { - source: node.sourceValue, - value: oldValue, - }; - newValue = node.computation(newSourceValue, prev); - node.sourceValue = newSourceValue; - } catch (err) { - newValue = ERRORED; - node.error = err; - } finally { - consumerAfterComputation(node, prevConsumer); - } + const node = getter[SIGNAL] as LinkedSignalNode; + const upgradedGetter = getter as LinkedSignalGetter & WritableSignal; - if (oldValue !== UNSET && newValue !== ERRORED && node.equal(oldValue, newValue)) { - // No change to `valueVersion` - old and new values are - // semantically equivalent. - node.value = oldValue; - return; - } + upgradedGetter.set = (newValue: D) => linkedSignalSetFn(node, newValue); + upgradedGetter.update = (updateFn: (value: D) => D) => linkedSignalUpdateFn(node, updateFn); + upgradedGetter.asReadonly = signalAsReadonlyFn.bind(getter as any) as () => Signal; - node.value = newValue; - node.version++; - }, - }; -})(); + return upgradedGetter; +} diff --git a/packages/core/src/render3/reactivity/microtask_effect.ts b/packages/core/src/render3/reactivity/microtask_effect.ts index 1417b1fa9415..ec4f127cd6de 100644 --- a/packages/core/src/render3/reactivity/microtask_effect.ts +++ b/packages/core/src/render3/reactivity/microtask_effect.ts @@ -121,7 +121,6 @@ export function microtaskEffect( effectFn: (onCleanup: EffectCleanupRegisterFn) => void, options?: CreateEffectOptions, ): EffectRef { - performanceMarkFeature('NgSignals'); ngDevMode && assertNotInReactiveContext( effect, diff --git a/packages/core/src/render3/reactivity/signal.ts b/packages/core/src/render3/reactivity/signal.ts index 354e8a5e1e61..b7006521c4a2 100644 --- a/packages/core/src/render3/reactivity/signal.ts +++ b/packages/core/src/render3/reactivity/signal.ts @@ -76,7 +76,6 @@ export interface CreateSignalOptions { * Create a `Signal` that can be set or updated directly. */ export function signal(initialValue: T, options?: CreateSignalOptions): WritableSignal { - performanceMarkFeature('NgSignals'); const signalFn = createSignal(initialValue) as SignalGetter & WritableSignal; const node = signalFn[SIGNAL]; if (options?.equal) { diff --git a/packages/core/src/render3/state.ts b/packages/core/src/render3/state.ts index 32c007a29ad2..53b719ee85a3 100644 --- a/packages/core/src/render3/state.ts +++ b/packages/core/src/render3/state.ts @@ -176,7 +176,7 @@ interface InstructionState { * directives on children of that element. * * Example: - * ``` + * ```html * * Should match component / directive. * @@ -193,7 +193,7 @@ interface InstructionState { * Stores the root TNode that has the 'ngSkipHydration' attribute on it for later reference. * * Example: - * ``` + * ```html * * Should reference this root node * diff --git a/packages/core/src/render3/tnode_manipulation.ts b/packages/core/src/render3/tnode_manipulation.ts new file mode 100644 index 000000000000..cd2b881d4333 --- /dev/null +++ b/packages/core/src/render3/tnode_manipulation.ts @@ -0,0 +1,325 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {assertEqual, assertGreaterThanOrEqual, assertNotSame} from '../util/assert'; +import {assertTNodeForTView} from './assert'; +import { + TAttributes, + TContainerNode, + TElementContainerNode, + TElementNode, + TIcuContainerNode, + TLetDeclarationNode, + TNode, + TNodeFlags, + TNodeType, + TProjectionNode, +} from './interfaces/node'; +import {TStylingRange} from './interfaces/styling'; +import {HEADER_OFFSET, TView} from './interfaces/view'; +import {assertPureTNodeType} from './node_assert'; +import { + getCurrentParentTNode, + getCurrentTNodePlaceholderOk, + isCurrentTNodeParent, + isInI18nBlock, + isInSkipHydrationBlock, + setCurrentTNode, +} from './state'; + +/** + * Create and stores the TNode, and hooks it up to the tree. + * + * @param tView The current `TView`. + * @param index The index at which the TNode should be saved (null if view, since they are not + * saved). + * @param type The type of TNode to create + * @param native The native element for this node, if applicable + * @param name The tag name of the associated native element, if applicable + * @param attrs Any attrs for the native element, if applicable + */ +export function getOrCreateTNode( + tView: TView, + index: number, + type: TNodeType.Element | TNodeType.Text, + name: string | null, + attrs: TAttributes | null, +): TElementNode; +export function getOrCreateTNode( + tView: TView, + index: number, + type: TNodeType.Container, + name: string | null, + attrs: TAttributes | null, +): TContainerNode; +export function getOrCreateTNode( + tView: TView, + index: number, + type: TNodeType.Projection, + name: null, + attrs: TAttributes | null, +): TProjectionNode; +export function getOrCreateTNode( + tView: TView, + index: number, + type: TNodeType.ElementContainer, + name: string | null, + attrs: TAttributes | null, +): TElementContainerNode; +export function getOrCreateTNode( + tView: TView, + index: number, + type: TNodeType.Icu, + name: null, + attrs: TAttributes | null, +): TElementContainerNode; +export function getOrCreateTNode( + tView: TView, + index: number, + type: TNodeType.LetDeclaration, + name: null, + attrs: null, +): TLetDeclarationNode; +export function getOrCreateTNode( + tView: TView, + index: number, + type: TNodeType, + name: string | null, + attrs: TAttributes | null, +): TElementNode & + TContainerNode & + TElementContainerNode & + TProjectionNode & + TIcuContainerNode & + TLetDeclarationNode { + ngDevMode && + index !== 0 && // 0 are bogus nodes and they are OK. See `createContainerRef` in + // `view_engine_compatibility` for additional context. + assertGreaterThanOrEqual(index, HEADER_OFFSET, "TNodes can't be in the LView header."); + // Keep this function short, so that the VM will inline it. + ngDevMode && assertPureTNodeType(type); + let tNode = tView.data[index] as TNode; + if (tNode === null) { + tNode = createTNodeAtIndex(tView, index, type, name, attrs); + if (isInI18nBlock()) { + // If we are in i18n block then all elements should be pre declared through `Placeholder` + // See `TNodeType.Placeholder` and `LFrame.inI18n` for more context. + // If the `TNode` was not pre-declared than it means it was not mentioned which means it was + // removed, so we mark it as detached. + tNode.flags |= TNodeFlags.isDetached; + } + } else if (tNode.type & TNodeType.Placeholder) { + tNode.type = type; + tNode.value = name; + tNode.attrs = attrs; + const parent = getCurrentParentTNode(); + tNode.injectorIndex = parent === null ? -1 : parent.injectorIndex; + ngDevMode && assertTNodeForTView(tNode, tView); + ngDevMode && assertEqual(index, tNode.index, 'Expecting same index'); + } + setCurrentTNode(tNode, true); + return tNode as TElementNode & + TContainerNode & + TElementContainerNode & + TProjectionNode & + TIcuContainerNode; +} + +export function createTNodeAtIndex( + tView: TView, + index: number, + type: TNodeType, + name: string | null, + attrs: TAttributes | null, +) { + const currentTNode = getCurrentTNodePlaceholderOk(); + const isParent = isCurrentTNodeParent(); + const parent = isParent ? currentTNode : currentTNode && currentTNode.parent; + + // Parents cannot cross component boundaries because components will be used in multiple places. + const tNode = (tView.data[index] = createTNode( + tView, + parent as TElementNode | TContainerNode, + type, + index, + name, + attrs, + )); + + // Assign a pointer to the first child node of a given view. The first node is not always the one + // at index 0, in case of i18n, index 0 can be the instruction `i18nStart` and the first node has + // the index 1 or more, so we can't just check node index. + linkTNodeInTView(tView, tNode, currentTNode, isParent); + + return tNode; +} + +function linkTNodeInTView( + tView: TView, + tNode: TNode, + currentTNode: TNode | null, + isParent: boolean, +) { + if (tView.firstChild === null) { + tView.firstChild = tNode; + } + if (currentTNode !== null) { + if (isParent) { + // FIXME(misko): This logic looks unnecessarily complicated. Could we simplify? + if (currentTNode.child == null && tNode.parent !== null) { + // We are in the same view, which means we are adding content node to the parent view. + currentTNode.child = tNode; + } + } else { + if (currentTNode.next === null) { + // In the case of i18n the `currentTNode` may already be linked, in which case we don't want + // to break the links which i18n created. + currentTNode.next = tNode; + tNode.prev = currentTNode; + } + } + } +} + +/** + * Constructs a TNode object from the arguments. + * + * @param tView `TView` to which this `TNode` belongs + * @param tParent Parent `TNode` + * @param type The type of the node + * @param index The index of the TNode in TView.data, adjusted for HEADER_OFFSET + * @param tagName The tag name of the node + * @param attrs The attributes defined on this node + * @returns the TNode object + */ +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType.Container, + index: number, + tagName: string | null, + attrs: TAttributes | null, +): TContainerNode; +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType.Element | TNodeType.Text, + index: number, + tagName: string | null, + attrs: TAttributes | null, +): TElementNode; +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType.ElementContainer, + index: number, + tagName: string | null, + attrs: TAttributes | null, +): TElementContainerNode; +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType.Icu, + index: number, + tagName: string | null, + attrs: TAttributes | null, +): TIcuContainerNode; +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType.Projection, + index: number, + tagName: string | null, + attrs: TAttributes | null, +): TProjectionNode; +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType.LetDeclaration, + index: number, + tagName: null, + attrs: null, +): TLetDeclarationNode; +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType, + index: number, + tagName: string | null, + attrs: TAttributes | null, +): TNode; +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType, + index: number, + value: string | null, + attrs: TAttributes | null, +): TNode { + ngDevMode && + index !== 0 && // 0 are bogus nodes and they are OK. See `createContainerRef` in + // `view_engine_compatibility` for additional context. + assertGreaterThanOrEqual(index, HEADER_OFFSET, "TNodes can't be in the LView header."); + ngDevMode && assertNotSame(attrs, undefined, "'undefined' is not valid value for 'attrs'"); + ngDevMode && ngDevMode.tNode++; + ngDevMode && tParent && assertTNodeForTView(tParent, tView); + let injectorIndex = tParent ? tParent.injectorIndex : -1; + let flags = 0; + if (isInSkipHydrationBlock()) { + flags |= TNodeFlags.inSkipHydrationBlock; + } + + // TODO: would it be helpful to use a prototypal inheritance here, similar to the way we do so with signals? + const tNode = { + type, + index, + insertBeforeIndex: null, + injectorIndex, + directiveStart: -1, + directiveEnd: -1, + directiveStylingLast: -1, + componentOffset: -1, + propertyBindings: null, + flags, + providerIndexes: 0, + value: value, + attrs: attrs, + mergedAttrs: null, + localNames: null, + initialInputs: null, + inputs: null, + hostDirectiveInputs: null, + outputs: null, + hostDirectiveOutputs: null, + directiveToIndex: null, + tView: null, + next: null, + prev: null, + projectionNext: null, + child: null, + parent: tParent, + projection: null, + styles: null, + stylesWithoutHost: null, + residualStyles: undefined, + classes: null, + classesWithoutHost: null, + residualClasses: undefined, + classBindings: 0 as TStylingRange, + styleBindings: 0 as TStylingRange, + }; + + if (ngDevMode) { + // For performance reasons it is important that the tNode retains the same shape during runtime. + // (To make sure that all of the code is monomorphic.) For this reason we seal the object to + // prevent class transitions. + Object.seal(tNode); + } + + return tNode; +} diff --git a/packages/core/src/render3/util/discovery_utils.ts b/packages/core/src/render3/util/discovery_utils.ts index 742dc478176d..031bf1bf7c6f 100644 --- a/packages/core/src/render3/util/discovery_utils.ts +++ b/packages/core/src/render3/util/discovery_utils.ts @@ -21,7 +21,8 @@ import {getComponentDef, getDirectiveDef} from '../def_getters'; import {NodeInjector} from '../di'; import {DirectiveDef} from '../interfaces/definition'; import {TElementNode, TNode, TNodeProviderIndexes} from '../interfaces/node'; -import {CLEANUP, CONTEXT, FLAGS, LView, LViewFlags, TVIEW, TViewType} from '../interfaces/view'; +import {isRootView} from '../interfaces/type_checks'; +import {CLEANUP, CONTEXT, LView, TVIEW, TViewType} from '../interfaces/view'; import {getRootContext} from './view_traversal_utils'; import {getLViewParent, unwrapRNode} from './view_utils'; @@ -109,7 +110,7 @@ export function getOwningComponent(elementOrDir: Element | {}): T | null { while (lView[TVIEW].type === TViewType.Embedded && (parent = getLViewParent(lView)!)) { lView = parent; } - return lView[FLAGS] & LViewFlags.IsRoot ? null : (lView[CONTEXT] as unknown as T); + return isRootView(lView) ? null : (lView[CONTEXT] as unknown as T); } /** @@ -480,26 +481,13 @@ function extractInputDebugMetadata(inputs: DirectiveDef['inputs']) { const res: DirectiveDebugMetadata['inputs'] = {}; for (const key in inputs) { - if (!inputs.hasOwnProperty(key)) { - continue; - } - - const value = inputs[key]; - if (value === undefined) { - continue; - } + if (inputs.hasOwnProperty(key)) { + const value = inputs[key]; - let minifiedName: string; - - if (Array.isArray(value)) { - minifiedName = value[0]; - // flags are not used for now. - // TODO: Consider exposing flag information in discovery. - } else { - minifiedName = value; + if (value !== undefined) { + res[key] = value[0]; + } } - - res[key] = minifiedName; } return res; diff --git a/packages/core/src/render3/util/view_traversal_utils.ts b/packages/core/src/render3/util/view_traversal_utils.ts index 1ce13d22634a..a2eb9670c80f 100644 --- a/packages/core/src/render3/util/view_traversal_utils.ts +++ b/packages/core/src/render3/util/view_traversal_utils.ts @@ -10,8 +10,8 @@ import {assertDefined} from '../../util/assert'; import {assertLView} from '../assert'; import {readPatchedLView} from '../context_discovery'; import {LContainer} from '../interfaces/container'; -import {isLContainer, isLView} from '../interfaces/type_checks'; -import {CHILD_HEAD, CONTEXT, FLAGS, LView, LViewFlags, NEXT, PARENT} from '../interfaces/view'; +import {isLContainer, isLView, isRootView} from '../interfaces/type_checks'; +import {CHILD_HEAD, CONTEXT, LView, NEXT} from '../interfaces/view'; import {getLViewParent} from './view_utils'; @@ -24,7 +24,7 @@ import {getLViewParent} from './view_utils'; export function getRootView(componentOrLView: LView | {}): LView { ngDevMode && assertDefined(componentOrLView, 'component'); let lView = isLView(componentOrLView) ? componentOrLView : readPatchedLView(componentOrLView)!; - while (lView && !(lView[FLAGS] & LViewFlags.IsRoot)) { + while (lView && !isRootView(lView)) { lView = getLViewParent(lView)!; } ngDevMode && assertLView(lView); diff --git a/packages/core/src/render3/util/view_utils.ts b/packages/core/src/render3/util/view_utils.ts index 1af2076b3ce9..901e28a01a0b 100644 --- a/packages/core/src/render3/util/view_utils.ts +++ b/packages/core/src/render3/util/view_utils.ts @@ -21,6 +21,7 @@ import {TConstants, TNode} from '../interfaces/node'; import {RNode} from '../interfaces/renderer_dom'; import {isDestroyed, isLContainer, isLView} from '../interfaces/type_checks'; import { + CLEANUP, DECLARATION_VIEW, ENVIRONMENT, FLAGS, @@ -305,3 +306,49 @@ export function getLViewParent(lView: LView): LView | null { const parent = lView[PARENT]; return isLContainer(parent) ? parent[PARENT] : parent; } + +export function getOrCreateLViewCleanup(view: LView): any[] { + // top level variables should not be exported for performance reasons (PERF_NOTES.md) + return (view[CLEANUP] ??= []); +} + +export function getOrCreateTViewCleanup(tView: TView): any[] { + return (tView.cleanup ??= []); +} + +/** + * Saves context for this cleanup function in LView.cleanupInstances. + * + * On the first template pass, saves in TView: + * - Cleanup function + * - Index of context we just saved in LView.cleanupInstances + */ +export function storeCleanupWithContext( + tView: TView, + lView: LView, + context: any, + cleanupFn: Function, +): void { + const lCleanup = getOrCreateLViewCleanup(lView); + + // Historically the `storeCleanupWithContext` was used to register both framework-level and + // user-defined cleanup callbacks, but over time those two types of cleanups were separated. + // This dev mode checks assures that user-level cleanup callbacks are _not_ stored in data + // structures reserved for framework-specific hooks. + ngDevMode && + assertDefined( + context, + 'Cleanup context is mandatory when registering framework-level destroy hooks', + ); + lCleanup.push(context); + + if (tView.firstCreatePass) { + getOrCreateTViewCleanup(tView).push(cleanupFn, lCleanup.length - 1); + } else { + // Make sure that no new framework-level cleanup functions are registered after the first + // template pass is done (and TView data structures are meant to fully constructed). + if (ngDevMode) { + Object.freeze(getOrCreateTViewCleanup(tView)); + } + } +} diff --git a/packages/core/src/render3/view/construction.ts b/packages/core/src/render3/view/construction.ts new file mode 100644 index 000000000000..9ab30484aeba --- /dev/null +++ b/packages/core/src/render3/view/construction.ts @@ -0,0 +1,336 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { + TView, + TVIEW, + LViewFlags, + LViewEnvironment, + HOST, + FLAGS, + DECLARATION_VIEW, + PARENT, + CONTEXT, + ENVIRONMENT, + RENDERER, + INJECTOR, + T_HOST, + ID, + HYDRATION, + EMBEDDED_VIEW_INJECTOR, + TViewType, + DECLARATION_COMPONENT_VIEW, + HEADER_OFFSET, + CHILD_HEAD, + CHILD_TAIL, + NEXT, + LView, +} from '../interfaces/view'; +import {assertFirstCreatePass, assertFirstUpdatePass, assertTNodeForLView} from '../assert'; +import {assertSame, assertEqual, assertDefined} from '../../util/assert'; +import {RElement} from '../interfaces/renderer_dom'; +import {TConstantsOrFactory, TElementNode, TNode} from '../interfaces/node'; +import {Renderer} from '../interfaces/renderer'; +import {Injector} from '../../di'; +import {DehydratedView} from '../../hydration/interfaces'; +import {getNativeByTNode, resetPreOrderHookFlags} from '../util/view_utils'; +import {getUniqueLViewId} from '../interfaces/lview_tracking'; +import {NO_CHANGE} from '../tokens'; +import { + ComponentDef, + ComponentTemplate, + DirectiveDefListOrFactory, + PipeDefListOrFactory, + ViewQueriesFunction, +} from '../interfaces/definition'; +import {SchemaMetadata} from '../../metadata/schema'; +import {LContainer} from '../interfaces/container'; + +/** + * Creates a TView instance + * + * @param type Type of `TView`. + * @param declTNode Declaration location of this `TView`. + * @param templateFn Template function + * @param decls The number of nodes, local refs, and pipes in this template + * @param directives Registry of directives for this view + * @param pipes Registry of pipes for this view + * @param viewQuery View queries for this view + * @param schemas Schemas for this view + * @param consts Constants for this view + */ +export function createTView( + type: TViewType, + declTNode: TNode | null, + templateFn: ComponentTemplate | null, + decls: number, + vars: number, + directives: DirectiveDefListOrFactory | null, + pipes: PipeDefListOrFactory | null, + viewQuery: ViewQueriesFunction | null, + schemas: SchemaMetadata[] | null, + constsOrFactory: TConstantsOrFactory | null, + ssrId: string | null, +): TView { + ngDevMode && ngDevMode.tView++; + const bindingStartIndex = HEADER_OFFSET + decls; + // This length does not yet contain host bindings from child directives because at this point, + // we don't know which directives are active on this template. As soon as a directive is matched + // that has a host binding, we will update the blueprint with that def's hostVars count. + const initialViewLength = bindingStartIndex + vars; + const blueprint = createViewBlueprint(bindingStartIndex, initialViewLength); + const consts = typeof constsOrFactory === 'function' ? constsOrFactory() : constsOrFactory; + const tView = (blueprint[TVIEW as any] = { + type: type, + blueprint: blueprint, + template: templateFn, + queries: null, + viewQuery: viewQuery, + declTNode: declTNode, + data: blueprint.slice().fill(null, bindingStartIndex), + bindingStartIndex: bindingStartIndex, + expandoStartIndex: initialViewLength, + hostBindingOpCodes: null, + firstCreatePass: true, + firstUpdatePass: true, + staticViewQueries: false, + staticContentQueries: false, + preOrderHooks: null, + preOrderCheckHooks: null, + contentHooks: null, + contentCheckHooks: null, + viewHooks: null, + viewCheckHooks: null, + destroyHooks: null, + cleanup: null, + contentQueries: null, + components: null, + directiveRegistry: typeof directives === 'function' ? directives() : directives, + pipeRegistry: typeof pipes === 'function' ? pipes() : pipes, + firstChild: null, + schemas: schemas, + consts: consts, + incompleteFirstPass: false, + ssrId, + }); + if (ngDevMode) { + // For performance reasons it is important that the tView retains the same shape during runtime. + // (To make sure that all of the code is monomorphic.) For this reason we seal the object to + // prevent class transitions. + Object.seal(tView); + } + return tView; +} + +function createViewBlueprint(bindingStartIndex: number, initialViewLength: number): LView { + const blueprint = []; + + for (let i = 0; i < initialViewLength; i++) { + blueprint.push(i < bindingStartIndex ? null : NO_CHANGE); + } + + return blueprint as LView; +} + +/** + * Gets TView from a template function or creates a new TView + * if it doesn't already exist. + * + * @param def ComponentDef + * @returns TView + */ +export function getOrCreateComponentTView(def: ComponentDef): TView { + const tView = def.tView; + + // Create a TView if there isn't one, or recreate it if the first create pass didn't + // complete successfully since we can't know for sure whether it's in a usable shape. + if (tView === null || tView.incompleteFirstPass) { + // Declaration node here is null since this function is called when we dynamically create a + // component and hence there is no declaration. + const declTNode = null; + return (def.tView = createTView( + TViewType.Component, + declTNode, + def.template, + def.decls, + def.vars, + def.directiveDefs, + def.pipeDefs, + def.viewQuery, + def.schemas, + def.consts, + def.id, + )); + } + + return tView; +} + +export function createLView( + parentLView: LView | null, + tView: TView, + context: T | null, + flags: LViewFlags, + host: RElement | null, + tHostNode: TNode | null, + environment: LViewEnvironment | null, + renderer: Renderer | null, + injector: Injector | null, + embeddedViewInjector: Injector | null, + hydrationInfo: DehydratedView | null, +): LView { + const lView = tView.blueprint.slice() as LView; + lView[HOST] = host; + lView[FLAGS] = + flags | + LViewFlags.CreationMode | + LViewFlags.Attached | + LViewFlags.FirstLViewPass | + LViewFlags.Dirty | + LViewFlags.RefreshView; + if ( + embeddedViewInjector !== null || + (parentLView && parentLView[FLAGS] & LViewFlags.HasEmbeddedViewInjector) + ) { + lView[FLAGS] |= LViewFlags.HasEmbeddedViewInjector; + } + resetPreOrderHookFlags(lView); + ngDevMode && tView.declTNode && parentLView && assertTNodeForLView(tView.declTNode, parentLView); + lView[PARENT] = lView[DECLARATION_VIEW] = parentLView; + lView[CONTEXT] = context; + lView[ENVIRONMENT] = (environment || (parentLView && parentLView[ENVIRONMENT]))!; + ngDevMode && assertDefined(lView[ENVIRONMENT], 'LViewEnvironment is required'); + lView[RENDERER] = (renderer || (parentLView && parentLView[RENDERER]))!; + ngDevMode && assertDefined(lView[RENDERER], 'Renderer is required'); + lView[INJECTOR as any] = injector || (parentLView && parentLView[INJECTOR]) || null; + lView[T_HOST] = tHostNode; + lView[ID] = getUniqueLViewId(); + lView[HYDRATION] = hydrationInfo; + lView[EMBEDDED_VIEW_INJECTOR as any] = embeddedViewInjector; + + ngDevMode && + assertEqual( + tView.type == TViewType.Embedded ? parentLView !== null : true, + true, + 'Embedded views must have parentLView', + ); + lView[DECLARATION_COMPONENT_VIEW] = + tView.type == TViewType.Embedded ? parentLView![DECLARATION_COMPONENT_VIEW] : lView; + return lView as LView; +} + +export function createComponentLView( + lView: LView, + hostTNode: TElementNode, + def: ComponentDef, +): LView { + const native = getNativeByTNode(hostTNode, lView) as RElement; + const tView = getOrCreateComponentTView(def); + + // Only component views should be added to the view tree directly. Embedded views are + // accessed through their containers because they may be removed / re-added later. + const rendererFactory = lView[ENVIRONMENT].rendererFactory; + const componentView = addToEndOfViewTree( + lView, + createLView( + lView, + tView, + null, + getInitialLViewFlagsFromDef(def), + native, + hostTNode as TElementNode, + null, + rendererFactory.createRenderer(native, def), + null, + null, + null, + ), + ); + + // Component view will always be created before any injected LContainers, + // so this is a regular element, wrap it with the component view + return (lView[hostTNode.index] = componentView); +} + +/** + * Gets the initial set of LView flags based on the component definition that the LView represents. + * @param def Component definition from which to determine the flags. + */ +export function getInitialLViewFlagsFromDef(def: ComponentDef): LViewFlags { + let flags = LViewFlags.CheckAlways; + if (def.signals) { + flags = LViewFlags.SignalView; + } else if (def.onPush) { + flags = LViewFlags.Dirty; + } + return flags; +} + +/** + * When elements are created dynamically after a view blueprint is created (e.g. through + * i18nApply()), we need to adjust the blueprint for future template passes. + * + * @param tView `TView` associated with `LView` + * @param lView The `LView` containing the blueprint to adjust + * @param numSlotsToAlloc The number of slots to alloc in the LView, should be >0 + * @param initialValue Initial value to store in blueprint + */ +export function allocExpando( + tView: TView, + lView: LView, + numSlotsToAlloc: number, + initialValue: unknown, +): number { + if (numSlotsToAlloc === 0) return -1; + if (ngDevMode) { + assertFirstCreatePass(tView); + assertSame(tView, lView[TVIEW], '`LView` must be associated with `TView`!'); + assertEqual(tView.data.length, lView.length, 'Expecting LView to be same size as TView'); + assertEqual( + tView.data.length, + tView.blueprint.length, + 'Expecting Blueprint to be same size as TView', + ); + assertFirstUpdatePass(tView); + } + const allocIdx = lView.length; + for (let i = 0; i < numSlotsToAlloc; i++) { + lView.push(initialValue); + tView.blueprint.push(initialValue); + tView.data.push(null); + } + return allocIdx; +} + +/** + * Adds LView or LContainer to the end of the current view tree. + * + * This structure will be used to traverse through nested views to remove listeners + * and call onDestroy callbacks. + * + * @param lView The view where LView or LContainer should be added + * @param adjustedHostIndex Index of the view's host node in LView[], adjusted for header + * @param lViewOrLContainer The LView or LContainer to add to the view tree + * @returns The state passed in + */ +export function addToEndOfViewTree( + lView: LView, + lViewOrLContainer: T, +): T { + // TODO(benlesh/misko): This implementation is incorrect, because it always adds the LContainer + // to the end of the queue, which means if the developer retrieves the LContainers from RNodes out + // of order, the change detection will run out of order, as the act of retrieving the the + // LContainer from the RNode is what adds it to the queue. + if (lView[CHILD_HEAD]) { + lView[CHILD_TAIL]![NEXT] = lViewOrLContainer; + } else { + lView[CHILD_HEAD] = lViewOrLContainer; + } + lView[CHILD_TAIL] = lViewOrLContainer; + return lViewOrLContainer; +} diff --git a/packages/core/src/render3/view/container.ts b/packages/core/src/render3/view/container.ts new file mode 100644 index 000000000000..e8a9e70898f6 --- /dev/null +++ b/packages/core/src/render3/view/container.ts @@ -0,0 +1,260 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {addToArray, removeFromArray} from '../../util/array_utils'; +import {assertDefined, assertEqual} from '../../util/assert'; +import {assertLContainer, assertLView} from '../assert'; +import { + CONTAINER_HEADER_OFFSET, + LContainer, + LContainerFlags, + MOVED_VIEWS, + NATIVE, +} from '../interfaces/container'; +import {TNode} from '../interfaces/node'; +import {RComment, RElement} from '../interfaces/renderer_dom'; +import {isLView} from '../interfaces/type_checks'; +import { + DECLARATION_COMPONENT_VIEW, + DECLARATION_LCONTAINER, + FLAGS, + HYDRATION, + LView, + LViewFlags, + NEXT, + PARENT, + QUERIES, + RENDERER, + T_HOST, + TView, + TVIEW, +} from '../interfaces/view'; +import { + addViewToDOM, + destroyLView, + detachMovedView, + getBeforeNodeForView, + removeViewFromDOM, +} from '../node_manipulation'; +import {updateAncestorTraversalFlagsOnAttach} from '../util/view_utils'; + +/** + * Creates a LContainer, either from a container instruction, or for a ViewContainerRef. + * + * @param hostNative The host element for the LContainer + * @param hostTNode The host TNode for the LContainer + * @param currentView The parent view of the LContainer + * @param native The native comment element + * @param isForViewContainerRef Optional a flag indicating the ViewContainerRef case + * @returns LContainer + */ +export function createLContainer( + hostNative: RElement | RComment | LView, + currentView: LView, + native: RComment, + tNode: TNode, +): LContainer { + ngDevMode && assertLView(currentView); + const lContainer: LContainer = [ + hostNative, // host native + true, // Boolean `true` in this position signifies that this is an `LContainer` + 0, // flags + currentView, // parent + null, // next + tNode, // t_host + null, // dehydrated views + native, // native, + null, // view refs + null, // moved views + ]; + ngDevMode && + assertEqual( + lContainer.length, + CONTAINER_HEADER_OFFSET, + 'Should allocate correct number of slots for LContainer header.', + ); + return lContainer; +} + +export function getLViewFromLContainer( + lContainer: LContainer, + index: number, +): LView | undefined { + const adjustedIndex = CONTAINER_HEADER_OFFSET + index; + // avoid reading past the array boundaries + if (adjustedIndex < lContainer.length) { + const lView = lContainer[adjustedIndex]; + ngDevMode && assertLView(lView); + return lView as LView; + } + return undefined; +} + +export function addLViewToLContainer( + lContainer: LContainer, + lView: LView, + index: number, + addToDOM = true, +): void { + const tView = lView[TVIEW]; + + // Insert into the view tree so the new view can be change-detected + insertView(tView, lView, lContainer, index); + + // Insert elements that belong to this view into the DOM tree + if (addToDOM) { + const beforeNode = getBeforeNodeForView(index, lContainer); + const renderer = lView[RENDERER]; + const parentRNode = renderer.parentNode(lContainer[NATIVE] as RElement | RComment); + if (parentRNode !== null) { + addViewToDOM(tView, lContainer[T_HOST], renderer, lView, parentRNode, beforeNode); + } + } + + // When in hydration mode, reset the pointer to the first child in + // the dehydrated view. This indicates that the view was hydrated and + // further attaching/detaching should work with this view as normal. + const hydrationInfo = lView[HYDRATION]; + if (hydrationInfo !== null && hydrationInfo.firstChild !== null) { + hydrationInfo.firstChild = null; + } +} + +export function removeLViewFromLContainer( + lContainer: LContainer, + index: number, +): LView | undefined { + const lView = detachView(lContainer, index); + if (lView !== undefined) { + destroyLView(lView[TVIEW], lView); + } + return lView; +} + +/** + * Detaches a view from a container. + * + * This method removes the view from the container's array of active views. It also + * removes the view's elements from the DOM. + * + * @param lContainer The container from which to detach a view + * @param removeIndex The index of the view to detach + * @returns Detached LView instance. + */ +export function detachView(lContainer: LContainer, removeIndex: number): LView | undefined { + if (lContainer.length <= CONTAINER_HEADER_OFFSET) return; + + const indexInContainer = CONTAINER_HEADER_OFFSET + removeIndex; + const viewToDetach = lContainer[indexInContainer]; + + if (viewToDetach) { + const declarationLContainer = viewToDetach[DECLARATION_LCONTAINER]; + if (declarationLContainer !== null && declarationLContainer !== lContainer) { + detachMovedView(declarationLContainer, viewToDetach); + } + + if (removeIndex > 0) { + lContainer[indexInContainer - 1][NEXT] = viewToDetach[NEXT] as LView; + } + const removedLView = removeFromArray(lContainer, CONTAINER_HEADER_OFFSET + removeIndex); + removeViewFromDOM(viewToDetach[TVIEW], viewToDetach); + + // notify query that a view has been removed + const lQueries = removedLView[QUERIES]; + if (lQueries !== null) { + lQueries.detachView(removedLView[TVIEW]); + } + + viewToDetach[PARENT] = null; + viewToDetach[NEXT] = null; + // Unsets the attached flag + viewToDetach[FLAGS] &= ~LViewFlags.Attached; + } + return viewToDetach; +} + +/** + * Inserts a view into a container. + * + * This adds the view to the container's array of active views in the correct + * position. It also adds the view's elements to the DOM if the container isn't a + * root node of another view (in that case, the view's elements will be added when + * the container's parent view is added later). + * + * @param tView The `TView' of the `LView` to insert + * @param lView The view to insert + * @param lContainer The container into which the view should be inserted + * @param index Which index in the container to insert the child view into + */ +function insertView(tView: TView, lView: LView, lContainer: LContainer, index: number) { + ngDevMode && assertLView(lView); + ngDevMode && assertLContainer(lContainer); + const indexInContainer = CONTAINER_HEADER_OFFSET + index; + const containerLength = lContainer.length; + + if (index > 0) { + // This is a new view, we need to add it to the children. + lContainer[indexInContainer - 1][NEXT] = lView; + } + if (index < containerLength - CONTAINER_HEADER_OFFSET) { + lView[NEXT] = lContainer[indexInContainer]; + addToArray(lContainer, CONTAINER_HEADER_OFFSET + index, lView); + } else { + lContainer.push(lView); + lView[NEXT] = null; + } + + lView[PARENT] = lContainer; + + // track views where declaration and insertion points are different + const declarationLContainer = lView[DECLARATION_LCONTAINER]; + if (declarationLContainer !== null && lContainer !== declarationLContainer) { + trackMovedView(declarationLContainer, lView); + } + + // notify query that a new view has been added + const lQueries = lView[QUERIES]; + if (lQueries !== null) { + lQueries.insertView(tView); + } + + updateAncestorTraversalFlagsOnAttach(lView); + // Sets the attached flag + lView[FLAGS] |= LViewFlags.Attached; +} + +/** + * Track views created from the declaration container (TemplateRef) and inserted into a + * different LContainer or attached directly to ApplicationRef. + */ +export function trackMovedView(declarationContainer: LContainer, lView: LView) { + ngDevMode && assertDefined(lView, 'LView required'); + ngDevMode && assertLContainer(declarationContainer); + const movedViews = declarationContainer[MOVED_VIEWS]; + const parent = lView[PARENT]!; + ngDevMode && assertDefined(parent, 'missing parent'); + if (isLView(parent)) { + declarationContainer[FLAGS] |= LContainerFlags.HasTransplantedViews; + } else { + const insertedComponentLView = parent[PARENT]![DECLARATION_COMPONENT_VIEW]; + ngDevMode && assertDefined(insertedComponentLView, 'Missing insertedComponentLView'); + const declaredComponentLView = lView[DECLARATION_COMPONENT_VIEW]; + ngDevMode && assertDefined(declaredComponentLView, 'Missing declaredComponentLView'); + if (declaredComponentLView !== insertedComponentLView) { + // At this point the declaration-component is not same as insertion-component; this means that + // this is a transplanted view. Mark the declared lView as having transplanted views so that + // those views can participate in CD. + declarationContainer[FLAGS] |= LContainerFlags.HasTransplantedViews; + } + } + if (movedViews === null) { + declarationContainer[MOVED_VIEWS] = [lView]; + } else { + movedViews.push(lView); + } +} diff --git a/packages/core/src/render3/view/directives.ts b/packages/core/src/render3/view/directives.ts new file mode 100644 index 000000000000..177730ed5e30 --- /dev/null +++ b/packages/core/src/render3/view/directives.ts @@ -0,0 +1,663 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {RuntimeError, RuntimeErrorCode} from '../../errors'; +import {Writable} from '../../interface/type'; +import {DoCheck, OnChanges, OnInit} from '../../interface/lifecycle_hooks'; +import { + assertDefined, + assertGreaterThan, + assertGreaterThanOrEqual, + assertNotEqual, + assertSame, +} from '../../util/assert'; +import {assertFirstCreatePass} from '../assert'; +import {getFactoryDef} from '../definition_factory'; +import {diPublicInInjector, getOrCreateNodeInjectorForNode} from '../di'; +import {ɵɵdirectiveInject} from '../instructions/di'; +import {AttributeMarker} from '../interfaces/attribute_marker'; +import type { + ComponentDef, + DirectiveDef, + HostDirectiveDef, + HostDirectiveDefs, +} from '../interfaces/definition'; +import {NodeInjectorFactory} from '../interfaces/injector'; +import { + HostDirectiveInputs, + HostDirectiveOutputs, + InitialInputs, + NodeInputBindings, + NodeOutputBindings, + TNodeFlags, + type TContainerNode, + type TElementContainerNode, + type TElementNode, + type TNode, +} from '../interfaces/node'; +import {isComponentDef} from '../interfaces/type_checks'; +import {HEADER_OFFSET, HostBindingOpCodes, type LView, type TView} from '../interfaces/view'; +import {isInlineTemplate} from '../node_selector_matcher'; +import {NO_CHANGE} from '../tokens'; +import {mergeHostAttrs} from '../util/attrs_utils'; +import {allocExpando} from './construction'; + +export type DirectiveMatcherStrategy = ( + tView: TView, + tNode: TElementNode | TContainerNode | TElementContainerNode, +) => DirectiveDef[] | null; + +/** Data produced after host directives are resolved for a node. */ +type HostDirectiveResolution = [ + matches: DirectiveDef[], + hostDirectiveDefs: HostDirectiveDefs | null, + hostDirectiveRanges: HostDirectiveRanges | null, +]; + +/** + * Map that tracks a selector-matched directive to the range within which its host directives + * are declared. Host directives for a specific directive are always contiguous within the runtime. + * Note that both the start and end are inclusive and they're both **after** `tNode.directiveStart`. + */ +type HostDirectiveRanges = Map, [start: number, end: number]>; + +/** + * Resolve the matched directives on a node. + */ +export function resolveDirectives( + tView: TView, + lView: LView, + tNode: TElementNode | TContainerNode | TElementContainerNode, + localRefs: string[] | null, + directiveMatcher: DirectiveMatcherStrategy, +): void { + // Please make sure to have explicit type for `exportsMap`. Inferred type triggers bug in tsickle. + ngDevMode && assertFirstCreatePass(tView); + + const exportsMap: Record | null = localRefs === null ? null : {'': -1}; + const matchedDirectiveDefs = directiveMatcher(tView, tNode); + + if (matchedDirectiveDefs !== null) { + let directiveDefs: DirectiveDef[]; + let hostDirectiveDefs: HostDirectiveDefs | null = null; + let hostDirectiveRanges: HostDirectiveRanges | null = null; + const hostDirectiveResolution = resolveHostDirectives(matchedDirectiveDefs); + + if (hostDirectiveResolution === null) { + directiveDefs = matchedDirectiveDefs; + } else { + [directiveDefs, hostDirectiveDefs, hostDirectiveRanges] = hostDirectiveResolution; + } + + initializeDirectives( + tView, + lView, + tNode, + directiveDefs, + exportsMap, + hostDirectiveDefs, + hostDirectiveRanges, + ); + } + if (exportsMap !== null && localRefs !== null) { + cacheMatchingLocalNames(tNode, localRefs, exportsMap); + } +} + +/** Caches local names and their matching directive indices for query and template lookups. */ +function cacheMatchingLocalNames( + tNode: TNode, + localRefs: string[], + exportsMap: {[key: string]: number}, +): void { + const localNames: (string | number)[] = (tNode.localNames = []); + + // Local names must be stored in tNode in the same order that localRefs are defined + // in the template to ensure the data is loaded in the same slots as their refs + // in the template (for template queries). + for (let i = 0; i < localRefs.length; i += 2) { + const index = exportsMap[localRefs[i + 1]]; + if (index == null) + throw new RuntimeError( + RuntimeErrorCode.EXPORT_NOT_FOUND, + ngDevMode && `Export of name '${localRefs[i + 1]}' not found!`, + ); + localNames.push(localRefs[i], index); + } +} + +function resolveHostDirectives(matches: DirectiveDef[]): HostDirectiveResolution | null { + let componentDef: ComponentDef | null = null; + let hasHostDirectives = false; + + for (let i = 0; i < matches.length; i++) { + const def = matches[i]; + + if (i === 0 && isComponentDef(def)) { + componentDef = def; + } + + if (def.findHostDirectiveDefs !== null) { + hasHostDirectives = true; + break; + } + } + + if (!hasHostDirectives) { + return null; + } + + let allDirectiveDefs: DirectiveDef[] | null = null; + let hostDirectiveDefs: HostDirectiveDefs | null = null; + let hostDirectiveRanges: HostDirectiveRanges | null = null; + + // Components are inserted at the front of the matches array so that their lifecycle + // hooks run before any directive lifecycle hooks. This appears to be for ViewEngine + // compatibility. This logic doesn't make sense with host directives, because it + // would allow the host directives to undo any overrides the host may have made. + // To handle this case, the host directives of components are inserted at the beginning + // of the array, followed by the component. As such, the insertion order is as follows: + // 1. Host directives belonging to the selector-matched component. + // 2. Selector-matched component. + // 3. Host directives belonging to selector-matched directives. + // 4. Selector-matched dir + for (const def of matches) { + if (def.findHostDirectiveDefs !== null) { + allDirectiveDefs ??= []; + hostDirectiveDefs ??= new Map(); + hostDirectiveRanges ??= new Map(); + resolveHostDirectivesForDef(def, allDirectiveDefs, hostDirectiveRanges, hostDirectiveDefs); + } + + // Component definition needs to be pushed early to maintain the correct ordering. + if (def === componentDef) { + allDirectiveDefs ??= []; + allDirectiveDefs.push(def); + } + } + + if (allDirectiveDefs !== null) { + allDirectiveDefs.push(...(componentDef === null ? matches : matches.slice(1))); + ngDevMode && assertNoDuplicateDirectives(allDirectiveDefs); + return [allDirectiveDefs, hostDirectiveDefs, hostDirectiveRanges]; + } + + return null; +} + +function resolveHostDirectivesForDef( + def: DirectiveDef, + allDirectiveDefs: DirectiveDef[], + hostDirectiveRanges: HostDirectiveRanges, + hostDirectiveDefs: HostDirectiveDefs, +) { + ngDevMode && assertDefined(def.findHostDirectiveDefs, 'Expected host directive resolve function'); + const start = allDirectiveDefs.length; + // TODO(pk): probably could return matches instead of taking in an array to fill in? + def.findHostDirectiveDefs!(def, allDirectiveDefs, hostDirectiveDefs); + + // Note that these indexes are within the offset by `directiveStart`. We can't do the + // offsetting here, because `directiveStart` hasn't been initialized on the TNode yet. + hostDirectiveRanges.set(def, [start, allDirectiveDefs.length - 1]); +} + +/** + * Marks a given TNode as a component's host. This consists of: + * - setting the component offset on the TNode. + * - storing index of component's host element so it will be queued for view refresh during CD. + */ +function markAsComponentHost(tView: TView, hostTNode: TNode, componentOffset: number): void { + ngDevMode && assertFirstCreatePass(tView); + ngDevMode && assertGreaterThan(componentOffset, -1, 'componentOffset must be great than -1'); + hostTNode.componentOffset = componentOffset; + (tView.components ??= []).push(hostTNode.index); +} + +/** Initializes the data structures necessary for a list of directives to be instantiated. */ +function initializeDirectives( + tView: TView, + lView: LView, + tNode: TElementNode | TContainerNode | TElementContainerNode, + directives: DirectiveDef[], + exportsMap: {[key: string]: number} | null, + hostDirectiveDefs: HostDirectiveDefs | null, + hostDirectiveRanges: HostDirectiveRanges | null, +) { + ngDevMode && assertFirstCreatePass(tView); + + const directivesLength = directives.length; + let hasSeenComponent = false; + + // Publishes the directive types to DI so they can be injected. Needs to + // happen in a separate pass before the TNode flags have been initialized. + for (let i = 0; i < directivesLength; i++) { + const def = directives[i]; + if (!hasSeenComponent && isComponentDef(def)) { + hasSeenComponent = true; + markAsComponentHost(tView, tNode, i); + } + diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, def.type); + } + + initTNodeFlags(tNode, tView.data.length, directivesLength); + + // When the same token is provided by several directives on the same node, some rules apply in + // the viewEngine: + // - viewProviders have priority over providers + // - the last directive in NgModule.declarations has priority over the previous one + // So to match these rules, the order in which providers are added in the arrays is very + // important. + for (let i = 0; i < directivesLength; i++) { + const def = directives[i]; + if (def.providersResolver) def.providersResolver(def); + } + let preOrderHooksFound = false; + let preOrderCheckHooksFound = false; + let directiveIdx = allocExpando(tView, lView, directivesLength, null); + ngDevMode && + assertSame( + directiveIdx, + tNode.directiveStart, + 'TNode.directiveStart should point to just allocated space', + ); + + // If there's at least one directive, we'll have to track it so initialize the map. + if (directivesLength > 0) { + tNode.directiveToIndex = new Map(); + } + + for (let i = 0; i < directivesLength; i++) { + const def = directives[i]; + // Merge the attrs in the order of matches. This assumes that the first directive is the + // component itself, so that the component has the least priority. + tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, def.hostAttrs); + + configureViewWithDirective(tView, tNode, lView, directiveIdx, def); + saveNameToExportMap(directiveIdx, def, exportsMap); + + // If a directive has host directives, we need to track both its index and the range within + // the host directives are declared. Host directives are not tracked, but should be resolved + // by looking up the host and getting its indexes from there. + if (hostDirectiveRanges !== null && hostDirectiveRanges.has(def)) { + const [start, end] = hostDirectiveRanges.get(def)!; + tNode.directiveToIndex!.set(def.type, [ + directiveIdx, + start + tNode.directiveStart, + end + tNode.directiveStart, + ]); + } else if (hostDirectiveDefs === null || !hostDirectiveDefs.has(def)) { + tNode.directiveToIndex!.set(def.type, directiveIdx); + } + + if (def.contentQueries !== null) tNode.flags |= TNodeFlags.hasContentQuery; + if (def.hostBindings !== null || def.hostAttrs !== null || def.hostVars !== 0) + tNode.flags |= TNodeFlags.hasHostBindings; + + const lifeCycleHooks: Partial = def.type.prototype; + // Only push a node index into the preOrderHooks array if this is the first + // pre-order hook found on this node. + if ( + !preOrderHooksFound && + (lifeCycleHooks.ngOnChanges || lifeCycleHooks.ngOnInit || lifeCycleHooks.ngDoCheck) + ) { + // We will push the actual hook function into this array later during dir instantiation. + // We cannot do it now because we must ensure hooks are registered in the same + // order that directives are created (i.e. injection order). + (tView.preOrderHooks ??= []).push(tNode.index); + preOrderHooksFound = true; + } + + if (!preOrderCheckHooksFound && (lifeCycleHooks.ngOnChanges || lifeCycleHooks.ngDoCheck)) { + (tView.preOrderCheckHooks ??= []).push(tNode.index); + preOrderCheckHooksFound = true; + } + + directiveIdx++; + } + + initializeInputAndOutputAliases(tView, tNode, hostDirectiveDefs); +} + +/** + * Initializes data structures required to work with directive inputs and outputs. + * Initialization is done for all directives matched on a given TNode. + */ +function initializeInputAndOutputAliases( + tView: TView, + tNode: TNode, + hostDirectiveDefs: HostDirectiveDefs | null, +): void { + ngDevMode && assertFirstCreatePass(tView); + + for (let index = tNode.directiveStart; index < tNode.directiveEnd; index++) { + const directiveDef = tView.data[index] as DirectiveDef; + + if (hostDirectiveDefs === null || !hostDirectiveDefs.has(directiveDef)) { + setupSelectorMatchedInputsOrOutputs(BindingType.Inputs, tNode, directiveDef, index); + setupSelectorMatchedInputsOrOutputs(BindingType.Outputs, tNode, directiveDef, index); + setupInitialInputs(tNode, index, false); + } else { + const hostDirectiveDef = hostDirectiveDefs.get(directiveDef)!; + setupHostDirectiveInputsOrOutputs(BindingType.Inputs, tNode, hostDirectiveDef, index); + setupHostDirectiveInputsOrOutputs(BindingType.Outputs, tNode, hostDirectiveDef, index); + setupInitialInputs(tNode, index, true); + } + } +} + +/** Types of bindings that can be exposed by a directive. */ +const enum BindingType { + Inputs, + Outputs, +} + +/** + * Sets up the input/output bindings for a directive that was matched in the template through its + * selector. This method is called repeatedly to build up all of the available inputs on a node. + * + * @param mode Whether inputs or outputs are being contructed. + * @param tNode Node on which the bindings are being set up. + * @param def Directive definition for which the bindings are being set up. + * @param directiveIndex Index at which the directive instance will be stored in the LView. + */ +function setupSelectorMatchedInputsOrOutputs( + mode: BindingType, + tNode: TNode, + def: DirectiveDef, + directiveIndex: number, +): void { + const aliasMap = mode === BindingType.Inputs ? def.inputs : def.outputs; + + for (const publicName in aliasMap) { + if (aliasMap.hasOwnProperty(publicName)) { + let bindings: NodeInputBindings | NodeOutputBindings; + if (mode === BindingType.Inputs) { + bindings = tNode.inputs ??= {}; + } else { + bindings = tNode.outputs ??= {}; + } + bindings[publicName] ??= []; + bindings[publicName].push(directiveIndex); + setShadowStylingInputFlags(tNode, publicName); + } + } +} + +/** + * Sets up input/output bindings that were defined through host directives on a specific node. + * @param mode Whether inputs or outputs are being contructed. + * @param tNode Node on which the bindings are being set up. + * @param config Host directive definition that is being set up. + * @param directiveIndex Index at which the directive instance will be stored in the LView. + */ +function setupHostDirectiveInputsOrOutputs( + mode: BindingType, + tNode: TNode, + config: HostDirectiveDef, + directiveIndex: number, +): void { + const aliasMap = mode === BindingType.Inputs ? config.inputs : config.outputs; + + for (const initialName in aliasMap) { + if (aliasMap.hasOwnProperty(initialName)) { + const publicName = aliasMap[initialName]; + let bindings: HostDirectiveInputs | HostDirectiveOutputs; + if (mode === BindingType.Inputs) { + bindings = tNode.hostDirectiveInputs ??= {}; + } else { + bindings = tNode.hostDirectiveOutputs ??= {}; + } + bindings[publicName] ??= []; + bindings[publicName].push(directiveIndex, initialName); + setShadowStylingInputFlags(tNode, publicName); + } + } +} + +function setShadowStylingInputFlags(tNode: TNode, publicName: string): void { + if (publicName === 'class') { + tNode.flags |= TNodeFlags.hasClassInput; + } else if (publicName === 'style') { + tNode.flags |= TNodeFlags.hasStyleInput; + } +} + +/** + * Sets up the initialInputData for a node and stores it in the template's static storage + * so subsequent template invocations don't have to recalculate it. + * + * initialInputData is an array containing values that need to be set as input properties + * for directives on this node, but only once on creation. We need this array to support + * the case where you set an @Input property of a directive using attribute-like syntax. + * e.g. if you have a `name` @Input, you can set it once like this: + * + * + * + * @param tNode TNode on which to set up the initial inputs. + * @param directiveIndex Index of the directive that is currently being processed. + */ +function setupInitialInputs(tNode: TNode, directiveIndex: number, isHostDirective: boolean): void { + const {attrs, inputs, hostDirectiveInputs} = tNode; + + if ( + attrs === null || + (!isHostDirective && inputs === null) || + (isHostDirective && hostDirectiveInputs === null) || + // Do not use unbound attributes as inputs to structural directives, since structural + // directive inputs can only be set using microsyntax (e.g. `
    `). + isInlineTemplate(tNode) + ) { + tNode.initialInputs ??= []; + tNode.initialInputs.push(null); + return; + } + + let inputsToStore: InitialInputs | null = null; + let i = 0; + while (i < attrs.length) { + const attrName = attrs[i]; + if (attrName === AttributeMarker.NamespaceURI) { + // We do not allow inputs on namespaced attributes. + i += 4; + continue; + } else if (attrName === AttributeMarker.ProjectAs) { + // Skip over the `ngProjectAs` value. + i += 2; + continue; + } else if (typeof attrName === 'number') { + // If we hit any other attribute markers, we're done anyway. None of those are valid inputs. + break; + } + + if (!isHostDirective && inputs!.hasOwnProperty(attrName as string)) { + // Find the input's public name from the input store. Note that we can be found easier + // through the directive def, but we want to do it using the inputs store so that it can + // account for host directive aliases. + const inputConfig = inputs![attrName as string]; + + for (const index of inputConfig) { + if (index === directiveIndex) { + inputsToStore ??= []; + inputsToStore.push(attrName as string, attrs[i + 1] as string); + // A directive can't have multiple inputs with the same name so we can break here. + break; + } + } + } else if (isHostDirective && hostDirectiveInputs!.hasOwnProperty(attrName as string)) { + const config = hostDirectiveInputs![attrName as string]; + for (let j = 0; j < config.length; j += 2) { + if (config[j] === directiveIndex) { + inputsToStore ??= []; + inputsToStore.push(config[j + 1] as string, attrs[i + 1] as string); + break; + } + } + } + + i += 2; + } + + tNode.initialInputs ??= []; + tNode.initialInputs.push(inputsToStore); +} + +/** + * Setup directive for instantiation. + * + * We need to create a `NodeInjectorFactory` which is then inserted in both the `Blueprint` as well + * as `LView`. `TView` gets the `DirectiveDef`. + * + * @param tView `TView` + * @param tNode `TNode` + * @param lView `LView` + * @param directiveIndex Index where the directive will be stored in the Expando. + * @param def `DirectiveDef` + */ +function configureViewWithDirective( + tView: TView, + tNode: TNode, + lView: LView, + directiveIndex: number, + def: DirectiveDef, +): void { + ngDevMode && + assertGreaterThanOrEqual(directiveIndex, HEADER_OFFSET, 'Must be in Expando section'); + tView.data[directiveIndex] = def; + const directiveFactory = + def.factory || ((def as Writable>).factory = getFactoryDef(def.type, true)); + // Even though `directiveFactory` will already be using `ɵɵdirectiveInject` in its generated code, + // we also want to support `inject()` directly from the directive constructor context so we set + // `ɵɵdirectiveInject` as the inject implementation here too. + const nodeInjectorFactory = new NodeInjectorFactory( + directiveFactory, + isComponentDef(def), + ɵɵdirectiveInject, + ); + tView.blueprint[directiveIndex] = nodeInjectorFactory; + lView[directiveIndex] = nodeInjectorFactory; + + registerHostBindingOpCodes( + tView, + tNode, + directiveIndex, + allocExpando(tView, lView, def.hostVars, NO_CHANGE), + def, + ); +} + +/** + * Add `hostBindings` to the `TView.hostBindingOpCodes`. + * + * @param tView `TView` to which the `hostBindings` should be added. + * @param tNode `TNode` the element which contains the directive + * @param directiveIdx Directive index in view. + * @param directiveVarsIdx Where will the directive's vars be stored + * @param def `ComponentDef`/`DirectiveDef`, which contains the `hostVars`/`hostBindings` to add. + */ +export function registerHostBindingOpCodes( + tView: TView, + tNode: TNode, + directiveIdx: number, + directiveVarsIdx: number, + def: ComponentDef | DirectiveDef, +): void { + ngDevMode && assertFirstCreatePass(tView); + + const hostBindings = def.hostBindings; + if (hostBindings) { + let hostBindingOpCodes = tView.hostBindingOpCodes; + if (hostBindingOpCodes === null) { + hostBindingOpCodes = tView.hostBindingOpCodes = [] as any as HostBindingOpCodes; + } + const elementIndx = ~tNode.index; + if (lastSelectedElementIdx(hostBindingOpCodes) != elementIndx) { + // Conditionally add select element so that we are more efficient in execution. + // NOTE: this is strictly not necessary and it trades code size for runtime perf. + // (We could just always add it.) + hostBindingOpCodes.push(elementIndx); + } + hostBindingOpCodes.push(directiveIdx, directiveVarsIdx, hostBindings); + } +} + +/** + * Returns the last selected element index in the `HostBindingOpCodes` + * + * For perf reasons we don't need to update the selected element index in `HostBindingOpCodes` only + * if it changes. This method returns the last index (or '0' if not found.) + * + * Selected element index are only the ones which are negative. + */ +function lastSelectedElementIdx(hostBindingOpCodes: HostBindingOpCodes): number { + let i = hostBindingOpCodes.length; + while (i > 0) { + const value = hostBindingOpCodes[--i]; + if (typeof value === 'number' && value < 0) { + return value; + } + } + return 0; +} + +/** + * Builds up an export map as directives are created, so local refs can be quickly mapped + * to their directive instances. + */ +function saveNameToExportMap( + directiveIdx: number, + def: DirectiveDef | ComponentDef, + exportsMap: {[key: string]: number} | null, +) { + if (exportsMap) { + if (def.exportAs) { + for (let i = 0; i < def.exportAs.length; i++) { + exportsMap[def.exportAs[i]] = directiveIdx; + } + } + if (isComponentDef(def)) exportsMap[''] = directiveIdx; + } +} + +/** + * Initializes the flags on the current node, setting all indices to the initial index, + * the directive count to 0, and adding the isComponent flag. + * @param index the initial index + */ +function initTNodeFlags(tNode: TNode, index: number, numberOfDirectives: number) { + ngDevMode && + assertNotEqual( + numberOfDirectives, + tNode.directiveEnd - tNode.directiveStart, + 'Reached the max number of directives', + ); + tNode.flags |= TNodeFlags.isDirectiveHost; + // When the first directive is created on a node, save the index + tNode.directiveStart = index; + tNode.directiveEnd = index + numberOfDirectives; + tNode.providerIndexes = index; +} + +export function assertNoDuplicateDirectives(directives: DirectiveDef[]): void { + // The array needs at least two elements in order to have duplicates. + if (directives.length < 2) { + return; + } + + const seenDirectives = new Set>(); + + for (const current of directives) { + if (seenDirectives.has(current)) { + throw new RuntimeError( + RuntimeErrorCode.DUPLICATE_DIRECTIVE, + `Directive ${current.type.name} matches multiple times on the same element. ` + + `Directives can only match an element once.`, + ); + } + seenDirectives.add(current); + } +} diff --git a/packages/core/src/render3/view/elements.ts b/packages/core/src/render3/view/elements.ts new file mode 100644 index 000000000000..a0f7615a1c6a --- /dev/null +++ b/packages/core/src/render3/view/elements.ts @@ -0,0 +1,71 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {assertFirstCreatePass} from '../assert'; +import {registerPostOrderHooks} from '../hooks'; +import {TAttributes, TNode, TNodeType, type TElementNode} from '../interfaces/node'; +import {isContentQueryHost} from '../interfaces/type_checks'; +import type {LView, TView} from '../interfaces/view'; +import {computeStaticStyling} from '../styling/static_styling'; +import {getOrCreateTNode} from '../tnode_manipulation'; +import {mergeHostAttrs} from '../util/attrs_utils'; +import {getConstant} from '../util/view_utils'; +import {resolveDirectives, type DirectiveMatcherStrategy} from './directives'; + +export function elementStartFirstCreatePass( + index: number, + tView: TView, + lView: LView, + name: string, + directiveMatcher: DirectiveMatcherStrategy, + bindingsEnabled: boolean, + attrsIndex?: number | null, + localRefsIndex?: number, +): TElementNode { + ngDevMode && assertFirstCreatePass(tView); + ngDevMode && ngDevMode.firstCreatePass++; + + const tViewConsts = tView.consts; + const attrs = getConstant(tViewConsts, attrsIndex); + const tNode = getOrCreateTNode(tView, index, TNodeType.Element, name, attrs); + + if (bindingsEnabled) { + resolveDirectives( + tView, + lView, + tNode, + getConstant(tViewConsts, localRefsIndex), + directiveMatcher, + ); + } + + // Merge the template attrs last so that they have the highest priority. + tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs); + + if (tNode.attrs !== null) { + computeStaticStyling(tNode, tNode.attrs, false); + } + + if (tNode.mergedAttrs !== null) { + computeStaticStyling(tNode, tNode.mergedAttrs, true); + } + + if (tView.queries !== null) { + tView.queries.elementStart(tView, tNode); + } + + return tNode; +} + +export function elementEndFirstCreatePass(tView: TView, tNode: TNode) { + ngDevMode && assertFirstCreatePass(tView); + registerPostOrderHooks(tView, tNode); + if (isContentQueryHost(tNode)) { + tView.queries!.elementEnd(tNode); + } +} diff --git a/packages/core/src/render3/view_manipulation.ts b/packages/core/src/render3/view_manipulation.ts index 4b2e783c3c5f..c138f58a2c60 100644 --- a/packages/core/src/render3/view_manipulation.ts +++ b/packages/core/src/render3/view_manipulation.ts @@ -13,31 +13,11 @@ import {DehydratedContainerView} from '../hydration/interfaces'; import {hasInSkipHydrationBlockFlag} from '../hydration/skip_hydration'; import {assertDefined} from '../util/assert'; -import {assertLContainer, assertLView, assertTNodeForLView} from './assert'; +import {assertLContainer, assertTNodeForLView} from './assert'; import {renderView} from './instructions/render'; -import {createLView} from './instructions/shared'; -import {CONTAINER_HEADER_OFFSET, LContainer, NATIVE} from './interfaces/container'; import {TNode} from './interfaces/node'; -import {RComment, RElement} from './interfaces/renderer_dom'; -import { - DECLARATION_LCONTAINER, - FLAGS, - HYDRATION, - LView, - LViewFlags, - QUERIES, - RENDERER, - T_HOST, - TVIEW, -} from './interfaces/view'; -import { - addViewToDOM, - destroyLView, - detachView, - getBeforeNodeForView, - insertView, - nativeParentNode, -} from './node_manipulation'; +import {DECLARATION_LCONTAINER, FLAGS, LView, LViewFlags, QUERIES} from './interfaces/view'; +import {createLView} from './view/construction'; export function createAndRenderEmbeddedLView( declarationLView: LView, @@ -90,20 +70,6 @@ export function createAndRenderEmbeddedLView( } } -export function getLViewFromLContainer( - lContainer: LContainer, - index: number, -): LView | undefined { - const adjustedIndex = CONTAINER_HEADER_OFFSET + index; - // avoid reading past the array boundaries - if (adjustedIndex < lContainer.length) { - const lView = lContainer[adjustedIndex]; - ngDevMode && assertLView(lView); - return lView as LView; - } - return undefined; -} - /** * Returns whether an elements that belong to a view should be * inserted into the DOM. For client-only cases, DOM elements are @@ -119,44 +85,3 @@ export function shouldAddViewToDom( !dehydratedView || dehydratedView.firstChild === null || hasInSkipHydrationBlockFlag(tNode) ); } - -export function addLViewToLContainer( - lContainer: LContainer, - lView: LView, - index: number, - addToDOM = true, -): void { - const tView = lView[TVIEW]; - - // Insert into the view tree so the new view can be change-detected - insertView(tView, lView, lContainer, index); - - // Insert elements that belong to this view into the DOM tree - if (addToDOM) { - const beforeNode = getBeforeNodeForView(index, lContainer); - const renderer = lView[RENDERER]; - const parentRNode = nativeParentNode(renderer, lContainer[NATIVE] as RElement | RComment); - if (parentRNode !== null) { - addViewToDOM(tView, lContainer[T_HOST], renderer, lView, parentRNode, beforeNode); - } - } - - // When in hydration mode, reset the pointer to the first child in - // the dehydrated view. This indicates that the view was hydrated and - // further attaching/detaching should work with this view as normal. - const hydrationInfo = lView[HYDRATION]; - if (hydrationInfo !== null && hydrationInfo.firstChild !== null) { - hydrationInfo.firstChild = null; - } -} - -export function removeLViewFromLContainer( - lContainer: LContainer, - index: number, -): LView | undefined { - const lView = detachView(lContainer, index); - if (lView !== undefined) { - destroyLView(lView[TVIEW], lView); - } - return lView; -} diff --git a/packages/core/src/render3/view_ref.ts b/packages/core/src/render3/view_ref.ts index dafeffafb7fc..b3fde05ce829 100644 --- a/packages/core/src/render3/view_ref.ts +++ b/packages/core/src/render3/view_ref.ts @@ -29,19 +29,14 @@ import { REACTIVE_TEMPLATE_CONSUMER, TVIEW, } from './interfaces/view'; -import { - destroyLView, - detachMovedView, - detachView, - detachViewFromDOM, - trackMovedView, -} from './node_manipulation'; +import {destroyLView, detachMovedView, detachViewFromDOM} from './node_manipulation'; import {CheckNoChangesMode} from './state'; import { markViewForRefresh, storeLViewOnDestroy, updateAncestorTraversalFlagsOnAttach, } from './util/view_utils'; +import {detachView, trackMovedView} from './view/container'; // Needed due to tsickle downleveling where multiple `implements` with classes creates // multiple @extends in Closure annotations, which is illegal. This workaround fixes diff --git a/packages/core/src/resource/api.ts b/packages/core/src/resource/api.ts index 3006fa9151a7..a6cbab70cb6d 100644 --- a/packages/core/src/resource/api.ts +++ b/packages/core/src/resource/api.ts @@ -68,7 +68,7 @@ export interface Resource { /** * The current value of the `Resource`, or `undefined` if there is no current value. */ - readonly value: Signal; + readonly value: Signal; /** * The current status of the `Resource`, which describes what the resource is currently doing and @@ -91,7 +91,7 @@ export interface Resource { * * This function is reactive. */ - hasValue(): this is Resource & {value: Signal}; + hasValue(): this is Resource>; /** * Instructs the resource to re-load any asynchronous dependency it may have. @@ -112,18 +112,18 @@ export interface Resource { * @experimental */ export interface WritableResource extends Resource { - readonly value: WritableSignal; - hasValue(): this is WritableResource & {value: WritableSignal}; + readonly value: WritableSignal; + hasValue(): this is WritableResource>; /** * Convenience wrapper for `value.set`. */ - set(value: T | undefined): void; + set(value: T): void; /** * Convenience wrapper for `value.update`. */ - update(updater: (value: T | undefined) => T | undefined): void; + update(updater: (value: T) => T): void; asReadonly(): Resource; } @@ -133,6 +133,8 @@ export interface WritableResource extends Resource { * @experimental */ export interface ResourceRef extends WritableResource { + hasValue(): this is ResourceRef>; + /** * Manually destroy the resource, which cancels pending requests and returns it to `idle` state. */ @@ -160,12 +162,21 @@ export interface ResourceLoaderParams { */ export type ResourceLoader = (param: ResourceLoaderParams) => PromiseLike; +/** + * Streaming loader for a `Resource`. + * + * @experimental + */ +export type ResourceStreamingLoader = ( + param: ResourceLoaderParams, +) => PromiseLike>>; + /** * Options to the `resource` function, for creating a resource. * * @experimental */ -export interface ResourceOptions { +export interface BaseResourceOptions { /** * A reactive function which determines the request to be made. Whenever the request changes, the * loader will be triggered to fetch a new value for the resource. @@ -175,9 +186,10 @@ export interface ResourceOptions { request?: () => R; /** - * Loading function which returns a `Promise` of the resource's value for a given request. + * The value which will be returned from the resource when a server value is unavailable, such as + * when the resource is still loading, or in an error state. */ - loader: ResourceLoader; + defaultValue?: NoInfer; /** * Equality function used to compare the return value of the loader. @@ -189,3 +201,48 @@ export interface ResourceOptions { */ injector?: Injector; } + +/** + * Options to the `resource` function, for creating a resource. + * + * @experimental + */ +export interface PromiseResourceOptions extends BaseResourceOptions { + /** + * Loading function which returns a `Promise` of the resource's value for a given request. + */ + loader: ResourceLoader; + + /** + * Cannot specify `stream` and `loader` at the same time. + */ + stream?: never; +} + +/** + * Options to the `resource` function, for creating a resource. + * + * @experimental + */ +export interface StreamingResourceOptions extends BaseResourceOptions { + /** + * Loading function which returns a `Promise` of a signal of the resource's value for a given + * request, which can change over time as new values are received from a stream. + */ + stream: ResourceStreamingLoader; + + /** + * Cannot specify `stream` and `loader` at the same time. + */ + loader?: never; +} + +/** + * @experimental + */ +export type ResourceOptions = PromiseResourceOptions | StreamingResourceOptions; + +/** + * @experimental + */ +export type ResourceStreamItem = {value: T} | {error: unknown}; diff --git a/packages/core/src/resource/resource.ts b/packages/core/src/resource/resource.ts index b81b93e8160e..2e56258cb0b8 100644 --- a/packages/core/src/resource/resource.ts +++ b/packages/core/src/resource/resource.ts @@ -8,23 +8,42 @@ import {untracked} from '../render3/reactivity/untracked'; import {computed} from '../render3/reactivity/computed'; -import {signal, WritableSignal} from '../render3/reactivity/signal'; +import {signal, signalAsReadonlyFn, WritableSignal} from '../render3/reactivity/signal'; import {Signal} from '../render3/reactivity/api'; import {effect, EffectRef} from '../render3/reactivity/effect'; import { ResourceOptions, ResourceStatus, WritableResource, - ResourceLoader, Resource, ResourceRef, + ResourceStreamingLoader, + StreamingResourceOptions, + ResourceStreamItem, } from './api'; -import {ValueEqualityFn, SIGNAL, SignalNode} from '@angular/core/primitives/signals'; + +import {ValueEqualityFn} from '@angular/core/primitives/signals'; + import {Injector} from '../di/injector'; import {assertInInjectionContext} from '../di/contextual'; import {inject} from '../di/injector_compatibility'; import {PendingTasks} from '../pending_tasks'; -import {DestroyRef} from '../linker'; +import {linkedSignal} from '../render3/reactivity/linked_signal'; +import {DestroyRef} from '../linker/destroy_ref'; + +/** + * Constructs a `Resource` that projects a reactive request to an asynchronous operation defined by + * a loader function, which exposes the result of the loading operation via signals. + * + * Note that `resource` is intended for _read_ operations, not operations which perform mutations. + * `resource` will cancel in-progress loads via the `AbortSignal` when destroyed or when a new + * request object becomes available, which could prematurely abort mutations. + * + * @experimental + */ +export function resource( + options: ResourceOptions & {defaultValue: NoInfer}, +): ResourceRef; /** * Constructs a `Resource` that projects a reactive request to an asynchronous operation defined by @@ -36,178 +55,248 @@ import {DestroyRef} from '../linker'; * * @experimental */ -export function resource(options: ResourceOptions): ResourceRef { +export function resource(options: ResourceOptions): ResourceRef; +export function resource(options: ResourceOptions): ResourceRef { options?.injector || assertInInjectionContext(resource); const request = (options.request ?? (() => null)) as () => R; - return new WritableResourceImpl(request, options.loader, options.equal, options.injector); + return new ResourceImpl( + request, + getLoader(options), + options.defaultValue, + options.equal ? wrapEqualityFn(options.equal) : undefined, + options.injector ?? inject(Injector), + ); } +type ResourceInternalStatus = + | ResourceStatus.Idle + | ResourceStatus.Loading + | ResourceStatus.Resolved + | ResourceStatus.Local; + /** - * Base class for `WritableResource` which handles the state operations and is unopinionated on the - * actual async operation. - * - * Mainly factored out for better readability. + * Internal state of a resource. */ -abstract class BaseWritableResource implements WritableResource { - readonly value: WritableSignal; - readonly status = signal(ResourceStatus.Idle); - readonly error = signal(undefined); +interface ResourceProtoState { + extRequest: WrappedRequest; - protected readonly rawSetValue: (value: T | undefined) => void; + // For simplicity, status is internally tracked as a subset of the public status enum. + // Reloading and Error statuses are projected from Loading and Resolved based on other state. + status: ResourceInternalStatus; +} - constructor(equal: ValueEqualityFn | undefined) { - this.value = signal(undefined, { - equal: equal ? wrapEqualityFn(equal) : undefined, - }); - this.rawSetValue = this.value.set; - this.value.set = (value: T | undefined) => this.set(value); - this.value.update = (fn: (value: T | undefined) => T | undefined) => - this.set(fn(untracked(this.value))); - } +interface ResourceState extends ResourceProtoState { + previousStatus: ResourceStatus; + stream: Signal> | undefined; +} - set(value: T | undefined): void { - // Set the value signal and check whether its `version` changes. This will tell us - // if the value signal actually updated or not. - const prevVersion = (this.value[SIGNAL] as SignalNode).version; - this.rawSetValue(value); - if ((this.value[SIGNAL] as SignalNode).version === prevVersion) { - // The value must've been equal to the previous, so no need to change states. - return; - } +type WrappedRequest = {request: unknown; reload: number}; - // We're departing from whatever state the resource was in previously, and entering - // Local state. - this.onLocalValue(); - this.status.set(ResourceStatus.Local); - this.error.set(undefined); +/** + * Base class which implements `.value` as a `WritableSignal` by delegating `.set` and `.update`. + */ +abstract class BaseWritableResource implements WritableResource { + readonly value: WritableSignal; + abstract readonly status: Signal; + abstract readonly error: Signal; + abstract reload(): boolean; + + constructor(value: Signal) { + this.value = value as WritableSignal; + this.value.set = this.set.bind(this); + this.value.update = this.update.bind(this); + this.value.asReadonly = signalAsReadonlyFn; } - update(updater: (value: T | undefined) => T | undefined): void { - this.value.update(updater); + abstract set(value: T): void; + + update(updateFn: (value: T) => T): void { + this.set(updateFn(untracked(this.value))); } readonly isLoading = computed( () => this.status() === ResourceStatus.Loading || this.status() === ResourceStatus.Reloading, ); - hasValue(): this is WritableResource & {value: WritableSignal} { - return ( - this.status() === ResourceStatus.Resolved || - this.status() === ResourceStatus.Local || - this.status() === ResourceStatus.Reloading - ); + hasValue(): this is ResourceRef> { + return this.value() !== undefined; } asReadonly(): Resource { return this; } +} - /** - * Put the resource in a state with a given value. - */ - protected setValueState(status: ResourceStatus, value: T | undefined = undefined): void { - this.status.set(status); - this.rawSetValue(value); - this.error.set(undefined); - } +/** + * Implementation for `resource()` which uses a `linkedSignal` to manage the resource's state. + */ +export class ResourceImpl extends BaseWritableResource implements ResourceRef { + private readonly pendingTasks: PendingTasks; /** - * Put the resource into the error state. + * The current state of the resource. Status, value, and error are derived from this. */ - protected setErrorState(err: unknown): void { - this.value.set(undefined); - // The previous line will set the status to `Local`, so we need to update it. - this.status.set(ResourceStatus.Error); - this.error.set(err); - } + private readonly state: WritableSignal>; /** - * Called when the resource is transitioning to local state. - * - * For example, this can be used to cancel any in-progress loading operations. + * Combines the current request with a reload counter which allows the resource to be reloaded on + * imperative command. */ - protected abstract onLocalValue(): void; - - public abstract reload(): boolean; -} - -class WritableResourceImpl extends BaseWritableResource implements ResourceRef { - private readonly request: Signal<{request: R; reload: WritableSignal}>; - private readonly pendingTasks: PendingTasks; + protected readonly extRequest: WritableSignal; private readonly effectRef: EffectRef; private pendingController: AbortController | undefined; private resolvePendingTask: (() => void) | undefined = undefined; + private destroyed = false; constructor( - requestFn: () => R, - private readonly loaderFn: ResourceLoader, - equal: ValueEqualityFn | undefined, - injector: Injector | undefined, + request: () => R, + private readonly loaderFn: ResourceStreamingLoader, + private readonly defaultValue: T, + private readonly equal: ValueEqualityFn | undefined, + injector: Injector, ) { - super(equal); - injector = injector ?? inject(Injector); - this.pendingTasks = injector.get(PendingTasks); + super( + // Feed a computed signal for the value to `BaseWritableResource`, which will upgrade it to a + // `WritableSignal` that delegates to `ResourceImpl.set`. + computed( + () => { + const streamValue = this.state().stream?.(); + return streamValue && isResolved(streamValue) ? streamValue.value : this.defaultValue; + }, + {equal}, + ), + ); + + // Extend `request()` to include a writable reload signal. + this.extRequest = linkedSignal({ + source: request, + computation: (request) => ({request, reload: 0}), + }); - this.request = computed(() => ({ - // The current request as defined for this resource. - request: requestFn(), + // The main resource state is managed in a `linkedSignal`, which allows the resource to change + // state instantaneously when the request signal changes. + this.state = linkedSignal>({ + // Whenever the request changes, + source: this.extRequest, + // Compute the state of the resource given a change in status. + computation: (extRequest, previous) => { + const status = + extRequest.request === undefined ? ResourceStatus.Idle : ResourceStatus.Loading; + if (!previous) { + return { + extRequest, + status, + previousStatus: ResourceStatus.Idle, + stream: undefined, + }; + } else { + return { + extRequest, + status, + previousStatus: projectStatusOfState(previous.value), + // If the request hasn't changed, keep the previous stream. + stream: + previous.value.extRequest.request === extRequest.request + ? previous.value.stream + : undefined, + }; + } + }, + }); - // A counter signal which increments from 0, re-initialized for each request (similar to the - // `linkedSignal` pattern). A value other than 0 indicates a refresh operation. - reload: signal(0), - })); + this.effectRef = effect(this.loadEffect.bind(this), { + injector, + manualCleanup: true, + }); - // The actual data-fetching effect. - this.effectRef = effect(this.loadEffect.bind(this), {injector, manualCleanup: true}); + this.pendingTasks = injector.get(PendingTasks); // Cancel any pending request when the resource itself is destroyed. injector.get(DestroyRef).onDestroy(() => this.destroy()); } - override reload(): boolean { - // We don't want to restart in-progress loads. - const status = untracked(this.status); + override readonly status = computed(() => projectStatusOfState(this.state())); + + override readonly error = computed(() => { + const stream = this.state().stream?.(); + return stream && !isResolved(stream) ? stream.error : undefined; + }); + + /** + * Called either directly via `WritableResource.set` or via `.value.set()`. + */ + override set(value: T): void { + if (this.destroyed) { + return; + } + + const current = untracked(this.value); + const state = untracked(this.state); + if ( - status === ResourceStatus.Idle || - status === ResourceStatus.Loading || - status === ResourceStatus.Reloading + state.status === ResourceStatus.Local && + (this.equal ? this.equal(current, value) : current === value) ) { + return; + } + + // Enter Local state with the user-defined value. + this.state.set({ + extRequest: state.extRequest, + status: ResourceStatus.Local, + previousStatus: ResourceStatus.Local, + stream: signal({value}), + }); + + // We're departing from whatever state the resource was in previously, so cancel any in-progress + // loading operations. + this.abortInProgressLoad(); + } + + override reload(): boolean { + // We don't want to restart in-progress loads. + const {status} = untracked(this.state); + if (status === ResourceStatus.Idle || status === ResourceStatus.Loading) { return false; } - untracked(this.request).reload.update((v) => v + 1); + // Increment the request reload to trigger the `state` linked signal to switch us to `Reload` + this.extRequest.update(({request, reload}) => ({request, reload: reload + 1})); return true; } destroy(): void { + this.destroyed = true; this.effectRef.destroy(); - this.abortInProgressLoad(); - this.setValueState(ResourceStatus.Idle); + + // Destroyed resources enter Idle state. + this.state.set({ + extRequest: {request: undefined, reload: 0}, + status: ResourceStatus.Idle, + previousStatus: ResourceStatus.Idle, + stream: undefined, + }); } private async loadEffect(): Promise { - // Capture the status before any state transitions. - const previousStatus = untracked(this.status); + const extRequest = this.extRequest(); - // Cancel any previous loading attempts. - this.abortInProgressLoad(); + // Capture the previous status before any state transitions. Note that this is `untracked` since + // we do not want the effect to depend on the state of the resource, only on the request. + const {status: currentStatus, previousStatus} = untracked(this.state); - const request = this.request(); - if (request.request === undefined) { - // An undefined request means there's nothing to load. - this.setValueState(ResourceStatus.Idle); + if (extRequest.request === undefined) { + // Nothing to load (and we should already be in a non-loading state). + return; + } else if (currentStatus !== ResourceStatus.Loading) { + // We're not in a loading or reloading state, so this loading request is stale. return; } - // Subscribing here allows us to refresh the load later by updating the refresh signal. At the - // same time, we update the status according to whether we're reloading or loading. - if (request.reload() === 0) { - this.setValueState(ResourceStatus.Loading); // value becomes undefined - } else { - this.status.set(ResourceStatus.Reloading); // value persists - } + // Cancel any previous loading attempts. + this.abortInProgressLoad(); // Capturing _this_ load's pending task in a local variable is important here. We may attempt to // resolve it twice: @@ -218,53 +307,63 @@ class WritableResourceImpl extends BaseWritableResource implements Reso // After the loading operation is cancelled, `this.resolvePendingTask` no longer represents this // particular task, but this `await` may eventually resolve/reject. Thus, when we cancel in // response to (1) below, we need to cancel the locally saved task. - const resolvePendingTask = (this.resolvePendingTask = this.pendingTasks.add()); + let resolvePendingTask: (() => void) | undefined = (this.resolvePendingTask = + this.pendingTasks.add()); const {signal: abortSignal} = (this.pendingController = new AbortController()); + try { // The actual loading is run through `untracked` - only the request side of `resource` is // reactive. This avoids any confusion with signals tracking or not tracking depending on // which side of the `await` they are. - const result = await untracked(() => - this.loaderFn({ + const stream = await untracked(() => { + return this.loaderFn({ + request: extRequest.request as Exclude, abortSignal, - request: request.request as Exclude, previous: { status: previousStatus, }, - }), - ); - if (abortSignal.aborted) { - // This load operation was cancelled. + }); + }); + + // If this request has been aborted, or the current request no longer + // matches this load, then we should ignore this resolution. + if (abortSignal.aborted || untracked(this.extRequest) !== extRequest) { return; } - // Success :) - this.setValueState(ResourceStatus.Resolved, result); + + this.state.set({ + extRequest, + status: ResourceStatus.Resolved, + previousStatus: ResourceStatus.Resolved, + stream, + }); } catch (err) { - if (abortSignal.aborted) { - // This load operation was cancelled. + if (abortSignal.aborted || untracked(this.extRequest) !== extRequest) { return; } - // Fail :( - this.setErrorState(err); + + this.state.set({ + extRequest, + status: ResourceStatus.Resolved, + previousStatus: ResourceStatus.Error, + stream: signal({error: err}), + }); } finally { - // Resolve the pending task now that loading is done. - resolvePendingTask(); + // Resolve the pending task now that the resource has a value. + resolvePendingTask?.(); + resolvePendingTask = undefined; } } private abortInProgressLoad(): void { - this.pendingController?.abort(); + untracked(() => this.pendingController?.abort()); this.pendingController = undefined; // Once the load is aborted, we no longer want to block stability on its resolution. this.resolvePendingTask?.(); this.resolvePendingTask = undefined; } - - protected override onLocalValue(): void { - this.abortInProgressLoad(); - } } /** @@ -273,3 +372,41 @@ class WritableResourceImpl extends BaseWritableResource implements Reso function wrapEqualityFn(equal: ValueEqualityFn): ValueEqualityFn { return (a, b) => (a === undefined || b === undefined ? a === b : equal(a, b)); } + +function getLoader(options: ResourceOptions): ResourceStreamingLoader { + if (isStreamingResourceOptions(options)) { + return options.stream; + } + + return async (params) => { + try { + return signal({value: await options.loader(params)}); + } catch (err) { + return signal({error: err}); + } + }; +} + +function isStreamingResourceOptions( + options: ResourceOptions, +): options is StreamingResourceOptions { + return !!(options as StreamingResourceOptions).stream; +} + +/** + * Project from a state with `ResourceInternalStatus` to the user-facing `ResourceStatus` + */ +function projectStatusOfState(state: ResourceState): ResourceStatus { + switch (state.status) { + case ResourceStatus.Loading: + return state.extRequest.reload === 0 ? ResourceStatus.Loading : ResourceStatus.Reloading; + case ResourceStatus.Resolved: + return isResolved(untracked(state.stream!)) ? ResourceStatus.Resolved : ResourceStatus.Error; + default: + return state.status; + } +} + +function isResolved(state: ResourceStreamItem): state is {value: T} { + return (state as {error: unknown}).error === undefined; +} diff --git a/packages/core/src/sanitization/iframe_attrs_validation.ts b/packages/core/src/sanitization/iframe_attrs_validation.ts index e74a099c0c4d..ea1f65698b42 100644 --- a/packages/core/src/sanitization/iframe_attrs_validation.ts +++ b/packages/core/src/sanitization/iframe_attrs_validation.ts @@ -11,7 +11,7 @@ import {getTemplateLocationDetails} from '../render3/instructions/element_valida import {TNodeType} from '../render3/interfaces/node'; import {RComment, RElement} from '../render3/interfaces/renderer_dom'; import {RENDERER} from '../render3/interfaces/view'; -import {nativeRemoveNode} from '../render3/node_manipulation'; +import {nativeRemoveNode} from '../render3/dom_node_manipulation'; import {getLView, getSelectedTNode} from '../render3/state'; import {getNativeByTNode} from '../render3/util/view_utils'; import {trustedHTMLFromString} from '../util/security/trusted_types'; diff --git a/packages/core/src/util/stringify.ts b/packages/core/src/util/stringify.ts index 6545d9ee5667..64cca9475a0f 100644 --- a/packages/core/src/util/stringify.ts +++ b/packages/core/src/util/stringify.ts @@ -12,29 +12,26 @@ export function stringify(token: any): string { } if (Array.isArray(token)) { - return '[' + token.map(stringify).join(', ') + ']'; + return `[${token.map(stringify).join(', ')}]`; } if (token == null) { return '' + token; } - if (token.overriddenName) { - return `${token.overriddenName}`; + const name = token.overriddenName || token.name; + if (name) { + return `${name}`; } - if (token.name) { - return `${token.name}`; - } - - const res = token.toString(); + const result = token.toString(); - if (res == null) { - return '' + res; + if (result == null) { + return '' + result; } - const newLineIndex = res.indexOf('\n'); - return newLineIndex === -1 ? res : res.substring(0, newLineIndex); + const newLineIndex = result.indexOf('\n'); + return newLineIndex >= 0 ? result.slice(0, newLineIndex) : result; } /** @@ -46,13 +43,9 @@ export function stringify(token: any): string { * @returns concatenated string. */ export function concatStringsWithSpace(before: string | null, after: string | null): string { - return before == null || before === '' - ? after === null - ? '' - : after - : after == null || after === '' - ? before - : before + ' ' + after; + if (!before) return after || ''; + if (!after) return before; + return `${before} ${after}`; } /** diff --git a/packages/core/test/acceptance/hmr_spec.ts b/packages/core/test/acceptance/hmr_spec.ts index 1f96662b85f9..ce88026f1a5e 100644 --- a/packages/core/test/acceptance/hmr_spec.ts +++ b/packages/core/test/acceptance/hmr_spec.ts @@ -15,6 +15,7 @@ import { inject, InjectionToken, Input, + NgZone, OnChanges, OnDestroy, OnInit, @@ -24,14 +25,19 @@ import { Type, ViewChild, ViewChildren, + ViewContainerRef, + ViewEncapsulation, ɵNG_COMP_DEF, ɵɵreplaceMetadata, + ɵɵsetComponentScope, } from '@angular/core'; import {TestBed} from '@angular/core/testing'; import {compileComponent} from '@angular/core/src/render3/jit/directive'; import {angularCoreEnv} from '@angular/core/src/render3/jit/environment'; import {clearTranslations, loadTranslations} from '@angular/localize'; import {computeMsgId} from '@angular/compiler'; +import {EVENT_MANAGER_PLUGINS} from '@angular/platform-browser'; +import {ComponentType} from '@angular/core/src/render3'; describe('hot module replacement', () => { it('should recreate a single usage of a basic component', () => { @@ -245,6 +251,65 @@ describe('hot module replacement', () => { ); }); + it('should replace a component using shadow DOM encapsulation', () => { + // Domino doesn't support shadow DOM. + if (isNode) { + return; + } + + let instance!: ChildCmp; + const initialMetadata: Component = { + encapsulation: ViewEncapsulation.ShadowDom, + selector: 'child-cmp', + template: 'Hello {{state}}', + styles: `strong {color: red;}`, + }; + + @Component(initialMetadata) + class ChildCmp { + state = 0; + + constructor() { + instance = this; + } + } + + @Component({ + standalone: true, + imports: [ChildCmp], + template: '', + }) + class RootCmp {} + + const fixture = TestBed.createComponent(RootCmp); + fixture.detectChanges(); + const getShadowRoot = () => fixture.nativeElement.querySelector('child-cmp').shadowRoot; + + markNodesAsCreatedInitially(getShadowRoot()); + expectHTML(getShadowRoot(), `Hello 0`); + + instance.state = 1; + fixture.detectChanges(); + expectHTML(getShadowRoot(), `Hello 1`); + + replaceMetadata(ChildCmp, { + ...initialMetadata, + template: `Changed {{state}}!`, + styles: `strong {background: pink;}`, + }); + fixture.detectChanges(); + + verifyNodesWereRecreated([ + fixture.nativeElement.querySelector('child-cmp'), + ...childrenOf(getShadowRoot()), + ]); + + expectHTML( + getShadowRoot(), + `Changed 1!`, + ); + }); + it('should continue binding inputs to a component that is replaced', () => { const initialMetadata: Component = { selector: 'child-cmp', @@ -414,6 +479,88 @@ describe('hot module replacement', () => { verifyNodesWereRecreated(recreatedNodes); }); + it('should be able to replace a component that injects ViewContainerRef', () => { + const initialMetadata: Component = { + selector: 'child-cmp', + standalone: true, + template: 'Hello world', + }; + + @Component(initialMetadata) + class ChildCmp { + vcr = inject(ViewContainerRef); + } + + @Component({ + standalone: true, + imports: [ChildCmp], + template: '', + }) + class RootCmp {} + + const fixture = TestBed.createComponent(RootCmp); + fixture.detectChanges(); + markNodesAsCreatedInitially(fixture.nativeElement); + + expectHTML( + fixture.nativeElement, + ` + + Hello world + + `, + ); + + replaceMetadata(ChildCmp, { + ...initialMetadata, + template: `Hello Bob!`, + }); + fixture.detectChanges(); + + const recreatedNodes = childrenOf(...fixture.nativeElement.querySelectorAll('child-cmp')); + verifyNodesRemainUntouched(fixture.nativeElement, recreatedNodes); + verifyNodesWereRecreated(recreatedNodes); + + expectHTML( + fixture.nativeElement, + ` + + Hello Bob! + + `, + ); + }); + + it('should carry over dependencies defined by setComponentScope', () => { + // In some cases the AoT compiler produces a `setComponentScope` for non-standalone + // components. We simulate it here by declaring two components that are not standalone + // and manually calling `setComponentScope`. + @Component({selector: 'child-cmp', template: 'hello', standalone: false}) + class ChildCmp {} + + @Component({template: 'Initial ', standalone: false}) + class RootCmp {} + + ɵɵsetComponentScope(RootCmp as ComponentType, [ChildCmp], []); + + const fixture = TestBed.createComponent(RootCmp); + fixture.detectChanges(); + markNodesAsCreatedInitially(fixture.nativeElement); + expectHTML(fixture.nativeElement, 'Initial hello'); + + replaceMetadata(RootCmp, { + standalone: false, + template: 'Changed ', + }); + fixture.detectChanges(); + + const recreatedNodes = childrenOf(fixture.nativeElement); + verifyNodesRemainUntouched(fixture.nativeElement, recreatedNodes); + verifyNodesWereRecreated(recreatedNodes); + + expectHTML(fixture.nativeElement, 'Changed hello'); + }); + describe('queries', () => { it('should update ViewChildren query results', async () => { @Component({ @@ -1213,6 +1360,47 @@ describe('hot module replacement', () => { fixture.detectChanges(); expect(count).toBe(2); }); + + it('should bind events inside the NgZone after a replacement', () => { + const calls: {name: string; inZone: boolean}[] = []; + + @Component({template: ``}) + class App { + clicked() {} + } + + TestBed.configureTestingModule({ + providers: [ + { + // Note: TestBed brings things into the zone even if they aren't which makes this + // test hard to write. We have to intercept the listener being bound at the renderer + // level in order to get a true sense if it'll be bound inside or outside the zone. + // We do so with a custom event manager. + provide: EVENT_MANAGER_PLUGINS, + multi: true, + useValue: { + supports: () => true, + addEventListener: (_: unknown, name: string) => { + calls.push({name, inZone: NgZone.isInAngularZone()}); + return () => {}; + }, + }, + }, + ], + }); + + const fixture = TestBed.createComponent(App); + fixture.detectChanges(); + expect(calls).toEqual([{name: 'click', inZone: true}]); + + replaceMetadata(App, {template: ''}); + fixture.detectChanges(); + + expect(calls).toEqual([ + {name: 'click', inZone: true}, + {name: 'click', inZone: true}, + ]); + }); }); describe('directives', () => { @@ -1969,13 +2157,15 @@ describe('hot module replacement', () => { }, [angularCoreEnv], [], + null, + '', ); } function expectHTML(element: HTMLElement, expectation: string) { const actual = element.innerHTML .replace(//g, '') - .replace(/\sng-reflect-\S*="[^"]*"/g, ''); + .replace(/\s(ng-reflect|_nghost|_ngcontent)-\S*="[^"]*"/g, ''); expect(actual.replace(/\s/g, '') === expectation.replace(/\s/g, '')) .withContext(`HTML does not match expectation. Actual HTML:\n${actual}`) .toBe(true); diff --git a/packages/core/test/acceptance/integration_spec.ts b/packages/core/test/acceptance/integration_spec.ts index ff6681da851f..62c598f99937 100644 --- a/packages/core/test/acceptance/integration_spec.ts +++ b/packages/core/test/acceptance/integration_spec.ts @@ -38,6 +38,7 @@ import {getLView} from '@angular/core/src/render3/state'; import {ngDevModeResetPerfCounters} from '@angular/core/src/util/ng_dev_mode'; import {fakeAsync, flushMicrotasks, TestBed} from '@angular/core/testing'; import {By} from '@angular/platform-browser'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {expectPerfCounters} from '@angular/private/testing'; describe('acceptance integration tests', () => { @@ -2715,6 +2716,26 @@ describe('acceptance integration tests', () => { expect(() => TestBed.createComponent(Comp).detectChanges()).not.toThrow(); }); + it('should support template literals in expressions', () => { + @Component({ + standalone: true, + template: 'Message: {{`Hello, ${name} - ${value}`}}', + }) + class TestComponent { + name = 'Frodo'; + value = 0; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toContain('Message: Hello, Frodo - 0'); + + fixture.componentInstance.value++; + fixture.componentInstance.name = 'Bilbo'; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toContain('Message: Hello, Bilbo - 1'); + }); + describe('tView.firstUpdatePass', () => { function isFirstUpdatePass() { const lView = getLView(); @@ -2869,6 +2890,7 @@ describe('acceptance integration tests', () => { TestBed.configureTestingModule({ declarations: [Cmp, AnimationComp], + imports: [NoopAnimationsModule], providers: [{provide: AnimationDriver, useClass: MockAnimationDriver}], }); const fixture = TestBed.createComponent(Cmp); @@ -2959,6 +2981,7 @@ describe('acceptance integration tests', () => { TestBed.configureTestingModule({ declarations: [Cmp, InnerComp], + imports: [NoopAnimationsModule], providers: [{provide: AnimationDriver, useClass: MockAnimationDriver}], }); const fixture = TestBed.createComponent(Cmp); diff --git a/packages/core/test/acceptance/profiler_spec.ts b/packages/core/test/acceptance/profiler_spec.ts index 1d77e9568a3f..52bdc41fbbf1 100644 --- a/packages/core/test/acceptance/profiler_spec.ts +++ b/packages/core/test/acceptance/profiler_spec.ts @@ -13,6 +13,7 @@ import {TestBed} from '@angular/core/testing'; import { AfterContentChecked, AfterContentInit, + afterRender, AfterViewChecked, AfterViewInit, Component, @@ -28,14 +29,14 @@ import { } from '../../src/core'; describe('profiler', () => { - class Profiler { + class TestProfiler { profile() {} } let profilerSpy: jasmine.Spy; beforeEach(() => { - const profiler = new Profiler(); + const profiler = new TestProfiler(); profilerSpy = spyOn(profiler, 'profile').and.callThrough(); setProfiler(profiler.profile); }); @@ -400,27 +401,146 @@ describe('profiler', () => { expect(serviceNgOnDestroyStart).toBeTruthy(); expect(serviceNgOnDestroyEnd).toBeTruthy(); }); + + it('should call the profiler on lifecycle execution even after error', () => { + @Component({selector: 'my-comp', template: '', standalone: false}) + class MyComponent implements OnInit { + ngOnInit() { + throw new Error(); + } + } + + TestBed.configureTestingModule({declarations: [MyComponent]}); + const fixture = TestBed.createComponent(MyComponent); + + expect(() => { + fixture.detectChanges(); + }).toThrow(); + + const lifecycleStart = findProfilerCall(ProfilerEvent.LifecycleHookStart); + const lifecycleEnd = findProfilerCall(ProfilerEvent.LifecycleHookEnd); + + expect(lifecycleStart).toBeTruthy(); + expect(lifecycleEnd).toBeTruthy(); + }); }); - it('should call the profiler on lifecycle execution even after error', () => { - @Component({selector: 'my-comp', template: '', standalone: false}) - class MyComponent implements OnInit { - ngOnInit() { - throw new Error(); + describe('entry point events', () => { + class EventRecordingProfiler { + events: ProfilerEvent[] = []; + + clearEvents() { + this.events.length = 0; } + + hasEvents(...events: ProfilerEvent[]): boolean { + for (const e of events) { + if (this.events.indexOf(e) === -1) { + return false; + } + } + + return true; + } + + profile = ( + event: ProfilerEvent, + instance?: {} | null, + hookOrListener?: (e?: any) => any, + ): void => { + this.events.push(event); + }; } - TestBed.configureTestingModule({declarations: [MyComponent]}); - const fixture = TestBed.createComponent(MyComponent); + let p: EventRecordingProfiler; - expect(() => { + beforeEach(() => { + p = new EventRecordingProfiler(); + setProfiler(p.profile); + }); + + afterEach(() => { + setProfiler(null); + }); + + it('should capture component creation and change detection entry points', () => { + @Component({selector: 'my-comp', template: ''}) + class MyComponent {} + + const fixture = TestBed.createComponent(MyComponent); + expect(p.events).toEqual([ + ProfilerEvent.DynamicComponentStart, + ProfilerEvent.ComponentStart, + ProfilerEvent.TemplateCreateStart, + ProfilerEvent.TemplateCreateEnd, + ProfilerEvent.ComponentEnd, + ProfilerEvent.DynamicComponentEnd, + ProfilerEvent.ChangeDetectionStart, + ProfilerEvent.ChangeDetectionSyncStart, + ProfilerEvent.ChangeDetectionSyncEnd, + ProfilerEvent.ChangeDetectionEnd, + ]); + + p.clearEvents(); + fixture.detectChanges(false); + + expect( + p.hasEvents(ProfilerEvent.TemplateUpdateStart, ProfilerEvent.TemplateUpdateEnd), + ).toBeTrue(); + }); + + it('should invoke a profiler when host bindings are evaluated', () => { + @Component({ + selector: 'my-comp', + host: { + '[id]': '"someId"', + }, + template: '', + }) + class MyComponent {} + + const fixture = TestBed.createComponent(MyComponent); + fixture.detectChanges(); + + expect( + p.hasEvents(ProfilerEvent.HostBindingsUpdateStart, ProfilerEvent.HostBindingsUpdateEnd), + ).toBeTrue(); + }); + + it('should invoke a profiler when after render hooks are executing', () => { + @Component({ + selector: 'my-comp', + template: '', + }) + class MyComponent { + arRef = afterRender(() => {}); + } + + const fixture = TestBed.createComponent(MyComponent); fixture.detectChanges(); - }).toThrow(); - const lifecycleStart = findProfilerCall(ProfilerEvent.LifecycleHookStart); - const lifecycleEnd = findProfilerCall(ProfilerEvent.LifecycleHookEnd); + expect( + p.hasEvents(ProfilerEvent.AfterRenderHooksStart, ProfilerEvent.AfterRenderHooksEnd), + ).toBeTrue(); + }); - expect(lifecycleStart).toBeTruthy(); - expect(lifecycleEnd).toBeTruthy(); + it('should invoke a profiler when defer block transitions between states', () => { + @Component({ + selector: 'my-comp', + template: ` + @defer (on immediate) { + nothing to see here... + } + `, + }) + class MyComponent {} + + const fixture = TestBed.createComponent(MyComponent); + fixture.detectChanges(); + + expect( + p.hasEvents(ProfilerEvent.DeferBlockStateStart, ProfilerEvent.DeferBlockStateEnd), + ).toBeTrue(); + }); }); }); diff --git a/packages/core/test/acceptance/property_binding_spec.ts b/packages/core/test/acceptance/property_binding_spec.ts index f3adc3b1ff9f..c86532582a45 100644 --- a/packages/core/test/acceptance/property_binding_spec.ts +++ b/packages/core/test/acceptance/property_binding_spec.ts @@ -10,6 +10,7 @@ import {CommonModule} from '@angular/common'; import {Component, Directive, EventEmitter, Input, Output, ViewContainerRef} from '@angular/core'; import {TestBed} from '@angular/core/testing'; import {By, DomSanitizer, SafeUrl} from '@angular/platform-browser'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; describe('property bindings', () => { it('should support bindings to properties', () => { @@ -689,7 +690,10 @@ describe('property bindings', () => { }) class App {} - TestBed.configureTestingModule({declarations: [App, MyDir, MyComp]}); + TestBed.configureTestingModule({ + declarations: [App, MyDir, MyComp], + imports: [NoopAnimationsModule], + }); expect(() => { const fixture = TestBed.createComponent(App); diff --git a/packages/core/test/acceptance/renderer_factory_spec.ts b/packages/core/test/acceptance/renderer_factory_spec.ts index 9aa64e365ccb..b907a6a63747 100644 --- a/packages/core/test/acceptance/renderer_factory_spec.ts +++ b/packages/core/test/acceptance/renderer_factory_spec.ts @@ -574,7 +574,7 @@ class MockRenderer implements Renderer2 { } selectRootElement(selectorOrNode: string | any): RElement { return typeof selectorOrNode === 'string' - ? document.querySelector(selectorOrNode) + ? document.querySelector(selectorOrNode)! : selectorOrNode; } parentNode(node: Node): Element | null { diff --git a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json index 52b62a1375f0..26cfac1e0729 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -90,10 +90,8 @@ "Injector", "InputFlags", "KeyEventsPlugin", - "LContainerFlags", "LEAVE_TOKEN_REGEX", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -202,8 +200,6 @@ "activeConsumer", "addAfterRenderSequencesForView", "addClass", - "addPropertyBinding", - "addToEndOfViewTree", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -230,7 +226,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "classIndexOf", "cleanUpView", @@ -251,6 +246,7 @@ "context", "convertToBitFlags", "copyAnimationEvent", + "createDirectivesInstances", "createElementNode", "createElementRef", "createErrorClass", @@ -278,6 +274,8 @@ "detectChangesInternal", "diPublicInInjector", "documentElement", + "elementEndFirstCreatePass", + "elementStartFirstCreatePass", "enterDI", "enterView", "eraseStyles", @@ -293,11 +291,10 @@ "extractStyleParams", "filterNonAnimatableStyles", "findAttrIndexInNode", + "findDirectiveDefMatches", "forEachSingleProvider", "forwardRef", "freeConsumers", - "generateInitialInputs", - "getBindingsEnabled", "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", @@ -321,10 +318,8 @@ "getNextLContainer", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", - "getOrCreateTNode", "getOrSetDefaultValue", "getOwnDefinition", "getParentElement", @@ -347,7 +342,6 @@ "importProvidersFrom", "includeViewProviders", "incrementInitPhaseFlags", - "initializeDirectives", "inject", "injectArgs", "injectDestroyRef", @@ -361,7 +355,6 @@ "internalProvideZoneChangeDetection", "interpolateParams", "invalidTimingValue", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "invokeQuery", "isAngularZoneProperty", @@ -372,6 +365,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isElementNode", "isEnvironmentProviders", "isFunction", @@ -425,7 +419,8 @@ "onEnter", "onLeave", "optimizeGroupPlayer", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "parseTimelineCommand", "performanceMarkFeature", "processInjectorTypesWithProviders", @@ -434,7 +429,6 @@ "producerUpdateValueVersion", "refreshContentQueries", "refreshView", - "registerPostOrderHooks", "rememberChangeHistoryAndInvokeOnChangesHook", "remove", "removeClass", @@ -447,6 +441,7 @@ "requiresRefreshOrTraversal", "resetPreOrderHookFlags", "resolveForwardRef", + "resolveHostDirectivesForDef", "resolveTiming", "resolveTimingValue", "roundOffset", @@ -457,6 +452,7 @@ "scheduleCallbackWithRafRace", "searchTokensOnInjector", "setActiveConsumer", + "setAllInputsForProperty", "setBindingRootForHostBindings", "setCurrentDirectiveIndex", "setCurrentInjector", @@ -465,12 +461,14 @@ "setDirectiveInputsWhichShadowsStyling", "setIncludeViewProviders", "setInjectImplementation", - "setInputsForProperty", "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", + "setShadowStylingInputFlags", "setStyles", - "setUpAttributes", + "setupHostDirectiveInputsOrOutputs", + "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shimStylesContent", "shouldSearchParent", @@ -480,7 +478,6 @@ "style", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "transition", "uniqueIdCounter", "unregisterLView", @@ -491,7 +488,6 @@ "viewShouldHaveReactiveConsumer", "visitDslNode", "walkProviderTree", - "writeDirectClass", "writeToDirectiveInput", "ɵɵdefineComponent", "ɵɵdefineInjectable", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 925b4041641f..3cbef4bdedac 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -28,7 +28,6 @@ "ApplicationRef", "BROWSER_ANIMATIONS_PROVIDERS", "BROWSER_MODULE_PROVIDERS", - "BROWSER_MODULE_PROVIDERS_MARKER", "BROWSER_NOOP_ANIMATIONS_PROVIDERS", "BaseAnimationRenderer", "BehaviorSubject", @@ -97,10 +96,8 @@ "Injector", "InputFlags", "KeyEventsPlugin", - "LContainerFlags", "LEAVE_TOKEN_REGEX", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -222,8 +219,6 @@ "activeConsumer", "addAfterRenderSequencesForView", "addClass", - "addPropertyBinding", - "addToEndOfViewTree", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -250,7 +245,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "classIndexOf", "cleanUpView", @@ -271,6 +265,7 @@ "context", "convertToBitFlags", "copyAnimationEvent", + "createDirectivesInstances", "createElementNode", "createElementRef", "createErrorClass", @@ -300,6 +295,8 @@ "detectChangesInternal", "diPublicInInjector", "documentElement", + "elementEndFirstCreatePass", + "elementStartFirstCreatePass", "enterDI", "enterView", "eraseStyles", @@ -315,11 +312,10 @@ "extractStyleParams", "filterNonAnimatableStyles", "findAttrIndexInNode", + "findDirectiveDefMatches", "forEachSingleProvider", "forwardRef", "freeConsumers", - "generateInitialInputs", - "getBindingsEnabled", "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", @@ -344,10 +340,8 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", - "getOrCreateTNode", "getOrSetDefaultValue", "getOwnDefinition", "getParentElement", @@ -371,7 +365,6 @@ "importProvidersFrom", "includeViewProviders", "incrementInitPhaseFlags", - "initializeDirectives", "inject", "injectArgs", "injectDestroyRef", @@ -385,7 +378,6 @@ "internalProvideZoneChangeDetection", "interpolateParams", "invalidTimingValue", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "invokeQuery", "isAngularZoneProperty", @@ -396,6 +388,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isElementNode", "isEnvironmentProviders", "isFunction", @@ -451,7 +444,8 @@ "onLeave", "optimizeGroupPlayer", "optionsReducer", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "parseTimelineCommand", "platformBrowser", "platformCore", @@ -461,7 +455,6 @@ "producerUpdateValueVersion", "refreshContentQueries", "refreshView", - "registerPostOrderHooks", "rememberChangeHistoryAndInvokeOnChangesHook", "remove", "removeClass", @@ -474,6 +467,7 @@ "requiresRefreshOrTraversal", "resetPreOrderHookFlags", "resolveForwardRef", + "resolveHostDirectivesForDef", "resolveTiming", "resolveTimingValue", "roundOffset", @@ -484,6 +478,7 @@ "scheduleCallbackWithRafRace", "searchTokensOnInjector", "setActiveConsumer", + "setAllInputsForProperty", "setBindingRootForHostBindings", "setCurrentDirectiveIndex", "setCurrentInjector", @@ -492,12 +487,14 @@ "setDirectiveInputsWhichShadowsStyling", "setIncludeViewProviders", "setInjectImplementation", - "setInputsForProperty", "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", + "setShadowStylingInputFlags", "setStyles", - "setUpAttributes", + "setupHostDirectiveInputsOrOutputs", + "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shimStylesContent", "shouldSearchParent", @@ -507,7 +504,6 @@ "style", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "transition", "uniqueIdCounter", "unregisterLView", @@ -518,7 +514,6 @@ "viewShouldHaveReactiveConsumer", "visitDslNode", "walkProviderTree", - "writeDirectClass", "writeToDirectiveInput", "ɵɵdefineComponent", "ɵɵdefineInjectable", diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 803d0f22803a..ca2ace50be3f 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -9,7 +9,6 @@ "ApplicationModule", "ApplicationRef", "BROWSER_MODULE_PROVIDERS", - "BROWSER_MODULE_PROVIDERS_MARKER", "BehaviorSubject", "BrowserDomAdapter", "BrowserModule", @@ -66,9 +65,7 @@ "Injector", "InputFlags", "KeyEventsPlugin", - "LContainerFlags", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "Module", @@ -168,8 +165,6 @@ "_wasLastNodeCreated", "activeConsumer", "addAfterRenderSequencesForView", - "addPropertyBinding", - "addToEndOfViewTree", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -190,7 +185,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "classIndexOf", "cleanUpView", @@ -206,6 +200,7 @@ "consumerPollProducersForChange", "context", "convertToBitFlags", + "createDirectivesInstances", "createElementNode", "createElementRef", "createErrorClass", @@ -231,6 +226,8 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementEndFirstCreatePass", + "elementStartFirstCreatePass", "enterDI", "enterView", "errorContext", @@ -243,11 +240,10 @@ "extractDefListOrFactory", "extractDirectiveDef", "findAttrIndexInNode", + "findDirectiveDefMatches", "forEachSingleProvider", "forwardRef", "freeConsumers", - "generateInitialInputs", - "getBindingsEnabled", "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", @@ -272,7 +268,6 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -296,7 +291,6 @@ "importProvidersFrom", "includeViewProviders", "incrementInitPhaseFlags", - "initializeDirectives", "inject", "injectArgs", "injectDestroyRef", @@ -308,7 +302,6 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", @@ -318,6 +311,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isEnvironmentProviders", "isFunction", "isInlineTemplate", @@ -365,7 +359,8 @@ "onEnter", "onLeave", "optionsReducer", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "platformBrowser", "platformCore", "processInjectorTypesWithProviders", @@ -374,7 +369,6 @@ "producerUpdateValueVersion", "refreshContentQueries", "refreshView", - "registerPostOrderHooks", "rememberChangeHistoryAndInvokeOnChangesHook", "remove", "removeElements", @@ -384,6 +378,7 @@ "requiresRefreshOrTraversal", "resetPreOrderHookFlags", "resolveForwardRef", + "resolveHostDirectivesForDef", "runEffectsInView", "runInInjectionContext", "saveNameToExportMap", @@ -391,6 +386,7 @@ "scheduleCallbackWithRafRace", "searchTokensOnInjector", "setActiveConsumer", + "setAllInputsForProperty", "setBindingRootForHostBindings", "setCurrentDirectiveIndex", "setCurrentInjector", @@ -399,11 +395,13 @@ "setDirectiveInputsWhichShadowsStyling", "setIncludeViewProviders", "setInjectImplementation", - "setInputsForProperty", "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", - "setUpAttributes", + "setShadowStylingInputFlags", + "setupHostDirectiveInputsOrOutputs", + "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shimStylesContent", "shouldSearchParent", @@ -412,7 +410,6 @@ "stringifyCSSSelector", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "uniqueIdCounter", "unregisterLView", "unwrapRNode", @@ -422,7 +419,6 @@ "viewShouldHaveReactiveConsumer", "walkProviderTree", "wasLastNodeCreated", - "writeDirectClass", "writeToDirectiveInput", "ɵɵdefineComponent", "ɵɵdefineInjectable", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index a73ac55a1284..6deb50f892b4 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -85,10 +85,8 @@ "Injector", "InputFlags", "KeyEventsPlugin", - "LContainerFlags", "LOADING_AFTER_SLOT", "LOCALE_ID2", - "LifecycleHooksFeature", "MATH_ML_NAMESPACE", "MAXIMUM_REFRESH_RERUNS", "MINIMUM_SLOT", @@ -207,7 +205,6 @@ "activeConsumer", "addAfterRenderSequencesForView", "addDepsToRegistry", - "addPropertyBinding", "addToEndOfViewTree", "allocExpando", "allocLFrame", @@ -231,7 +228,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "classIndexOf", "cleanUpView", @@ -278,6 +274,8 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementEndFirstCreatePass", + "elementStartFirstCreatePass", "enterDI", "enterView", "epoch", @@ -291,10 +289,10 @@ "extractDefListOrFactory", "extractDirectiveDef", "findAttrIndexInNode", + "findDirectiveDefMatches", "forEachSingleProvider", "forwardRef", "freeConsumers", - "generateInitialInputs", "getBeforeNodeForView", "getBindingsEnabled", "getCleanupFnKeyByType", @@ -326,7 +324,6 @@ "getNextLContainer", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateEnvironmentInjector", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", @@ -430,7 +427,9 @@ "init_config", "init_console", "init_constants", + "init_construction", "init_container", + "init_container2", "init_context", "init_context_discovery", "init_contextual", @@ -466,11 +465,13 @@ "init_di_setup", "init_directive", "init_directives", + "init_directives2", "init_discovery", "init_discovery_utils", "init_dispatcher", "init_document", "init_dom", + "init_dom_node_manipulation", "init_dom_triggers", "init_earlyeventcontract", "init_effect", @@ -478,6 +479,7 @@ "init_element_container", "init_element_ref", "init_element_validation", + "init_elements", "init_empty", "init_environment", "init_environment2", @@ -556,7 +558,6 @@ "init_input_flags", "init_input_signal", "init_input_signal_node", - "init_input_transforms_feature", "init_instructions", "init_interfaces", "init_interfaces2", @@ -573,6 +574,7 @@ "init_let_declaration", "init_lift", "init_linked_signal", + "init_linked_signal2", "init_linker", "init_list_reconciliation", "init_listener", @@ -653,6 +655,7 @@ "init_queries2", "init_queries_signals", "init_query", + "init_query_execution", "init_query_list", "init_query_reactive", "init_r3_injector", @@ -703,6 +706,7 @@ "init_text_interpolation", "init_timeoutProvider", "init_timer_scheduler", + "init_tnode_manipulation", "init_tokens", "init_tokens2", "init_tokens3", @@ -742,7 +746,6 @@ "init_zone", "init_zoneless_scheduling", "init_zoneless_scheduling_impl", - "initializeDirectives", "inject", "injectArgs", "injectDestroyRef", @@ -755,7 +758,6 @@ "internalImportProvidersFrom", "internalProvideZoneChangeDetection", "invokeAllTriggerCleanupFns", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "invokeTriggerCleanupFns", "isAngularZoneProperty", @@ -766,6 +768,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isDirectiveHost", "isEnvironmentProviders", "isFunction", @@ -813,7 +816,8 @@ "observable", "onEnter", "onLeave", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "performanceMarkFeature", "populateDehydratedViewsInLContainer", "processInjectorTypesWithProviders", @@ -837,6 +841,7 @@ "resetPreOrderHookFlags", "resolveDirectives", "resolveForwardRef", + "resolveHostDirectivesForDef", "retrieveHydrationInfo", "runEffectsInView", "runInInjectionContext", @@ -847,6 +852,7 @@ "searchTokensOnInjector", "selectIndexInternal", "setActiveConsumer", + "setAllInputsForProperty", "setBindingRootForHostBindings", "setCurrentDirectiveIndex", "setCurrentInjector", @@ -855,11 +861,13 @@ "setDirectiveInputsWhichShadowsStyling", "setIncludeViewProviders", "setInjectImplementation", - "setInputsForProperty", "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", - "setUpAttributes", + "setShadowStylingInputFlags", + "setupHostDirectiveInputsOrOutputs", + "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shimStylesContent", "shouldAttachRegularTrigger", @@ -869,7 +877,6 @@ "stringifyCSSSelector", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "trackMovedView", "triggerDeferBlock", "uniqueIdCounter", @@ -881,7 +888,6 @@ "viewShouldHaveReactiveConsumer", "walkProviderTree", "wasLastNodeCreated", - "writeDirectClass", "writeToDirectiveInput", "ɵɵdefer", "ɵɵdefineComponent", diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 70d4f900d269..2399ca06a236 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -13,7 +13,6 @@ "ApplicationModule", "ApplicationRef", "BROWSER_MODULE_PROVIDERS", - "BROWSER_MODULE_PROVIDERS_MARKER", "BaseControlValueAccessor", "BehaviorSubject", "BrowserDomAdapter", @@ -99,9 +98,7 @@ "IterableChangeRecord_", "IterableDiffers", "KeyEventsPlugin", - "LContainerFlags", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -225,7 +222,6 @@ "_bind", "_currentInjector", "_global", - "_hasInvalidParent", "_injectImplementation", "_isRefreshingViews", "_keyMap", @@ -238,7 +234,6 @@ "_wasLastNodeCreated", "activeConsumer", "addAfterRenderSequencesForView", - "addPropertyBinding", "addToArray", "addToEndOfViewTree", "addValidators", @@ -268,7 +263,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "classIndexOf", "cleanUpControl", @@ -332,6 +326,8 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementEndFirstCreatePass", + "elementStartFirstCreatePass", "enterDI", "enterView", "epoch", @@ -348,6 +344,7 @@ "extractDirectiveDef", "fillProperties", "findAttrIndexInNode", + "findDirectiveDefMatches", "findStylingValue", "forEachSingleProvider", "forkJoin", @@ -357,7 +354,6 @@ "forwardRef", "freeConsumers", "fromAsyncIterable", - "generateInitialInputs", "getBeforeNodeForView", "getBindingsEnabled", "getClosureSafeProperty", @@ -389,7 +385,6 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -417,9 +412,9 @@ "handleUnhandledError", "hasApplyArgsData", "hasInSkipHydrationBlockFlag", + "hasInvalidParent", "hasParentInjector", "hasTagAndTypeMatch", - "hasValidLength", "hasValidator", "icuContainerIterate", "identity", @@ -432,7 +427,6 @@ "inheritHostBindings", "inheritViewQuery", "initFeatures", - "initializeDirectives", "inject", "injectArgs", "injectDestroyRef", @@ -447,7 +441,6 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAbstractControlOptions", "isAngularZoneProperty", @@ -461,6 +454,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isDirectiveHost", "isEmptyInputValue", "isEnvironmentProviders", @@ -498,6 +492,8 @@ "leaveDI", "leaveView", "leaveViewLight", + "lengthOrSize", + "listenToOutput", "lookupTokenUsingModuleInjector", "lookupTokenUsingNodeInjector", "makeParamDecorator", @@ -524,7 +520,6 @@ "nativeAppendChild", "nativeAppendOrInsertBefore", "nativeInsertBefore", - "nativeParentNode", "nextNgElementId", "ngOnChangesSetInput", "ngZoneInstanceId", @@ -540,8 +535,8 @@ "onLeave", "operate", "optionsReducer", - "parseAndConvertBindingsForDefinition", - "performanceMarkFeature", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "pickAsyncValidators", "pickValidators", "platformBrowser", @@ -574,6 +569,7 @@ "resetPreOrderHookFlags", "resolveDirectives", "resolveForwardRef", + "resolveHostDirectivesForDef", "resolveProvider", "runEffectsInView", "runInInjectionContext", @@ -584,6 +580,7 @@ "searchTokensOnInjector", "selectIndexInternal", "setActiveConsumer", + "setAllInputsForProperty", "setBindingRootForHostBindings", "setCurrentDirectiveIndex", "setCurrentInjector", @@ -593,16 +590,18 @@ "setDisabledStateDefault", "setIncludeViewProviders", "setInjectImplementation", - "setInputsForProperty", "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", + "setShadowStylingInputFlags", "setTStylingRangeNext", "setTStylingRangeNextDuplicate", "setTStylingRangePrevDuplicate", - "setUpAttributes", "setUpControl", "setUpValidators", + "setupHostDirectiveInputsOrOutputs", + "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shimStylesContent", "shouldAddViewToDom", @@ -618,7 +617,6 @@ "throwProviderNotFoundError", "timeoutProvider", "toObservable", - "toRefArray", "toTStylingRange", "trackByIdentity", "trackMovedView", @@ -634,7 +632,6 @@ "walkProviderTree", "wasLastNodeCreated", "wrapListener", - "writeDirectClass", "writeToDirectiveInput", "{getPrototypeOf:getPrototypeOf,prototype:objectProto,keys:getKeys}", "{isArray:isArray2}", diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index 7e8222b9ab3f..ad2c8af42ec9 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -14,7 +14,6 @@ "ApplicationModule", "ApplicationRef", "BROWSER_MODULE_PROVIDERS", - "BROWSER_MODULE_PROVIDERS_MARKER", "BaseControlValueAccessor", "BehaviorSubject", "BrowserDomAdapter", @@ -92,9 +91,7 @@ "IterableChangeRecord_", "IterableDiffers", "KeyEventsPlugin", - "LContainerFlags", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -232,7 +229,6 @@ "_wasLastNodeCreated", "activeConsumer", "addAfterRenderSequencesForView", - "addPropertyBinding", "addToArray", "addToEndOfViewTree", "addValidators", @@ -261,7 +257,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "classIndexOf", "cleanUpView", @@ -320,7 +315,9 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementEndFirstCreatePass", "elementPropertyInternal", + "elementStartFirstCreatePass", "enterDI", "enterView", "epoch", @@ -337,6 +334,7 @@ "extractDirectiveDef", "fillProperties", "findAttrIndexInNode", + "findDirectiveDefMatches", "findStylingValue", "forEachSingleProvider", "forkJoin", @@ -345,7 +343,6 @@ "forwardRef", "freeConsumers", "fromAsyncIterable", - "generateInitialInputs", "getBeforeNodeForView", "getBindingsEnabled", "getClosureSafeProperty", @@ -375,7 +372,6 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -418,7 +414,6 @@ "inheritHostBindings", "inheritViewQuery", "initFeatures", - "initializeDirectives", "inject", "injectArgs", "injectChangeDetectorRef", @@ -434,7 +429,6 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", @@ -447,6 +441,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isDirectiveHost", "isEnvironmentProviders", "isFormControlState", @@ -484,6 +479,7 @@ "leaveDI", "leaveView", "leaveViewLight", + "listenToOutput", "listenerInternal", "lookupTokenUsingModuleInjector", "lookupTokenUsingNodeInjector", @@ -512,7 +508,6 @@ "nativeAppendChild", "nativeAppendOrInsertBefore", "nativeInsertBefore", - "nativeParentNode", "nextBindingIndex", "nextNgElementId", "ngOnChangesSetInput", @@ -529,8 +524,8 @@ "onLeave", "operate", "optionsReducer", - "parseAndConvertBindingsForDefinition", - "performanceMarkFeature", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "pickAsyncValidators", "pickValidators", "platformBrowser", @@ -565,6 +560,7 @@ "resetPreOrderHookFlags", "resolveDirectives", "resolveForwardRef", + "resolveHostDirectivesForDef", "resolveProvider", "resolvedPromise", "resolvedPromise2", @@ -577,6 +573,7 @@ "searchTokensOnInjector", "selectIndexInternal", "setActiveConsumer", + "setAllInputsForProperty", "setBindingRootForHostBindings", "setCurrentDirectiveIndex", "setCurrentInjector", @@ -586,16 +583,18 @@ "setDisabledStateDefault", "setIncludeViewProviders", "setInjectImplementation", - "setInputsForProperty", "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", + "setShadowStylingInputFlags", "setTStylingRangeNext", "setTStylingRangeNextDuplicate", "setTStylingRangePrevDuplicate", - "setUpAttributes", "setUpControl", "setUpValidators", + "setupHostDirectiveInputsOrOutputs", + "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shimStylesContent", "shouldAddViewToDom", @@ -611,7 +610,6 @@ "throwProviderNotFoundError", "timeoutProvider", "toObservable", - "toRefArray", "toTStylingRange", "trackByIdentity", "trackMovedView", @@ -627,7 +625,6 @@ "walkProviderTree", "wasLastNodeCreated", "wrapListener", - "writeDirectClass", "writeToDirectiveInput", "{getPrototypeOf:getPrototypeOf,prototype:objectProto,keys:getKeys}", "{isArray:isArray2}", diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index baa857939c79..bbaca3372b0c 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -45,9 +45,7 @@ "InjectionToken", "Injector", "InputFlags", - "LContainerFlags", "LOCALE_ID2", - "LifecycleHooksFeature", "NEW_LINE", "NG_COMP_DEF", "NG_ELEMENT_ID", @@ -125,7 +123,6 @@ "_platformInjector", "activeConsumer", "addAfterRenderSequencesForView", - "addPropertyBinding", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -145,11 +142,11 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "cleanUpView", "collectNativeNodes", "collectNativeNodesInLContainer", + "computeStaticStyling", "concatStringsWithSpace", "config", "configureViewWithDirective", @@ -159,6 +156,7 @@ "consumerPollProducersForChange", "context", "convertToBitFlags", + "createDirectivesInstances", "createElementRef", "createErrorClass", "createInjector", @@ -192,15 +190,16 @@ "forEachSingleProvider", "forwardRef", "freeConsumers", - "generateInitialInputs", "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", + "getConstant", "getCurrentTNode", "getCurrentTNodePlaceholderOk", "getDeclarationTNode", "getFactoryDef", "getFirstLContainer", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -248,10 +247,12 @@ "isAngularZoneProperty", "isApplicationBootstrapConfig", "isComponentDef", + "isComponentHost", + "isContentQueryHost", "isDestroyed", + "isDetachedByI18n", "isEnvironmentProviders", "isFunction", - "isInlineTemplate", "isLContainer", "isLView", "isPositive", @@ -269,6 +270,7 @@ "makeRecord", "map", "markAncestorsForTraversal", + "markAsComponentHost", "markViewDirty", "markViewForRefresh", "maybeWrapInNotSelector", @@ -301,6 +303,7 @@ "requiresRefreshOrTraversal", "resetPreOrderHookFlags", "resolveForwardRef", + "resolveHostDirectivesForDef", "runEffectsInView", "runInInjectionContext", "saveNameToExportMap", @@ -314,16 +317,19 @@ "setCurrentQueryIndex", "setIncludeViewProviders", "setInjectImplementation", + "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", - "setUpAttributes", + "setShadowStylingInputFlags", + "setupHostDirectiveInputsOrOutputs", + "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "shouldSearchParent", "storeLViewOnDestroy", "stringify", "stringifyCSSSelector", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "uniqueIdCounter", "unregisterLView", "unwrapRNode", @@ -332,7 +338,6 @@ "viewAttachedToChangeDetector", "viewShouldHaveReactiveConsumer", "walkProviderTree", - "writeDirectClass", "writeToDirectiveInput", "ɵɵdefineInjectable", "ɵɵdefineInjector", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index ca5dfab575e8..6951097930ac 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -73,9 +73,7 @@ "Injector", "InputFlags", "KeyEventsPlugin", - "LContainerFlags", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -101,7 +99,6 @@ "NodeInjector", "NodeInjectorDestroyRef", "NodeInjectorFactory", - "NodeNavigationStep", "NoneEncapsulationDomRenderer", "NoopNgZone", "NullInjector", @@ -172,7 +169,6 @@ "_wasLastNodeCreated", "activeConsumer", "addAfterRenderSequencesForView", - "addPropertyBinding", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -195,7 +191,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "cleanUpView", "cleanupDehydratedIcuData", @@ -204,6 +199,7 @@ "clearElementContents", "collectNativeNodes", "collectNativeNodesInLContainer", + "computeStaticStyling", "concatStringsWithSpace", "config", "configureViewWithDirective", @@ -213,6 +209,7 @@ "consumerPollProducersForChange", "context", "convertToBitFlags", + "createDirectivesInstances", "createElementNode", "createElementRef", "createErrorClass", @@ -254,10 +251,10 @@ "forwardRef", "freeConsumers", "fromAsyncIterable", - "generateInitialInputs", "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", + "getConstant", "getCurrentTNode", "getCurrentTNodePlaceholderOk", "getDOM", @@ -267,6 +264,7 @@ "getFactoryDef", "getFilteredHeaders", "getFirstLContainer", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -326,6 +324,7 @@ "isAsyncIterable", "isComponentDef", "isComponentHost", + "isContentQueryHost", "isDestroyed", "isDetachedByI18n", "isDisconnectedNode", @@ -333,7 +332,6 @@ "isFunction", "isHydrationSupportEnabled", "isInSkipHydrationBlock", - "isInlineTemplate", "isInteropObservable", "isIterable", "isLContainer", @@ -361,6 +359,7 @@ "makeEnvironmentProviders", "makeRecord", "markAncestorsForTraversal", + "markAsComponentHost", "markViewDirty", "markViewForRefresh", "markedFeatures", @@ -384,7 +383,8 @@ "onEnter", "onLeave", "operate", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "performanceMarkFeature", "populateDehydratedViewsInLContainerImpl", "processInjectorTypesWithProviders", @@ -406,6 +406,7 @@ "requiresRefreshOrTraversal", "resetPreOrderHookFlags", "resolveForwardRef", + "resolveHostDirectivesForDef", "retrieveHydrationInfo", "retrieveHydrationInfoImpl", "runEffectsInView", @@ -423,10 +424,14 @@ "setCurrentTNode", "setIncludeViewProviders", "setInjectImplementation", + "setInputsFromAttrs", "setIsRefreshingViews", "setSegmentHead", "setSelectedIndex", - "setUpAttributes", + "setShadowStylingInputFlags", + "setupHostDirectiveInputsOrOutputs", + "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "shimStylesContent", "shouldSearchParent", "siblingAfter", @@ -437,7 +442,6 @@ "subscribeOn", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "transferCacheInterceptorFn", "uniqueIdCounter", "unregisterLView", @@ -448,7 +452,6 @@ "viewShouldHaveReactiveConsumer", "walkProviderTree", "withDomHydration", - "writeDirectClass", "writeToDirectiveInput", "ɵɵdefineComponent", "ɵɵdefineInjectable", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 6bbc40ff7d2b..247a62a19719 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -99,11 +99,9 @@ "InputFlags", "ItemComponent", "KeyEventsPlugin", - "LContainerFlags", "LOCALE_ID2", "LQueries_", "LQuery_", - "LifecycleHooksFeature", "ListComponent", "Location", "LocationStrategy", @@ -135,7 +133,6 @@ "NavigationCancellationCode", "NavigationEnd", "NavigationError", - "NavigationResult", "NavigationSkipped", "NavigationSkippedCode", "NavigationStart", @@ -281,7 +278,6 @@ "activeConsumer", "addAfterRenderSequencesForView", "addEmptyPathsToChildrenIfNeeded", - "addPropertyBinding", "addToArray", "addToEndOfViewTree", "advanceActivatedRoute", @@ -309,7 +305,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "catchError", "checkStable", "classIndexOf", @@ -339,6 +334,7 @@ "createChildrenForEmptyPaths", "createContainerRef", "createContentQuery", + "createDirectivesInstances", "createElementNode", "createElementRef", "createEmptyState", @@ -387,6 +383,8 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementEndFirstCreatePass", + "elementStartFirstCreatePass", "emptyPathMatch", "encodeUriQuery", "encodeUriSegment", @@ -412,6 +410,7 @@ "filter", "finalize", "findAttrIndexInNode", + "findDirectiveDefMatches", "findNode", "findPath", "first", @@ -421,10 +420,8 @@ "freeConsumers", "from", "fromAsyncIterable", - "generateInitialInputs", "getAllRouteGuards", "getBeforeNodeForView", - "getBindingsEnabled", "getBootstrapListener", "getChildRouteGuards", "getClosestRouteInjector", @@ -460,7 +457,6 @@ "getNgModuleDef", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateLViewCleanup", "getOrCreateNodeInjectorForNode", @@ -504,7 +500,6 @@ "includeViewProviders", "incrementInitPhaseFlags", "initFeatures", - "initializeDirectives", "inject", "injectArgs", "injectChangeDetectorRef", @@ -523,7 +518,6 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", @@ -537,6 +531,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isDirectiveHost", "isEmptyError", "isEnvironmentProviders", @@ -573,6 +568,7 @@ "leaveDI", "leaveView", "leaveViewLight", + "listenToOutput", "locateDirectiveOrProvider", "lookupTokenUsingModuleInjector", "lookupTokenUsingNodeInjector", @@ -600,7 +596,6 @@ "nativeAppendChild", "nativeAppendOrInsertBefore", "nativeInsertBefore", - "nativeParentNode", "navigationCancelingError", "nextBindingIndex", "nextNgElementId", @@ -622,7 +617,8 @@ "onLeave", "operate", "paramCompareMap", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "pathCompareMap", "pipeFromArray", "policy", @@ -641,7 +637,6 @@ "refCount", "refreshContentQueries", "refreshView", - "registerPostOrderHooks", "rememberChangeHistoryAndInvokeOnChangesHook", "remove", "removeElements", @@ -654,6 +649,7 @@ "requiresRefreshOrTraversal", "resetPreOrderHookFlags", "resolveForwardRef", + "resolveHostDirectivesForDef", "rootRoute", "routes", "runEffectsInView", @@ -668,6 +664,7 @@ "serializePaths", "serializeSegment", "setActiveConsumer", + "setAllInputsForProperty", "setBindingRootForHostBindings", "setCurrentDirectiveIndex", "setCurrentInjector", @@ -676,12 +673,14 @@ "setDirectiveInputsWhichShadowsStyling", "setIncludeViewProviders", "setInjectImplementation", - "setInputsForProperty", "setInputsFromAttrs", "setIsRefreshingViews", "setRouterState", "setSelectedIndex", - "setUpAttributes", + "setShadowStylingInputFlags", + "setupHostDirectiveInputsOrOutputs", + "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shallowEqual", "shimStylesContent", @@ -708,7 +707,6 @@ "throwInvalidWriteToSignalErrorFn", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "trackMovedView", "tree", "trustedScriptURLFromStringBypass", @@ -727,13 +725,11 @@ "wasLastNodeCreated", "wrapIntoObservable", "wrapListener", - "writeDirectClass", "writeToDirectiveInput", "{getPrototypeOf:getPrototypeOf,prototype:objectProto,keys:getKeys}", "{isArray:isArray2}", "{isArray:isArray}", "ɵEmptyOutletComponent", - "ɵɵInputTransformsFeature", "ɵɵNgOnChangesFeature", "ɵɵattribute", "ɵɵdefineComponent", diff --git a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json index ffe656b028ec..3f9bb34b6083 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -61,9 +61,7 @@ "Injector", "InputFlags", "KeyEventsPlugin", - "LContainerFlags", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -150,7 +148,6 @@ "_wasLastNodeCreated", "activeConsumer", "addAfterRenderSequencesForView", - "addPropertyBinding", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -171,11 +168,11 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "cleanUpView", "collectNativeNodes", "collectNativeNodesInLContainer", + "computeStaticStyling", "concatStringsWithSpace", "config", "configureViewWithDirective", @@ -185,6 +182,7 @@ "consumerPollProducersForChange", "context", "convertToBitFlags", + "createDirectivesInstances", "createElementRef", "createErrorClass", "createInjector", @@ -220,10 +218,10 @@ "forEachSingleProvider", "forwardRef", "freeConsumers", - "generateInitialInputs", "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", + "getConstant", "getCurrentTNode", "getCurrentTNodePlaceholderOk", "getDOM", @@ -231,6 +229,7 @@ "getDirectiveDef", "getFactoryDef", "getFirstLContainer", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -277,10 +276,12 @@ "isAngularZoneProperty", "isApplicationBootstrapConfig", "isComponentDef", + "isComponentHost", + "isContentQueryHost", "isDestroyed", + "isDetachedByI18n", "isEnvironmentProviders", "isFunction", - "isInlineTemplate", "isLContainer", "isLView", "isPlatformServer", @@ -300,6 +301,7 @@ "makeRecord", "map", "markAncestorsForTraversal", + "markAsComponentHost", "markViewDirty", "markViewForRefresh", "markedFeatures", @@ -319,7 +321,8 @@ "observable", "onEnter", "onLeave", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "processInjectorTypesWithProviders", "producerMarkClean", "producerRemoveLiveConsumerAtIndex", @@ -335,6 +338,7 @@ "requiresRefreshOrTraversal", "resetPreOrderHookFlags", "resolveForwardRef", + "resolveHostDirectivesForDef", "runEffectsInView", "runInInjectionContext", "saveNameToExportMap", @@ -349,9 +353,13 @@ "setCurrentTNode", "setIncludeViewProviders", "setInjectImplementation", + "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", - "setUpAttributes", + "setShadowStylingInputFlags", + "setupHostDirectiveInputsOrOutputs", + "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "shimStylesContent", "shouldSearchParent", "storeLViewOnDestroy", @@ -359,7 +367,6 @@ "stringifyCSSSelector", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "uniqueIdCounter", "unregisterLView", "unwrapRNode", @@ -368,7 +375,6 @@ "viewAttachedToChangeDetector", "viewShouldHaveReactiveConsumer", "walkProviderTree", - "writeDirectClass", "writeToDirectiveInput", "ɵɵdefineComponent", "ɵɵdefineInjectable", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 144fe0e2025c..454d11002e90 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -9,7 +9,6 @@ "ApplicationModule", "ApplicationRef", "BROWSER_MODULE_PROVIDERS", - "BROWSER_MODULE_PROVIDERS_MARKER", "BehaviorSubject", "BrowserDomAdapter", "BrowserModule", @@ -69,9 +68,7 @@ "IterableChangeRecord_", "IterableDiffers", "KeyEventsPlugin", - "LContainerFlags", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -197,7 +194,6 @@ "_wasLastNodeCreated", "activeConsumer", "addAfterRenderSequencesForView", - "addPropertyBinding", "addToArray", "addToEndOfViewTree", "allocExpando", @@ -224,7 +220,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "classIndexOf", "cleanUpView", @@ -272,6 +267,8 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementEndFirstCreatePass", + "elementStartFirstCreatePass", "enterDI", "enterView", "errorContext", @@ -285,11 +282,11 @@ "extractDefListOrFactory", "extractDirectiveDef", "findAttrIndexInNode", + "findDirectiveDefMatches", "findStylingValue", "forEachSingleProvider", "forwardRef", "freeConsumers", - "generateInitialInputs", "getBeforeNodeForView", "getBindingsEnabled", "getClosureSafeProperty", @@ -319,7 +316,6 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -354,7 +350,6 @@ "includeViewProviders", "incrementInitPhaseFlags", "initFeatures", - "initializeDirectives", "inject", "injectArgs", "injectDestroyRef", @@ -368,7 +363,6 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", @@ -378,6 +372,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isDirectiveHost", "isEnvironmentProviders", "isFunction", @@ -405,6 +400,7 @@ "leaveDI", "leaveView", "leaveViewLight", + "listenToOutput", "lookupTokenUsingModuleInjector", "lookupTokenUsingNodeInjector", "makeParamDecorator", @@ -422,7 +418,6 @@ "nativeAppendChild", "nativeAppendOrInsertBefore", "nativeInsertBefore", - "nativeParentNode", "nextBindingIndex", "nextNgElementId", "ngOnChangesSetInput", @@ -436,7 +431,8 @@ "onEnter", "onLeave", "optionsReducer", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "platformBrowser", "platformCore", "processInjectorTypesWithProviders", @@ -457,6 +453,7 @@ "resetPreOrderHookFlags", "resolveDirectives", "resolveForwardRef", + "resolveHostDirectivesForDef", "runEffectsInView", "runInInjectionContext", "saveNameToExportMap", @@ -466,6 +463,7 @@ "searchTokensOnInjector", "selectIndexInternal", "setActiveConsumer", + "setAllInputsForProperty", "setBindingRootForHostBindings", "setCurrentDirectiveIndex", "setCurrentInjector", @@ -474,14 +472,16 @@ "setDirectiveInputsWhichShadowsStyling", "setIncludeViewProviders", "setInjectImplementation", - "setInputsForProperty", "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", + "setShadowStylingInputFlags", "setTStylingRangeNext", "setTStylingRangeNextDuplicate", "setTStylingRangePrevDuplicate", - "setUpAttributes", + "setupHostDirectiveInputsOrOutputs", + "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shimStylesContent", "shouldAddViewToDom", @@ -491,7 +491,6 @@ "stringifyCSSSelector", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "toTStylingRange", "trackByIdentity", "trackMovedView", @@ -505,7 +504,6 @@ "walkProviderTree", "wasLastNodeCreated", "wrapListener", - "writeDirectClass", "writeToDirectiveInput", "ɵɵadvance", "ɵɵclassProp", diff --git a/packages/core/test/change_detection_scheduler_spec.ts b/packages/core/test/change_detection_scheduler_spec.ts index 99f49b8ee7c6..82cf6ecf8a41 100644 --- a/packages/core/test/change_detection_scheduler_spec.ts +++ b/packages/core/test/change_detection_scheduler_spec.ts @@ -372,12 +372,8 @@ describe('Angular with zoneless enabled', () => { expect(host.innerHTML).toEqual('binding'); const component2 = createComponent(DynamicCmp, {environmentInjector}); - // TODO(atscott): Only needed because renderFactory will not run if ApplicationRef has no - // views. This should likely be fixed in ApplicationRef appRef.attachView(component2.hostView); appRef.detachView(component.hostView); - // DOM is not synchronously removed because change detection hasn't run - expect(host.innerHTML).toEqual('binding'); expect(isStable()).toBe(false); await whenStable(); expect(host.innerHTML).toEqual(''); diff --git a/packages/core/test/hydration/compression_spec.ts b/packages/core/test/hydration/compression_spec.ts index bfb68fb45f32..6c95d6e56811 100644 --- a/packages/core/test/hydration/compression_spec.ts +++ b/packages/core/test/hydration/compression_spec.ts @@ -8,6 +8,8 @@ import {compressNodeLocation, decompressNodeLocation} from '../../src/hydration/compression'; import { + NODE_NAVIGATION_STEP_FIRST_CHILD, + NODE_NAVIGATION_STEP_NEXT_SIBLING, NodeNavigationStep, REFERENCE_NODE_BODY, REFERENCE_NODE_HOST, @@ -15,8 +17,8 @@ import { describe('compression of node location', () => { it('should handle basic cases', () => { - const fc = NodeNavigationStep.FirstChild; - const ns = NodeNavigationStep.NextSibling; + const fc = NODE_NAVIGATION_STEP_FIRST_CHILD; + const ns = NODE_NAVIGATION_STEP_NEXT_SIBLING; const cases = [ [[REFERENCE_NODE_HOST, fc, 1], 'hf'], [[REFERENCE_NODE_BODY, fc, 1], 'bf'], diff --git a/packages/core/test/linker/change_detection_integration_spec.ts b/packages/core/test/linker/change_detection_integration_spec.ts index 9106941a94ac..c8552fc4eee4 100644 --- a/packages/core/test/linker/change_detection_integration_spec.ts +++ b/packages/core/test/linker/change_detection_integration_spec.ts @@ -45,6 +45,7 @@ import {isTextNode} from '@angular/platform-browser/testing/src/browser_util'; import {expect} from '@angular/platform-browser/testing/src/matchers'; import {MockResourceLoader} from './resource_loader_mock'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; const TEST_COMPILER_PROVIDERS: Provider[] = [ {provide: ResourceLoader, useClass: MockResourceLoader, deps: []}, @@ -110,6 +111,7 @@ const TEST_COMPILER_PROVIDERS: Provider[] = [ beforeEach(() => { TestBed.configureCompiler({providers: TEST_COMPILER_PROVIDERS}); TestBed.configureTestingModule({ + imports: [NoopAnimationsModule], declarations: [ TestData, TestDirective, diff --git a/packages/core/test/render3/di_spec.ts b/packages/core/test/render3/di_spec.ts index f161ebf6975d..d949a8307500 100644 --- a/packages/core/test/render3/di_spec.ts +++ b/packages/core/test/render3/di_spec.ts @@ -7,11 +7,6 @@ */ import {Component, Directive, Self} from '@angular/core'; -import { - createLView, - createTView, - getOrCreateTNode, -} from '@angular/core/src/render3/instructions/shared'; import {NodeInjectorOffset} from '@angular/core/src/render3/interfaces/injector'; import {TestBed} from '@angular/core/testing'; @@ -24,6 +19,8 @@ import { import {TNodeType} from '../../src/render3/interfaces/node'; import {HEADER_OFFSET, LViewFlags, TVIEW, TViewType} from '../../src/render3/interfaces/view'; import {enterView, leaveView} from '../../src/render3/state'; +import {getOrCreateTNode} from '@angular/core/src/render3/tnode_manipulation'; +import {createLView, createTView} from '@angular/core/src/render3/view/construction'; describe('di', () => { describe('directive injection', () => { diff --git a/packages/core/test/render3/i18n/i18n_insert_before_index_spec.ts b/packages/core/test/render3/i18n/i18n_insert_before_index_spec.ts index 3470bbd21298..1f397d66cda1 100644 --- a/packages/core/test/render3/i18n/i18n_insert_before_index_spec.ts +++ b/packages/core/test/render3/i18n/i18n_insert_before_index_spec.ts @@ -7,10 +7,10 @@ */ import {addTNodeAndUpdateInsertBeforeIndex} from '@angular/core/src/render3/i18n/i18n_insert_before_index'; -import {createTNode} from '@angular/core/src/render3/instructions/shared'; import {TNode, TNodeType} from '@angular/core/src/render3/interfaces/node'; import {HEADER_OFFSET} from '@angular/core/src/render3/interfaces/view'; import {matchTNode} from '../matchers'; +import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; describe('addTNodeAndUpdateInsertBeforeIndex', () => { function tNode(index: number, type: TNodeType, insertBeforeIndex: number | null = null): TNode { diff --git a/packages/core/test/render3/instructions/mock_renderer_factory.ts b/packages/core/test/render3/instructions/mock_renderer_factory.ts index baa8eda4f428..7a3b6c74cf22 100644 --- a/packages/core/test/render3/instructions/mock_renderer_factory.ts +++ b/packages/core/test/render3/instructions/mock_renderer_factory.ts @@ -46,7 +46,7 @@ class MockRenderer implements Renderer { } selectRootElement(selectorOrNode: string | any): RElement { return typeof selectorOrNode === 'string' - ? document.querySelector(selectorOrNode) + ? document.querySelector(selectorOrNode)! : selectorOrNode; } parentNode(node: Node): RElement | null { diff --git a/packages/core/test/render3/instructions/shared_spec.ts b/packages/core/test/render3/instructions/shared_spec.ts index fcc7c4af682a..2b0e0aab7788 100644 --- a/packages/core/test/render3/instructions/shared_spec.ts +++ b/packages/core/test/render3/instructions/shared_spec.ts @@ -6,7 +6,6 @@ * found in the LICENSE file at https://angular.dev/license */ -import {createLView, createTNode, createTView} from '@angular/core/src/render3/instructions/shared'; import {TNodeType} from '@angular/core/src/render3/interfaces/node'; import { HEADER_OFFSET, @@ -23,6 +22,8 @@ import { } from '@angular/core/src/render3/state'; import {MockRendererFactory} from './mock_renderer_factory'; +import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; +import {createLView, createTView} from '@angular/core/src/render3/view/construction'; /** * Setups a simple `LView` so that it is possible to do unit tests on instructions. diff --git a/packages/core/test/render3/is_shape_of.ts b/packages/core/test/render3/is_shape_of.ts index c30449671049..5faf4020a8f0 100644 --- a/packages/core/test/render3/is_shape_of.ts +++ b/packages/core/test/render3/is_shape_of.ts @@ -163,7 +163,10 @@ const ShapeOfTNode: ShapeOf = { localNames: true, initialInputs: true, inputs: true, + hostDirectiveInputs: true, outputs: true, + hostDirectiveOutputs: true, + directiveToIndex: true, tView: true, next: true, prev: true, diff --git a/packages/core/test/render3/ivy/jit_spec.ts b/packages/core/test/render3/ivy/jit_spec.ts index a3c34bc5c1cb..79fb263b5fe4 100644 --- a/packages/core/test/render3/ivy/jit_spec.ts +++ b/packages/core/test/render3/ivy/jit_spec.ts @@ -30,6 +30,7 @@ import {setCurrentInjector, ɵɵinject} from '@angular/core/src/di/injector_comp import {ɵɵdefineInjectable, ɵɵInjectorDef} from '@angular/core/src/di/interface/defs'; import {FactoryFn} from '@angular/core/src/render3/definition_factory'; import {ComponentDef, PipeDef} from '@angular/core/src/render3/interfaces/definition'; +import {InputFlags} from '@angular/core/src/render3/interfaces/input_flags'; describe('render3 jit', () => { let injector: any; @@ -379,7 +380,7 @@ describe('render3 jit', () => { } const InputCompAny = InputComp as any; - expect(InputCompAny.ɵcmp.inputs).toEqual({publicName: 'privateName'}); + expect(InputCompAny.ɵcmp.inputs).toEqual({publicName: ['privateName', InputFlags.None, null]}); expect(InputCompAny.ɵcmp.declaredInputs).toEqual({publicName: 'privateName'}); }); @@ -393,7 +394,7 @@ describe('render3 jit', () => { } const InputDirAny = InputDir as any; - expect(InputDirAny.ɵdir.inputs).toEqual({publicName: 'privateName'}); + expect(InputDirAny.ɵdir.inputs).toEqual({publicName: ['privateName', InputFlags.None, null]}); expect(InputDirAny.ɵdir.declaredInputs).toEqual({publicName: 'privateName'}); }); diff --git a/packages/core/test/render3/jit/declare_component_spec.ts b/packages/core/test/render3/jit/declare_component_spec.ts index 02c11fb10354..d0278a9bed6a 100644 --- a/packages/core/test/render3/jit/declare_component_spec.ts +++ b/packages/core/test/render3/jit/declare_component_spec.ts @@ -23,7 +23,6 @@ import { AttributeMarker, ComponentDef, ɵɵInheritDefinitionFeature, - ɵɵInputTransformsFeature, ɵɵNgOnChangesFeature, } from '../../../src/render3'; @@ -71,8 +70,8 @@ describe('component declaration jit compilation', () => { expectComponentDef(def, { inputs: { - 'property': 'minifiedProperty', - 'bindingName': 'minifiedClassProperty', + 'property': ['minifiedProperty', InputFlags.None, null], + 'bindingName': ['minifiedClassProperty', InputFlags.None, null], }, declaredInputs: { 'property': 'property', @@ -97,15 +96,15 @@ describe('component declaration jit compilation', () => { expectComponentDef(def, { inputs: { - 'bindingName': ['minifiedClassProperty', InputFlags.HasDecoratorInputTransform], - }, - inputTransforms: { - 'minifiedClassProperty': transformFn, + 'bindingName': [ + 'minifiedClassProperty', + InputFlags.HasDecoratorInputTransform, + transformFn, + ], }, declaredInputs: { 'bindingName': 'classProperty', }, - features: [ɵɵInputTransformsFeature], }); }); @@ -587,7 +586,6 @@ type ComponentDefExpectations = jasmine.Expected< | 'onPush' | 'styles' | 'data' - | 'inputTransforms' > > & { directives: Type[] | null; @@ -608,7 +606,6 @@ function expectComponentDef( template: jasmine.any(Function), inputs: {}, declaredInputs: {}, - inputTransforms: null, outputs: {}, features: null, hostAttrs: null, @@ -634,9 +631,6 @@ function expectComponentDef( expect(actual.template).withContext('template').toEqual(expectation.template); expect(actual.inputs).withContext('inputs').toEqual(expectation.inputs); expect(actual.declaredInputs).withContext('declaredInputs').toEqual(expectation.declaredInputs); - expect(actual.inputTransforms) - .withContext('inputTransforms') - .toEqual(expectation.inputTransforms); expect(actual.outputs).withContext('outputs').toEqual(expectation.outputs); expect(actual.features).withContext('features').toEqual(expectation.features); expect(actual.hostAttrs).withContext('hostAttrs').toEqual(expectation.hostAttrs); diff --git a/packages/core/test/render3/jit/declare_directive_spec.ts b/packages/core/test/render3/jit/declare_directive_spec.ts index a8f291bd413e..45d36518f390 100644 --- a/packages/core/test/render3/jit/declare_directive_spec.ts +++ b/packages/core/test/render3/jit/declare_directive_spec.ts @@ -16,6 +16,7 @@ import { } from '../../../src/render3'; import {functionContaining} from './matcher'; +import {InputFlags} from '@angular/core/src/render3/interfaces/input_flags'; describe('directive declaration jit compilation', () => { it('should compile a minimal directive declaration', () => { @@ -54,8 +55,8 @@ describe('directive declaration jit compilation', () => { expectDirectiveDef(def, { inputs: { - 'property': 'minifiedProperty', - 'bindingName': 'minifiedClassProperty', + 'property': ['minifiedProperty', InputFlags.None, null], + 'bindingName': ['minifiedClassProperty', InputFlags.None, null], }, declaredInputs: { 'property': 'property', diff --git a/packages/core/test/render3/matchers_spec.ts b/packages/core/test/render3/matchers_spec.ts index 3636b0319da3..6077bf5badd5 100644 --- a/packages/core/test/render3/matchers_spec.ts +++ b/packages/core/test/render3/matchers_spec.ts @@ -6,12 +6,13 @@ * found in the LICENSE file at https://angular.dev/license */ -import {createTNode, createTView} from '@angular/core/src/render3/instructions/shared'; import {TNodeType} from '@angular/core/src/render3/interfaces/node'; import {TViewType} from '@angular/core/src/render3/interfaces/view'; import {isShapeOf, ShapeOf} from './is_shape_of'; import {matchDomElement, matchDomText, matchObjectShape, matchTNode, matchTView} from './matchers'; +import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; +import {createTView} from '@angular/core/src/render3/view/construction'; describe('render3 matchers', () => { const fakeMatcherUtil = {equals: (a: any, b: any) => a === b} as jasmine.MatchersUtil; diff --git a/packages/core/test/render3/node_selector_matcher_spec.ts b/packages/core/test/render3/node_selector_matcher_spec.ts index c5def1c97f89..4341ac87cad6 100644 --- a/packages/core/test/render3/node_selector_matcher_spec.ts +++ b/packages/core/test/render3/node_selector_matcher_spec.ts @@ -6,8 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {createTNode} from '@angular/core/src/render3/instructions/shared'; - +import {createTNode} from '../../src/render3/tnode_manipulation'; import {AttributeMarker} from '../../src/render3/interfaces/attribute_marker'; import {TAttributes, TNode, TNodeType} from '../../src/render3/interfaces/node'; import {CssSelector, CssSelectorList, SelectorFlags} from '../../src/render3/interfaces/projection'; @@ -742,8 +741,13 @@ describe('extractAttrsAndClassesFromSelector', () => { cases.forEach(([selector, attrs, classes]) => { it(`should process ${JSON.stringify(selector)} selector`, () => { const extracted = extractAttrsAndClassesFromSelector(selector); - expect(extracted.attrs).toEqual(attrs as string[]); - expect(extracted.classes).toEqual(classes as string[]); + const cssClassMarker = extracted.indexOf(AttributeMarker.Classes); + + const extractedAttrs = cssClassMarker > -1 ? extracted.slice(0, cssClassMarker) : extracted; + const extractedClasses = cssClassMarker > -1 ? extracted.slice(cssClassMarker + 1) : []; + + expect(extractedAttrs).toEqual(attrs as string[]); + expect(extractedClasses).toEqual(classes as string[]); }); }); }); diff --git a/packages/core/test/render3/styling_next/static_styling_spec.ts b/packages/core/test/render3/styling_next/static_styling_spec.ts index a58783a9b45b..00c4d48640f5 100644 --- a/packages/core/test/render3/styling_next/static_styling_spec.ts +++ b/packages/core/test/render3/styling_next/static_styling_spec.ts @@ -6,12 +6,12 @@ * found in the LICENSE file at https://angular.dev/license */ -import {createTNode} from '@angular/core/src/render3/instructions/shared'; import {AttributeMarker} from '@angular/core/src/render3/interfaces/attribute_marker'; import {TAttributes, TNode, TNodeType} from '@angular/core/src/render3/interfaces/node'; import {LView} from '@angular/core/src/render3/interfaces/view'; import {enterView} from '@angular/core/src/render3/state'; import {computeStaticStyling} from '@angular/core/src/render3/styling/static_styling'; +import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; describe('static styling', () => { const mockFirstCreatePassLView: LView = [null, {firstCreatePass: true}] as any; diff --git a/packages/core/test/render3/styling_next/style_binding_list_spec.ts b/packages/core/test/render3/styling_next/style_binding_list_spec.ts index 336be424b9df..dd6385f228d1 100644 --- a/packages/core/test/render3/styling_next/style_binding_list_spec.ts +++ b/packages/core/test/render3/styling_next/style_binding_list_spec.ts @@ -6,7 +6,6 @@ * found in the LICENSE file at https://angular.dev/license */ -import {createTNode} from '@angular/core/src/render3/instructions/shared'; import {TNode, TNodeType} from '@angular/core/src/render3/interfaces/node'; import { getTStylingRangeNext, @@ -19,6 +18,7 @@ import { import {LView, TData} from '@angular/core/src/render3/interfaces/view'; import {enterView, leaveView} from '@angular/core/src/render3/state'; import {insertTStylingBinding} from '@angular/core/src/render3/styling/style_binding_list'; +import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; import {newArray} from '@angular/core/src/util/array_utils'; describe('TNode styling linked list', () => { diff --git a/packages/core/test/render3/view_fixture.ts b/packages/core/test/render3/view_fixture.ts index 80523fd4a096..37d5398b216b 100644 --- a/packages/core/test/render3/view_fixture.ts +++ b/packages/core/test/render3/view_fixture.ts @@ -12,7 +12,6 @@ import {stringifyElement} from '@angular/platform-browser/testing/src/browser_ut import {extractDirectiveDef} from '../../src/render3/definition'; import {refreshView} from '../../src/render3/instructions/change_detection'; import {renderView} from '../../src/render3/instructions/render'; -import {createLView, createTNode, createTView} from '../../src/render3/instructions/shared'; import { DirectiveDef, DirectiveDefList, @@ -34,6 +33,8 @@ import {enterView, leaveView, specOnlyIsInstructionStateEmpty} from '../../src/r import {noop} from '../../src/util/noop'; import {getRendererFactory2} from './imported_renderer2'; +import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; +import {createLView, createTView} from '@angular/core/src/render3/view/construction'; /** * Fixture useful for testing operations which need `LView` / `TView` diff --git a/packages/core/test/render3/view_utils_spec.ts b/packages/core/test/render3/view_utils_spec.ts index 6f464ea3bcc5..38e2b1abfbcf 100644 --- a/packages/core/test/render3/view_utils_spec.ts +++ b/packages/core/test/render3/view_utils_spec.ts @@ -6,9 +6,10 @@ * found in the LICENSE file at https://angular.dev/license */ -import {createLContainer, createTNode} from '@angular/core/src/render3/instructions/shared'; import {isLContainer, isLView} from '@angular/core/src/render3/interfaces/type_checks'; import {ViewFixture} from './view_fixture'; +import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; +import {createLContainer} from '@angular/core/src/render3/view/container'; describe('view_utils', () => { it('should verify unwrap methods (isLView and isLContainer)', () => { diff --git a/packages/core/test/resource/resource_spec.ts b/packages/core/test/resource/resource_spec.ts index cb759a8e6c40..8feecbefd9d2 100644 --- a/packages/core/test/resource/resource_spec.ts +++ b/packages/core/test/resource/resource_spec.ts @@ -7,6 +7,7 @@ */ import { + ApplicationRef, createEnvironmentInjector, EnvironmentInjector, Injector, @@ -31,7 +32,7 @@ abstract class MockBackend { } abort(req: T) { - this.reject(req, 'aborted'); + return this.reject(req, 'aborted'); } reject(req: T, reason: any) { @@ -41,10 +42,10 @@ abstract class MockBackend { entry.reject(reason); } - return Promise.resolve(); + return flushMicrotasks(); } - async flush() { + async flush(): Promise { const allPending = Array.from(this.pending.values()).map((pending) => pending.promise); for (const [req, {resolve}] of this.pending) { @@ -52,7 +53,8 @@ abstract class MockBackend { } this.pending.clear(); - return Promise.all(allPending); + await Promise.all(allPending); + await flushMicrotasks(); } protected abstract prepareResponse(request: T): R; @@ -81,22 +83,13 @@ describe('resource', () => { injector: TestBed.inject(Injector), }); - // a freshly created resource is in the idle state - expect(echoResource.status()).toBe(ResourceStatus.Idle); - expect(echoResource.isLoading()).toBeFalse(); - expect(echoResource.hasValue()).toBeFalse(); - expect(echoResource.value()).toBeUndefined(); - expect(echoResource.error()).toBe(undefined); - - // flush effect to kick off a request - // THINK: testing patterns around a resource? - TestBed.flushEffects(); + // a freshly created resource is in the loading state expect(echoResource.status()).toBe(ResourceStatus.Loading); expect(echoResource.isLoading()).toBeTrue(); expect(echoResource.hasValue()).toBeFalse(); expect(echoResource.value()).toBeUndefined(); expect(echoResource.error()).toBe(undefined); - + TestBed.flushEffects(); await backend.flush(); expect(echoResource.status()).toBe(ResourceStatus.Resolved); expect(echoResource.isLoading()).toBeFalse(); @@ -114,6 +107,25 @@ describe('resource', () => { expect(echoResource.error()).toBe(undefined); }); + it('should report idle status as the previous status on first run', async () => { + let prevStatus: ResourceStatus | undefined; + resource({ + loader: async ({previous}) => { + // Ensure the loader only runs once. + expect(prevStatus).toBeUndefined(); + + prevStatus = previous.status; + return true; + }, + injector: TestBed.inject(Injector), + }); + + TestBed.flushEffects(); + await flushMicrotasks(); + + expect(prevStatus).toBe(ResourceStatus.Idle); + }); + it('should expose errors thrown during resource loading', async () => { const backend = new MockEchoBackend(); const requestParam = {}; @@ -159,6 +171,7 @@ describe('resource', () => { counter.update((value) => value + 1); TestBed.flushEffects(); + await backend.flush(); expect(echoResource.status()).toBe(ResourceStatus.Error); expect(echoResource.isLoading()).toBeFalse(); @@ -167,6 +180,78 @@ describe('resource', () => { expect(echoResource.error()).toEqual(Error('KO')); }); + it('should respond to a request that changes while loading', async () => { + const appRef = TestBed.inject(ApplicationRef); + + const request = signal(0); + let resolve: Array<() => void> = []; + const res = resource({ + request, + loader: async ({request}) => { + const p = Promise.withResolvers(); + resolve.push(() => p.resolve(request)); + return p.promise; + }, + injector: TestBed.inject(Injector), + }); + + // Start the load by running the effect inside the resource. + appRef.tick(); + + // We should have a pending load. + expect(resolve.length).toBe(1); + + // Change the request. + request.set(1); + + // Resolve the first load. + resolve[0](); + await flushMicrotasks(); + + // The resource should still be loading. Ticking (triggering the 2nd effect) + // should not change the loading status. + expect(res.status()).toBe(ResourceStatus.Loading); + appRef.tick(); + expect(res.status()).toBe(ResourceStatus.Loading); + expect(resolve.length).toBe(2); + + // Resolve the second load. + resolve[1]?.(); + await flushMicrotasks(); + + // We should see the resolved value. + expect(res.status()).toBe(ResourceStatus.Resolved); + expect(res.value()).toBe(1); + }); + + it('should return a default value if provided', async () => { + const DEFAULT: string[] = []; + const request = signal(0); + const res = resource({ + request, + loader: async ({request}) => { + if (request === 2) { + throw new Error('err'); + } + return ['data']; + }, + defaultValue: DEFAULT, + injector: TestBed.inject(Injector), + }); + expect(res.value()).toBe(DEFAULT); + + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).not.toBe(DEFAULT); + + request.set(1); + expect(res.value()).toBe(DEFAULT); + + request.set(2); + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.error()).not.toBeUndefined(); + expect(res.value()).toBe(DEFAULT); + }); + it('should _not_ load if the request resolves to undefined', () => { const counter = signal(0); const backend = new MockEchoBackend(); @@ -362,6 +447,9 @@ describe('resource', () => { expect(res.error()).toBe(undefined); res.reload(); + expect(res.status()).toBe(ResourceStatus.Reloading); + expect(res.value()).toBe('0:0'); + TestBed.flushEffects(); await backend.flush(); expect(res.status()).toBe(ResourceStatus.Resolved); @@ -411,4 +499,228 @@ describe('resource', () => { // @ts-expect-error readonlyRes.value.set; }); + + it('should synchronously change states', async () => { + const request = signal(undefined); + const backend = new MockEchoBackend(); + const echoResource = resource({ + request, + loader: (params) => backend.fetch(params.request), + injector: TestBed.inject(Injector), + }); + // Idle to start. + expect(echoResource.status()).toBe(ResourceStatus.Idle); + // Switch to loading state should be synchronous. + request.set(1); + expect(echoResource.status()).toBe(ResourceStatus.Loading); + // And back to idle. + request.set(undefined); + expect(echoResource.status()).toBe(ResourceStatus.Idle); + // Allow the load to proceed. + request.set(2); + TestBed.flushEffects(); + await backend.flush(); + expect(echoResource.status()).toBe(ResourceStatus.Resolved); + // Reload state should be synchronous. + echoResource.reload(); + expect(echoResource.status()).toBe(ResourceStatus.Reloading); + // Back to idle. + request.set(undefined); + expect(echoResource.status()).toBe(ResourceStatus.Idle); + }); + it('set() should abort a pending load', async () => { + const request = signal(1); + const backend = new MockEchoBackend(); + const echoResource = resource({ + request, + loader: (params) => backend.fetch(params.request), + injector: TestBed.inject(Injector), + }); + const appRef = TestBed.inject(ApplicationRef); + // Fully resolve the resource to start. + TestBed.flushEffects(); + await backend.flush(); + expect(echoResource.status()).toBe(ResourceStatus.Resolved); + // Trigger loading state. + request.set(2); + expect(echoResource.status()).toBe(ResourceStatus.Loading); + // Set the resource to a new value. + echoResource.set(3); + // Now run the effect, which should be a no-op as the resource was set to a local value. + TestBed.flushEffects(); + // We should still be in local state. + expect(echoResource.status()).toBe(ResourceStatus.Local); + expect(echoResource.value()).toBe(3); + // Flush the resource + await backend.flush(); + await appRef.whenStable(); + // We should still be in local state. + expect(echoResource.status()).toBe(ResourceStatus.Local); + expect(echoResource.value()).toBe(3); + }); + + it('set() should abort a pending reload', async () => { + const request = signal(1); + const backend = new MockEchoBackend(); + const echoResource = resource({ + request, + loader: (params) => backend.fetch(params.request), + injector: TestBed.inject(Injector), + }); + const appRef = TestBed.inject(ApplicationRef); + // Fully resolve the resource to start. + TestBed.flushEffects(); + await backend.flush(); + expect(echoResource.status()).toBe(ResourceStatus.Resolved); + // Trigger reloading state. + echoResource.reload(); + expect(echoResource.status()).toBe(ResourceStatus.Reloading); + // Set the resource to a new value. + echoResource.set(3); + // Now run the effect, which should be a no-op as the resource was set to a local value. + TestBed.flushEffects(); + // We should still be in local state. + expect(echoResource.status()).toBe(ResourceStatus.Local); + expect(echoResource.value()).toBe(3); + // Flush the resource + await backend.flush(); + await appRef.whenStable(); + // We should still be in local state. + expect(echoResource.status()).toBe(ResourceStatus.Local); + expect(echoResource.value()).toBe(3); + }); + + it('should allow streaming', async () => { + const appRef = TestBed.inject(ApplicationRef); + const res = resource({ + stream: async () => signal({value: 'done'}), + injector: TestBed.inject(Injector), + }); + + await appRef.whenStable(); + expect(res.status()).toBe(ResourceStatus.Resolved); + expect(res.value()).toBe('done'); + }); + + it('should error via error()', async () => { + const appRef = TestBed.inject(ApplicationRef); + const res = resource({ + stream: async () => signal({error: 'fail'}), + injector: TestBed.inject(Injector), + }); + + await appRef.whenStable(); + expect(res.status()).toBe(ResourceStatus.Error); + expect(res.error()).toBe('fail'); + }); + + it('should transition across streamed states', async () => { + const appRef = TestBed.inject(ApplicationRef); + const stream = signal<{value: number} | {error: unknown}>({value: 1}); + + const res = resource({ + stream: async () => stream, + injector: TestBed.inject(Injector), + }); + await appRef.whenStable(); + + stream.set({value: 2}); + expect(res.value()).toBe(2); + + stream.set({value: 3}); + expect(res.value()).toBe(3); + + stream.set({error: 'fail'}); + expect(res.error()).toBe('fail'); + + stream.set({value: 4}); + expect(res.value()).toBe(4); + }); + + it('should not accept new values/errors after a request is cancelled', async () => { + const appRef = TestBed.inject(ApplicationRef); + const stream = signal<{value: number} | {error: unknown}>({value: 0}); + const request = signal(1); + const res = resource({ + request, + stream: async ({request}) => { + if (request === 1) { + return stream; + } else { + return signal({value: 0}); + } + }, + injector: TestBed.inject(Injector), + }); + await appRef.whenStable(); + + stream.set({value: 1}); + expect(res.value()).toBe(1); + + // Changing the request aborts the previous one. + request.set(2); + + // The previous set/error functions should no longer result in changes to the resource. + stream.set({value: 2}); + expect(res.value()).toBe(undefined); + stream.set({error: 'fail'}); + expect(res.value()).toBe(undefined); + }); + + it('should interrupt pending request if the same value is set', async () => { + const counter = signal(0); + const backend = new MockEchoBackend<{counter: number} | null>(); + const aborted: ({counter: number} | null)[] = []; + const echoResource = resource<{counter: number} | null, {counter: number} | null>({ + request: () => ({counter: counter()}), + loader: ({request, abortSignal}) => { + abortSignal.addEventListener('abort', () => backend.abort(request)); + return backend.fetch(request).catch((reason) => { + if (reason === 'aborted') { + aborted.push(request); + } + throw new Error(reason); + }); + }, + injector: TestBed.inject(Injector), + }); + + // Start the initial load. + TestBed.flushEffects(); + await Promise.resolve(); + expect(echoResource.status()).toBe(ResourceStatus.Loading); + expect(echoResource.value()).toBe(undefined); + expect(echoResource.error()).toBe(undefined); + expect(aborted).toEqual([]); + + // Interrupt by setting a value before the request has resolved. + echoResource.set(null); + TestBed.flushEffects(); + await backend.flush(); + expect(echoResource.status()).toBe(ResourceStatus.Local); + expect(echoResource.value()).toBe(null); + expect(echoResource.error()).toBe(undefined); + expect(aborted).toEqual([{counter: 0}]); + + // Reload the resource to trigger another request. + echoResource.reload(); + TestBed.flushEffects(); + await Promise.resolve(); + expect(echoResource.status()).toBe(ResourceStatus.Reloading); + expect(echoResource.value()).toBe(null); + expect(echoResource.error()).toBe(undefined); + expect(aborted).toEqual([{counter: 0}]); + + // Interrupt the reload with the same value as before. + echoResource.set(null); + await backend.flush(); + expect(echoResource.status()).toBe(ResourceStatus.Local); + expect(echoResource.value()).toBe(null); + expect(echoResource.error()).toBe(undefined); + expect(aborted).toEqual([{counter: 0}, {counter: 0}]); + }); }); + +function flushMicrotasks(): Promise { + return new Promise((resolve) => setTimeout(resolve, 0)); +} diff --git a/packages/core/test/signals/computed_spec.ts b/packages/core/test/signals/computed_spec.ts index e6a947f2a3c6..24243bb9d154 100644 --- a/packages/core/test/signals/computed_spec.ts +++ b/packages/core/test/signals/computed_spec.ts @@ -7,7 +7,7 @@ */ import {computed, signal} from '@angular/core'; -import {createWatch, ReactiveNode, SIGNAL} from '@angular/core/primitives/signals'; +import {createWatch, ReactiveNode, SIGNAL, defaultEquals} from '@angular/core/primitives/signals'; describe('computed', () => { it('should create computed', () => { @@ -201,4 +201,120 @@ describe('computed', () => { ] as ReactiveNode; expect(node.debugName).toBe('computedSignal'); }); + + describe('with custom equal', () => { + it('should cache exceptions thrown by equal', () => { + const s = signal(0); + + let computedRunCount = 0; + let equalRunCount = 0; + const c = computed( + () => { + computedRunCount++; + return s(); + }, + { + equal: () => { + equalRunCount++; + throw new Error('equal'); + }, + }, + ); + + // equal() isn't run for the initial computation. + expect(c()).toBe(0); + expect(computedRunCount).toBe(1); + expect(equalRunCount).toBe(0); + + s.set(1); + + // Error is thrown by equal(). + expect(() => c()).toThrowError('equal'); + expect(computedRunCount).toBe(2); + expect(equalRunCount).toBe(1); + + // Error is cached; c throws again without needing to rerun computation or equal(). + expect(() => c()).toThrowError('equal'); + expect(computedRunCount).toBe(2); + expect(equalRunCount).toBe(1); + }); + + it('should not track signal reads inside equal', () => { + const value = signal(1); + const epsilon = signal(0.5); + + let innerRunCount = 0; + let equalRunCount = 0; + const inner = computed( + () => { + innerRunCount++; + return value(); + }, + { + equal: (a, b) => { + equalRunCount++; + return Math.abs(a - b) < epsilon(); + }, + }, + ); + + let outerRunCount = 0; + const outer = computed(() => { + outerRunCount++; + return inner(); + }); + + // Everything runs the first time. + expect(outer()).toBe(1); + expect(innerRunCount).toBe(1); + expect(outerRunCount).toBe(1); + + // Difference is less than epsilon(). + value.set(1.2); + + // `inner` reruns because `value` was changed, and `equal` is called for the first time. + expect(outer()).toBe(1); + expect(innerRunCount).toBe(2); + expect(equalRunCount).toBe(1); + // `outer does not rerun because `equal` determined that `inner` had not changed. + expect(outerRunCount).toBe(1); + + // Previous difference is now greater than epsilon(). + epsilon.set(0.1); + + // While changing `epsilon` would change the outcome of the `inner`, we don't rerun it + // because we intentionally don't track reactive reads in `equal`. + expect(outer()).toBe(1); + expect(innerRunCount).toBe(2); + expect(equalRunCount).toBe(1); + // Equally important is that the signal read in `equal` doesn't leak into the outer reactive + // context either. + expect(outerRunCount).toBe(1); + }); + + it('should recover from exception', () => { + let shouldThrow = true; + const source = signal(0); + const derived = computed(source, { + equal: (a, b) => { + if (shouldThrow) { + throw new Error('equal'); + } + return defaultEquals(a, b); + }, + }); + + // Initial read doesn't throw because it doesn't call `equal`. + expect(derived()).toBe(0); + + // Update `source` to begin throwing. + source.set(1); + expect(() => derived()).toThrowError('equal'); + + // Stop throwing and update `source` to cause `derived` to recompute. + shouldThrow = false; + source.set(2); + expect(derived()).toBe(2); + }); + }); }); diff --git a/packages/core/test/signals/linked_signal_spec.ts b/packages/core/test/signals/linked_signal_spec.ts index 89600005d44f..0fe145ca05f5 100644 --- a/packages/core/test/signals/linked_signal_spec.ts +++ b/packages/core/test/signals/linked_signal_spec.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {isSignal, linkedSignal, signal, computed} from '@angular/core'; @@ -147,6 +147,35 @@ describe('linkedSignal', () => { expect(choice()).toBe(0); }); + it('should not recompute downstream dependencies when computed value is equal to the currently set value', () => { + const source = signal(0); + const isEven = linkedSignal(() => source() % 2 === 0); + + let updateCounter = 0; + const updateTracker = computed(() => { + isEven(); + return updateCounter++; + }); + + updateTracker(); + expect(updateCounter).toEqual(1); + expect(isEven()).toBeTrue(); + + isEven.set(false); + updateTracker(); + expect(updateCounter).toEqual(2); + + // Setting the source signal such that the linked value is the same + source.set(1); + updateTracker(); + // downstream dependency should _not_ be recomputed + expect(updateCounter).toEqual(2); + + source.set(4); + updateTracker(); + expect(updateCounter).toEqual(3); + }); + it('should support shorthand version', () => { const options = signal(['apple', 'banana', 'fig']); const choice = linkedSignal(() => options()[0]); diff --git a/packages/core/testing/BUILD.bazel b/packages/core/testing/BUILD.bazel index 3be96e7e52ba..5366d7e6fd1c 100644 --- a/packages/core/testing/BUILD.bazel +++ b/packages/core/testing/BUILD.bazel @@ -13,6 +13,7 @@ ng_module( "//packages:types", "//packages/compiler", "//packages/core", + "//packages/core/primitives/dom-navigation/testing", "//packages/localize", "//packages/zone.js/lib:zone_d_ts", "@npm//@types/jasmine", diff --git a/packages/core/testing/public_api.ts b/packages/core/testing/public_api.ts index 7dfefb9c2203..2efde47bb3ad 100644 --- a/packages/core/testing/public_api.ts +++ b/packages/core/testing/public_api.ts @@ -14,5 +14,6 @@ * Entry point for all public APIs of this package. */ export * from './src/testing'; +export * from './src/testing_private_export'; // This file only reexports content of the `src` folder. Keep it that way. diff --git a/packages/core/testing/src/testing_private_export.ts b/packages/core/testing/src/testing_private_export.ts new file mode 100644 index 000000000000..5a34ee894f70 --- /dev/null +++ b/packages/core/testing/src/testing_private_export.ts @@ -0,0 +1,9 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +export {FakeNavigation as ɵFakeNavigation} from '../../primitives/dom-navigation/testing'; diff --git a/packages/elements/src/create-custom-element.ts b/packages/elements/src/create-custom-element.ts index 4d1864f2b2a6..17dfd2a2722d 100644 --- a/packages/elements/src/create-custom-element.ts +++ b/packages/elements/src/create-custom-element.ts @@ -156,13 +156,13 @@ export function createCustomElement

    ( // Re-apply pre-existing input values (set as properties on the element) through the // strategy. // TODO(alxhub): why are we doing this? this makes no sense. - inputs.forEach(({propName, transform, isSignal}) => { - if (!this.hasOwnProperty(propName) || isSignal) { - // No pre-existing value for `propName`, or a signal input. + inputs.forEach(({propName, transform}) => { + if (!this.hasOwnProperty(propName)) { + // No pre-existing value for `propName`. return; } - // Delete the property from the instance and re-apply it through the strategy. + // Delete the property from the DOM node and re-apply it through the strategy. const value = (this as any)[propName]; delete (this as any)[propName]; strategy.setInputValue(propName, value, transform); diff --git a/packages/elements/test/create-custom-element_spec.ts b/packages/elements/test/create-custom-element_spec.ts index 3bcd7f2af3f2..d292579b62a6 100644 --- a/packages/elements/test/create-custom-element_spec.ts +++ b/packages/elements/test/create-custom-element_spec.ts @@ -12,6 +12,7 @@ import { DoBootstrap, EventEmitter, Injector, + input, Input, NgModule, Output, @@ -31,6 +32,7 @@ interface WithFooBar { fooFoo: string; barBar: string; fooTransformed: unknown; + fooSignal: string | null; } describe('createCustomElement', () => { @@ -66,7 +68,12 @@ describe('createCustomElement', () => { }); it('should use a default strategy for converting component inputs', () => { - expect(NgElementCtor.observedAttributes).toEqual(['foo-foo', 'barbar', 'foo-transformed']); + expect(NgElementCtor.observedAttributes).toEqual([ + 'foo-foo', + 'barbar', + 'foo-transformed', + 'foo-signal', + ]); }); it('should send input values from attributes when connected', () => { @@ -74,12 +81,14 @@ describe('createCustomElement', () => { element.setAttribute('foo-foo', 'value-foo-foo'); element.setAttribute('barbar', 'value-barbar'); element.setAttribute('foo-transformed', 'truthy'); + element.setAttribute('foo-signal', 'value-signal'); element.connectedCallback(); expect(strategy.connectedElement).toBe(element); expect(strategy.getInputValue('fooFoo')).toBe('value-foo-foo'); expect(strategy.getInputValue('barBar')).toBe('value-barbar'); expect(strategy.getInputValue('fooTransformed')).toBe(true); + expect(strategy.getInputValue('fooSignal')).toBe('value-signal'); }); it('should work even if the constructor is not called (due to polyfill)', () => { @@ -95,12 +104,14 @@ describe('createCustomElement', () => { element.setAttribute('foo-foo', 'value-foo-foo'); element.setAttribute('barbar', 'value-barbar'); element.setAttribute('foo-transformed', 'truthy'); + element.setAttribute('foo-signal', 'value-signal'); element.connectedCallback(); expect(strategy.connectedElement).toBe(element); expect(strategy.getInputValue('fooFoo')).toBe('value-foo-foo'); expect(strategy.getInputValue('barBar')).toBe('value-barbar'); expect(strategy.getInputValue('fooTransformed')).toBe(true); + expect(strategy.getInputValue('fooSignal')).toBe('value-signal'); }); it('should listen to output events after connected', () => { @@ -174,10 +185,12 @@ describe('createCustomElement', () => { element.fooFoo = 'foo-foo-value'; element.barBar = 'barBar-value'; element.fooTransformed = 'truthy'; + element.fooSignal = 'value-signal'; expect(strategy.inputs.get('fooFoo')).toBe('foo-foo-value'); expect(strategy.inputs.get('barBar')).toBe('barBar-value'); expect(strategy.inputs.get('fooTransformed')).toBe(true); + expect(strategy.inputs.get('fooSignal')).toBe('value-signal'); }); it('should properly handle getting/setting properties on the element even if the constructor is not called', () => { @@ -191,10 +204,12 @@ describe('createCustomElement', () => { element.fooFoo = 'foo-foo-value'; element.barBar = 'barBar-value'; element.fooTransformed = 'truthy'; + element.fooSignal = 'value-signal'; expect(strategy.inputs.get('fooFoo')).toBe('foo-foo-value'); expect(strategy.inputs.get('barBar')).toBe('barBar-value'); expect(strategy.inputs.get('fooTransformed')).toBe(true); + expect(strategy.inputs.get('fooSignal')).toBe('value-signal'); }); it('should capture properties set before upgrading the element', () => { @@ -204,10 +219,12 @@ describe('createCustomElement', () => { fooFoo: 'foo-prop-value', barBar: 'bar-prop-value', fooTransformed: 'truthy' as unknown, + fooSignal: 'value-signal', }); expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-prop-value'); expect(element.fooTransformed).toBe('truthy'); + expect(element.fooSignal).toBe('value-signal'); // Upgrade the element to a Custom Element and insert it into the DOM. customElements.define(selector, ElementCtor); @@ -215,10 +232,12 @@ describe('createCustomElement', () => { expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-prop-value'); expect(element.fooTransformed).toBe(true); + expect(element.fooSignal).toBe('value-signal'); expect(strategy.inputs.get('fooFoo')).toBe('foo-prop-value'); expect(strategy.inputs.get('barBar')).toBe('bar-prop-value'); expect(strategy.inputs.get('fooTransformed')).toBe(true); + expect(strategy.inputs.get('fooSignal')).toBe('value-signal'); }); it('should capture properties set after upgrading the element but before inserting it into the DOM', () => { @@ -228,10 +247,12 @@ describe('createCustomElement', () => { fooFoo: 'foo-prop-value', barBar: 'bar-prop-value', fooTransformed: 'truthy' as unknown, + fooSignal: 'value-signal', }); expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-prop-value'); expect(element.fooTransformed).toBe('truthy'); + expect(element.fooSignal).toBe('value-signal'); // Upgrade the element to a Custom Element (without inserting it into the DOM) and update a // property. @@ -239,19 +260,23 @@ describe('createCustomElement', () => { customElements.upgrade(element); element.barBar = 'bar-prop-value-2'; element.fooTransformed = ''; + element.fooSignal = 'value-signal-changed'; expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-prop-value-2'); expect(element.fooTransformed).toBe(''); + expect(element.fooSignal).toBe('value-signal-changed'); // Insert the element into the DOM. testContainer.appendChild(element); expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-prop-value-2'); expect(element.fooTransformed).toBe(false); + expect(element.fooSignal).toBe('value-signal-changed'); expect(strategy.inputs.get('fooFoo')).toBe('foo-prop-value'); expect(strategy.inputs.get('barBar')).toBe('bar-prop-value-2'); expect(strategy.inputs.get('fooTransformed')).toBe(false); + expect(strategy.inputs.get('fooSignal')).toBe('value-signal-changed'); }); it('should allow overwriting properties with attributes after upgrading the element but before inserting it into the DOM', () => { @@ -261,10 +286,12 @@ describe('createCustomElement', () => { fooFoo: 'foo-prop-value', barBar: 'bar-prop-value', fooTransformed: 'truthy' as unknown, + fooSignal: 'value-signal', }); expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-prop-value'); expect(element.fooTransformed).toBe('truthy'); + expect(element.fooSignal).toBe('value-signal'); // Upgrade the element to a Custom Element (without inserting it into the DOM) and set an // attribute. @@ -275,16 +302,19 @@ describe('createCustomElement', () => { expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-attr-value'); expect(element.fooTransformed).toBe(false); + expect(element.fooSignal).toBe('value-signal'); // Insert the element into the DOM. testContainer.appendChild(element); expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-attr-value'); expect(element.fooTransformed).toBe(false); + expect(element.fooSignal).toBe('value-signal'); expect(strategy.inputs.get('fooFoo')).toBe('foo-prop-value'); expect(strategy.inputs.get('barBar')).toBe('bar-attr-value'); expect(strategy.inputs.get('fooTransformed')).toBe(false); + expect(strategy.inputs.get('fooSignal')).toBe('value-signal'); }); // Helpers @@ -313,6 +343,10 @@ describe('createCustomElement', () => { @Input('barbar') barBar!: string; @Input({transform: (value: unknown) => !!value}) fooTransformed!: boolean; + // This needs to apply the decorator and pass `isSignal`, because + // the compiler transform doesn't run against JIT tests. + @Input({isSignal: true} as Input) fooSignal = input(null); + @Output() bazBaz = new EventEmitter(); @Output('quxqux') quxQux = new EventEmitter(); } diff --git a/packages/forms/src/directives/abstract_control_directive.ts b/packages/forms/src/directives/abstract_control_directive.ts index 120d33bae05b..fe0911ec3441 100644 --- a/packages/forms/src/directives/abstract_control_directive.ts +++ b/packages/forms/src/directives/abstract_control_directive.ts @@ -278,7 +278,7 @@ export abstract class AbstractControlDirective { * @usageNotes * For example, for the following `FormGroup`: * - * ``` + * ```ts * form = new FormGroup({ * address: new FormGroup({ street: new FormControl() }) * }); @@ -312,7 +312,7 @@ export abstract class AbstractControlDirective { * @usageNotes * For example, for the following `FormGroup`: * - * ``` + * ```ts * form = new FormGroup({ * address: new FormGroup({ street: new FormControl() }) * }); diff --git a/packages/forms/src/directives/ng_model.ts b/packages/forms/src/directives/ng_model.ts index 1140157d917d..80d35eed254f 100644 --- a/packages/forms/src/directives/ng_model.ts +++ b/packages/forms/src/directives/ng_model.ts @@ -333,25 +333,12 @@ export class NgModel extends NgControl implements OnChanges, OnDestroy { } private _checkForErrors(): void { - if (!this._isStandalone()) { - this._checkParentType(); + if ((typeof ngDevMode === 'undefined' || ngDevMode) && !this._isStandalone()) { + checkParentType(this._parent); } this._checkName(); } - private _checkParentType(): void { - if (typeof ngDevMode === 'undefined' || ngDevMode) { - if ( - !(this._parent instanceof NgModelGroup) && - this._parent instanceof AbstractFormGroupDirective - ) { - throw formGroupNameException(); - } else if (!(this._parent instanceof NgModelGroup) && !(this._parent instanceof NgForm)) { - throw modelParentException(); - } - } - } - private _checkName(): void { if (this.options && this.options.name) this.name = this.options.name; @@ -387,3 +374,11 @@ export class NgModel extends NgControl implements OnChanges, OnDestroy { return this._parent ? controlPath(controlName, this._parent) : [controlName]; } } + +function checkParentType(parent: ControlContainer | null) { + if (!(parent instanceof NgModelGroup) && parent instanceof AbstractFormGroupDirective) { + throw formGroupNameException(); + } else if (!(parent instanceof NgModelGroup) && !(parent instanceof NgForm)) { + throw modelParentException(); + } +} diff --git a/packages/forms/src/directives/reactive_directives/form_control_name.ts b/packages/forms/src/directives/reactive_directives/form_control_name.ts index 45874e94cd1f..aa0601255ecf 100644 --- a/packages/forms/src/directives/reactive_directives/form_control_name.ts +++ b/packages/forms/src/directives/reactive_directives/form_control_name.ts @@ -213,26 +213,23 @@ export class FormControlName extends NgControl implements OnChanges, OnDestroy { return this._parent ? this._parent.formDirective : null; } - private _checkParentType(): void { + private _setUpControl() { if (typeof ngDevMode === 'undefined' || ngDevMode) { - if ( - !(this._parent instanceof FormGroupName) && - this._parent instanceof AbstractFormGroupDirective - ) { - throw ngModelGroupException(); - } else if ( - !(this._parent instanceof FormGroupName) && - !(this._parent instanceof FormGroupDirective) && - !(this._parent instanceof FormArrayName) - ) { - throw controlParentException(this.name); - } + checkParentType(this._parent, this.name); } - } - - private _setUpControl() { - this._checkParentType(); (this as Writable).control = this.formDirective.addControl(this); this._added = true; } } + +function checkParentType(parent: ControlContainer | null, name: string | number | null) { + if (!(parent instanceof FormGroupName) && parent instanceof AbstractFormGroupDirective) { + throw ngModelGroupException(); + } else if ( + !(parent instanceof FormGroupName) && + !(parent instanceof FormGroupDirective) && + !(parent instanceof FormArrayName) + ) { + throw controlParentException(name); + } +} diff --git a/packages/forms/src/directives/reactive_directives/form_group_directive.ts b/packages/forms/src/directives/reactive_directives/form_group_directive.ts index 5143f0659e35..02955eee3dcb 100644 --- a/packages/forms/src/directives/reactive_directives/form_group_directive.ts +++ b/packages/forms/src/directives/reactive_directives/form_group_directive.ts @@ -149,7 +149,10 @@ export class FormGroupDirective extends ControlContainer implements Form, OnChan /** @nodoc */ ngOnChanges(changes: SimpleChanges): void { - this._checkFormPresent(); + if ((typeof ngDevMode === 'undefined' || ngDevMode) && !this.form) { + throw missingFormException(); + } + if (changes.hasOwnProperty('form')) { this._updateValidators(); this._updateDomValue(); @@ -405,10 +408,4 @@ export class FormGroupDirective extends ControlContainer implements Form, OnChan cleanUpValidators(this._oldForm, this); } } - - private _checkFormPresent() { - if (!this.form && (typeof ngDevMode === 'undefined' || ngDevMode)) { - throw missingFormException(); - } - } } diff --git a/packages/forms/src/directives/reactive_directives/form_group_name.ts b/packages/forms/src/directives/reactive_directives/form_group_name.ts index 35deb9d18f60..304f308ba37c 100644 --- a/packages/forms/src/directives/reactive_directives/form_group_name.ts +++ b/packages/forms/src/directives/reactive_directives/form_group_name.ts @@ -115,7 +115,7 @@ export class FormGroupName extends AbstractFormGroupDirective implements OnInit, /** @internal */ override _checkParentType(): void { - if (_hasInvalidParent(this._parent) && (typeof ngDevMode === 'undefined' || ngDevMode)) { + if (hasInvalidParent(this._parent) && (typeof ngDevMode === 'undefined' || ngDevMode)) { throw groupParentException(); } } @@ -190,7 +190,9 @@ export class FormArrayName extends ControlContainer implements OnInit, OnDestroy * @nodoc */ ngOnInit(): void { - this._checkParentType(); + if (hasInvalidParent(this._parent) && (typeof ngDevMode === 'undefined' || ngDevMode)) { + throw arrayParentException(); + } this.formDirective!.addFormArray(this); } @@ -199,9 +201,7 @@ export class FormArrayName extends ControlContainer implements OnInit, OnDestroy * @nodoc */ ngOnDestroy(): void { - if (this.formDirective) { - this.formDirective.removeFormArray(this); - } + this.formDirective?.removeFormArray(this); } /** @@ -228,15 +228,9 @@ export class FormArrayName extends ControlContainer implements OnInit, OnDestroy override get path(): string[] { return controlPath(this.name == null ? this.name : this.name.toString(), this._parent); } - - private _checkParentType(): void { - if (_hasInvalidParent(this._parent) && (typeof ngDevMode === 'undefined' || ngDevMode)) { - throw arrayParentException(); - } - } } -function _hasInvalidParent(parent: ControlContainer): boolean { +function hasInvalidParent(parent: ControlContainer): boolean { return ( !(parent instanceof FormGroupName) && !(parent instanceof FormGroupDirective) && diff --git a/packages/forms/src/directives/shared.ts b/packages/forms/src/directives/shared.ts index 6e92de01a575..587ac4f07215 100644 --- a/packages/forms/src/directives/shared.ts +++ b/packages/forms/src/directives/shared.ts @@ -31,10 +31,13 @@ import {AsyncValidatorFn, Validator, ValidatorFn} from './validators'; * * @see {@link FormsModule#withconfig} */ -export const CALL_SET_DISABLED_STATE = new InjectionToken('CallSetDisabledState', { - providedIn: 'root', - factory: () => setDisabledStateDefault, -}); +export const CALL_SET_DISABLED_STATE = new InjectionToken( + typeof ngDevMode === 'undefined' || ngDevMode ? 'CallSetDisabledState' : '', + { + providedIn: 'root', + factory: () => setDisabledStateDefault, + }, +); /** * The type for CALL_SET_DISABLED_STATE. If `always`, then ControlValueAccessor will always call diff --git a/packages/forms/src/model/abstract_model.ts b/packages/forms/src/model/abstract_model.ts index c7d4360c133b..71521f5fa052 100644 --- a/packages/forms/src/model/abstract_model.ts +++ b/packages/forms/src/model/abstract_model.ts @@ -759,8 +759,6 @@ export abstract class AbstractControl; @@ -770,8 +768,6 @@ export abstract class AbstractControl; @@ -1430,7 +1426,7 @@ export abstract class AbstractControl).valueChanges = new EventEmitter(); (this as Writable).statusChanges = new EventEmitter(); } diff --git a/packages/forms/src/model/form_array.ts b/packages/forms/src/model/form_array.ts index ab7bc8f7b9eb..52f89a8c00a2 100644 --- a/packages/forms/src/model/form_array.ts +++ b/packages/forms/src/model/form_array.ts @@ -273,7 +273,7 @@ export class FormArray = any> extends Abst * @usageNotes * ### Set the values for the controls in the form array * - * ``` + * ```ts * const arr = new FormArray([ * new FormControl(), * new FormControl() @@ -322,7 +322,7 @@ export class FormArray = any> extends Abst * @usageNotes * ### Patch the values for controls in a form array * - * ``` + * ```ts * const arr = new FormArray([ * new FormControl(), * new FormControl() @@ -388,7 +388,7 @@ export class FormArray = any> extends Abst * * ### Reset the values in a form array and the disabled status for the first control * - * ``` + * ```ts * arr.reset([ * {value: 'name', disabled: true}, * 'last' diff --git a/packages/forms/src/model/form_group.ts b/packages/forms/src/model/form_group.ts index ab4d126857ed..2d6e1885c42f 100644 --- a/packages/forms/src/model/form_group.ts +++ b/packages/forms/src/model/form_group.ts @@ -381,7 +381,7 @@ export class FormGroup< * @usageNotes * ### Set the complete value for the form group * - * ``` + * ```ts * const form = new FormGroup({ * first: new FormControl(), * last: new FormControl() @@ -437,7 +437,7 @@ export class FormGroup< * @usageNotes * ### Patch the value for a form group * - * ``` + * ```ts * const form = new FormGroup({ * first: new FormControl(), * last: new FormControl() @@ -528,7 +528,7 @@ export class FormGroup< * * ### Reset the form group values and disabled status * - * ``` + * ```ts * const form = new FormGroup({ * first: new FormControl('first name'), * last: new FormControl('last name') @@ -769,7 +769,7 @@ export interface FormRecord { * See `FormGroup#setValue` for additional information. */ setValue( - value: {[key: string]: ɵValue}, + value: {[key: string]: ɵRawValue}, options?: { onlySelf?: boolean; emitEvent?: boolean; diff --git a/packages/forms/src/validators.ts b/packages/forms/src/validators.ts index 02972fb71d8f..18dc22a86176 100644 --- a/packages/forms/src/validators.ts +++ b/packages/forms/src/validators.ts @@ -25,20 +25,27 @@ import type { import {RuntimeErrorCode} from './errors'; import type {AbstractControl} from './model/abstract_model'; -function isEmptyInputValue(value: any): boolean { - /** - * Check if the object is a string or array before evaluating the length attribute. - * This avoids falsely rejecting objects that contain a custom length attribute. - * For example, the object {id: 1, length: 0, width: 0} should not be returned as empty. - */ - return ( - value == null || ((typeof value === 'string' || Array.isArray(value)) && value.length === 0) - ); +function isEmptyInputValue(value: unknown): boolean { + return value == null || lengthOrSize(value) === 0; } -function hasValidLength(value: any): boolean { +/** + * Extract the length property in case it's an array or a string. + * Extract the size property in case it's a set. + * Return null else. + * @param value Either an array, set or undefined. + */ +function lengthOrSize(value: unknown): number | null { // non-strict comparison is intentional, to check for both `null` and `undefined` values - return value != null && typeof value.length === 'number'; + if (value == null) { + return null; + } else if (Array.isArray(value) || typeof value === 'string') { + return value.length; + } else if (value instanceof Set) { + return value.size; + } + + return null; } /** @@ -290,13 +297,14 @@ export class Validators { /** * @description - * Validator that requires the length of the control's value to be greater than or equal - * to the provided minimum length. This validator is also provided by default if you use the + * Validator that requires the number of items in the control's value to be greater than or equal + * to the provided minimum length. This validator is also provided by default if you use * the HTML5 `minlength` attribute. Note that the `minLength` validator is intended to be used - * only for types that have a numeric `length` property, such as strings or arrays. The - * `minLength` validator logic is also not invoked for values when their `length` property is 0 - * (for example in case of an empty string or an empty array), to support optional controls. You - * can use the standard `required` validator if empty values should not be considered valid. + * only for types that have a numeric `length` or `size` property, such as strings, arrays or + * sets. The `minLength` validator logic is also not invoked for values when their `length` or + * `size` property is 0 (for example in case of an empty string or an empty array), to support + * optional controls. You can use the standard `required` validator if empty values should not be + * considered valid. * * @usageNotes * @@ -324,10 +332,11 @@ export class Validators { /** * @description - * Validator that requires the length of the control's value to be less than or equal - * to the provided maximum length. This validator is also provided by default if you use the + * Validator that requires the number of items in the control's value to be less than or equal + * to the provided maximum length. This validator is also provided by default if you use * the HTML5 `maxlength` attribute. Note that the `maxLength` validator is intended to be used - * only for types that have a numeric `length` property, such as strings or arrays. + * only for types that have a numeric `length` or `size` property, such as strings, arrays or + * sets. * * @usageNotes * @@ -456,7 +465,7 @@ export class Validators { */ export function minValidator(min: number): ValidatorFn { return (control: AbstractControl): ValidationErrors | null => { - if (isEmptyInputValue(control.value) || isEmptyInputValue(min)) { + if (control.value == null || min == null) { return null; // don't validate empty values to allow optional controls } const value = parseFloat(control.value); @@ -472,7 +481,7 @@ export function minValidator(min: number): ValidatorFn { */ export function maxValidator(max: number): ValidatorFn { return (control: AbstractControl): ValidationErrors | null => { - if (isEmptyInputValue(control.value) || isEmptyInputValue(max)) { + if (control.value == null || max == null) { return null; // don't validate empty values to allow optional controls } const value = parseFloat(control.value); @@ -511,32 +520,41 @@ export function emailValidator(control: AbstractControl): ValidationErrors | nul } /** - * Validator that requires the length of the control's value to be greater than or equal + * Validator that requires the number of items in the control's value to be greater than or equal * to the provided minimum length. See `Validators.minLength` for additional information. + * + * The minLengthValidator respects every length property in an object, regardless of whether it's an array. + * For example, the object {id: 1, length: 0, width: 0} should be validated. */ export function minLengthValidator(minLength: number): ValidatorFn { return (control: AbstractControl): ValidationErrors | null => { - if (isEmptyInputValue(control.value) || !hasValidLength(control.value)) { + const length = control.value?.length ?? lengthOrSize(control.value); + if (length === null || length === 0) { // don't validate empty values to allow optional controls - // don't validate values without `length` property + // don't validate values without `length` or `size` property return null; } - return control.value.length < minLength - ? {'minlength': {'requiredLength': minLength, 'actualLength': control.value.length}} + return length < minLength + ? {'minlength': {'requiredLength': minLength, 'actualLength': length}} : null; }; } /** - * Validator that requires the length of the control's value to be less than or equal + * Validator that requires the number of items in the control's value to be less than or equal * to the provided maximum length. See `Validators.maxLength` for additional information. + * + * The maxLengthValidator respects every length property in an object, regardless of whether it's an array. + * For example, the object {id: 1, length: 0, width: 0} should be validated. */ export function maxLengthValidator(maxLength: number): ValidatorFn { return (control: AbstractControl): ValidationErrors | null => { - return hasValidLength(control.value) && control.value.length > maxLength - ? {'maxlength': {'requiredLength': maxLength, 'actualLength': control.value.length}} - : null; + const length = control.value?.length ?? lengthOrSize(control.value); + if (length !== null && length > maxLength) { + return {'maxlength': {'requiredLength': maxLength, 'actualLength': length}}; + } + return null; }; } diff --git a/packages/forms/test/typed_integration_spec.ts b/packages/forms/test/typed_integration_spec.ts index c66f220a8412..fc515b4cb493 100644 --- a/packages/forms/test/typed_integration_spec.ts +++ b/packages/forms/test/typed_integration_spec.ts @@ -9,6 +9,7 @@ // These tests mainly check the types of strongly typed form controls, which is generally enforced // at compile time. +import {ɵRawValue} from '@angular/forms'; import {FormBuilder, NonNullableFormBuilder, UntypedFormBuilder} from '../src/form_builder'; import { AbstractControl, @@ -728,6 +729,44 @@ describe('Typed Class', () => { c.reset({c: 42, d: 0}); c.removeControl('c'); }); + + it('should only accept non-partial values', () => { + const fr = new FormRecord; bar: FormControl}>>({ + group1: new FormGroup({ + foo: new FormControl(42, {nonNullable: true}), + bar: new FormControl(42, {nonNullable: true}), + }), + }); + + type ValueParam = Parameters[0]; + + // This should error if the typing allows partial values + const value: ValueParam = { + // @ts-expect-error + group1: { + foo: 42, + // bar value is missing + }, + }; + + type RecordRawValue = ɵRawValue; + const rawValue: RecordRawValue = { + // @ts-expect-error + group1: { + foo: 42, + // bar value is missing + }, + }; + + expect(() => + fr.setValue({ + // @ts-expect-error + group1: { + foo: 42, + }, + }), + ).toThrowError(/NG01002: Must supply a value for form control/); + }); }); describe('FormArray', () => { diff --git a/packages/forms/test/validators_spec.ts b/packages/forms/test/validators_spec.ts index 0a6519c7e95f..572378dddd49 100644 --- a/packages/forms/test/validators_spec.ts +++ b/packages/forms/test/validators_spec.ts @@ -209,6 +209,18 @@ import {normalizeValidators} from '../src/validators'; it('should not error on an object containing a length attribute that is zero', () => { expect(Validators.required(new FormControl({id: 1, length: 0, width: 0}))).toBeNull(); }); + + it('should error on an empty set', () => { + expect(Validators.required(new FormControl(new Set()))).toEqual({'required': true}); + }); + + it('should not error on a non-empty set', () => { + expect(Validators.required(new FormControl(new Set([1, 2])))).toBeNull(); + }); + + it('should not error on an object containing a size attribute that is zero', () => { + expect(Validators.required(new FormControl({id: 1, size: 0, width: 0}))).toBeNull(); + }); }); describe('requiredTrue', () => { @@ -246,6 +258,10 @@ import {normalizeValidators} from '../src/validators'; expect(Validators.minLength(2)(new FormControl(undefined))).toBeNull(); }); + it('should not error on empty array', () => { + expect(Validators.minLength(2)(new FormControl([]))).toBeNull(); + }); + it('should not error on valid strings', () => { expect(Validators.minLength(2)(new FormControl('aa'))).toBeNull(); }); @@ -287,6 +303,24 @@ import {normalizeValidators} from '../src/validators'; expect(Validators.minLength(1)(new FormControl(true))).toBeNull(); expect(Validators.minLength(1)(new FormControl(false))).toBeNull(); }); + + it('should trigger validation for an object that contains numeric size property', () => { + const value = new Set([1, 2, 3, 4, 5]); + expect(Validators.minLength(1)(new FormControl(value))).toBeNull(); + expect(Validators.minLength(10)(new FormControl(value))).toEqual({ + 'minlength': {'requiredLength': 10, 'actualLength': 5}, + }); + }); + + it('should not error on empty set', () => { + const value = new Set(); + expect(Validators.minLength(1)(new FormControl(value))).toBeNull(); + }); + + it('should return null when passing a boolean', () => { + expect(Validators.minLength(1)(new FormControl(true))).toBeNull(); + expect(Validators.minLength(1)(new FormControl(false))).toBeNull(); + }); }); describe('maxLength', () => { @@ -339,6 +373,22 @@ import {normalizeValidators} from '../src/validators'; }); }); + it('should trigger validation for an object that contains numeric length property', () => { + const value = {length: 5, someValue: [1, 2, 3, 4, 5]}; + expect(Validators.maxLength(10)(new FormControl(value))).toBeNull(); + expect(Validators.maxLength(1)(new FormControl(value))).toEqual({ + 'maxlength': {'requiredLength': 1, 'actualLength': 5}, + }); + }); + + it('should trigger validation for an object that contains numeric size property', () => { + const value = new Set([1, 2, 3, 4, 5]); + expect(Validators.maxLength(10)(new FormControl(value))).toBeNull(); + expect(Validators.maxLength(1)(new FormControl(value))).toEqual({ + 'maxlength': {'requiredLength': 1, 'actualLength': 5}, + }); + }); + it('should return null when passing a boolean', () => { expect(Validators.maxLength(1)(new FormControl(true))).toBeNull(); expect(Validators.maxLength(1)(new FormControl(false))).toBeNull(); diff --git a/packages/language-service/src/references_and_rename_utils.ts b/packages/language-service/src/references_and_rename_utils.ts index f41df95b16fb..9a35eaa89810 100644 --- a/packages/language-service/src/references_and_rename_utils.ts +++ b/packages/language-service/src/references_and_rename_utils.ts @@ -16,6 +16,7 @@ import { TmplAstBoundEvent, TmplAstLetDeclaration, TmplAstNode, + TmplAstElement, TmplAstReference, TmplAstTextAttribute, TmplAstVariable, @@ -341,9 +342,7 @@ export function getRenameTextAndSpanAtPosition( } else if (node.valueSpan && isWithin(position, node.valueSpan)) { return {text: node.valueSpan.toString(), span: toTextSpan(node.valueSpan)}; } - } - - if ( + } else if ( node instanceof PropertyRead || node instanceof PropertyWrite || node instanceof SafePropertyRead || @@ -359,6 +358,8 @@ export function getRenameTextAndSpanAtPosition( span.length -= 2; } return {text, span}; + } else if (node instanceof TmplAstElement) { + return {text: node.name, span: toTextSpan(node.startSourceSpan)}; } return null; diff --git a/packages/language-service/test/quick_info_spec.ts b/packages/language-service/test/quick_info_spec.ts index 9841537e4d02..c2fbc13a387c 100644 --- a/packages/language-service/test/quick_info_spec.ts +++ b/packages/language-service/test/quick_info_spec.ts @@ -402,6 +402,14 @@ describe('quick info', () => { expectedDisplayString: '(property) name: "name"', }); }); + + it('should work for template literal interpolations', () => { + expectQuickInfo({ + templateOverride: `
    {{\`Hello \${na¦me}\`}}
    `, + expectedSpanText: 'name', + expectedDisplayString: '(variable) name: { readonly name: "name"; }', + }); + }); }); describe('pipes', () => { diff --git a/packages/language-service/test/references_and_rename_spec.ts b/packages/language-service/test/references_and_rename_spec.ts index a5d2ed0d95eb..cc6afef54b04 100644 --- a/packages/language-service/test/references_and_rename_spec.ts +++ b/packages/language-service/test/references_and_rename_spec.ts @@ -1814,6 +1814,14 @@ describe('find references and rename locations', () => { }); it('finds rename locations', () => { + env.expectNoSourceDiagnostics(); + const result = file.getRenameInfo() as ts.RenameInfoSuccess; + // Note that although we do not provide rename locations, we must _not_ respond with + // a result that indicates the item cannot be renamed when info is requested or we will prevent + // other rename providers from performing the rename. + expect(result.canRename).toBeTrue(); + expect(result.displayName).toEqual('my-comp'); + expect(result.kind).toEqual('component'); const renameLocations = getRenameLocationsAtPosition(file)!; expect(renameLocations).toBeUndefined(); // TODO(atscott): We may consider supporting rename of component selector in the future diff --git a/packages/localize/package.json b/packages/localize/package.json index 514ab7b16dec..06257a2169ac 100644 --- a/packages/localize/package.json +++ b/packages/localize/package.json @@ -33,7 +33,7 @@ "./fesm2022/init.mjs" ], "dependencies": { - "@babel/core": "7.26.0", + "@babel/core": "7.26.9", "@types/babel__core": "7.20.5", "fast-glob": "3.3.3", "yargs": "^17.2.1" diff --git a/packages/localize/src/localize/src/localize.ts b/packages/localize/src/localize/src/localize.ts index e862d91a7f90..117f17486ec6 100644 --- a/packages/localize/src/localize/src/localize.ts +++ b/packages/localize/src/localize/src/localize.ts @@ -28,7 +28,7 @@ export interface LocalizeFn { * * The compile-time translation inliner is able to replace the following code: * - * ``` + * ```ts * typeof $localize !== "undefined" && $localize.locale * ``` * diff --git a/packages/misc/angular-in-memory-web-api/README.md b/packages/misc/angular-in-memory-web-api/README.md index edfe65358595..67b22614514f 100644 --- a/packages/misc/angular-in-memory-web-api/README.md +++ b/packages/misc/angular-in-memory-web-api/README.md @@ -140,7 +140,7 @@ export class AppModule { ... } * Always import the `HttpClientInMemoryWebApiModule` _after_ the `HttpClientModule` to ensure that the in-memory backend provider supersedes the Angular version. -* You can setup the in-memory web api within a lazy loaded feature module by calling the `.forFeature` method as you would `.forRoot`. +* You can set up the in-memory web api within a lazy loaded feature module by calling the `.forFeature` method as you would `.forRoot`. * In production, you want HTTP requests to go to the real server and probably have no need for the _in-memory_ provider. CLI-based apps can exclude the provider in production builds like this: @@ -155,7 +155,7 @@ CLI-based apps can exclude the provider in production builds like this: # Examples The [tests](https://github.com/angular/angular/blob/main/packages/misc/angular-in-memory-web-api/test) -are a good place to learn how to setup and use this in-memory web api library. +are a good place to learn how to set up and use this in-memory web api library. See also the example source code in the official Angular.dev documentation such as the [HttpClient](https://angular.dev/guide/http) guide and the diff --git a/packages/platform-browser/animations/async/src/async_animation_renderer.ts b/packages/platform-browser/animations/async/src/async_animation_renderer.ts index 4045f29b71b2..c5d172513f8b 100644 --- a/packages/platform-browser/animations/async/src/async_animation_renderer.ts +++ b/packages/platform-browser/animations/async/src/async_animation_renderer.ts @@ -167,6 +167,16 @@ export class AsyncAnimationRendererFactory implements OnDestroy, RendererFactory whenRenderingDone?(): Promise { return this.delegate.whenRenderingDone?.() ?? Promise.resolve(); } + + /** + * Used during HMR to clear any cached data about a component. + * @param componentId ID of the component that is being replaced. + */ + protected componentReplaced(componentId: string) { + // Flush the engine since the renderer destruction waits for animations to be done. + this._engine?.flush(); + (this.delegate as {componentReplaced?: (id: string) => void}).componentReplaced?.(componentId); + } } /** diff --git a/packages/platform-browser/animations/async/src/providers.ts b/packages/platform-browser/animations/async/src/providers.ts index 12206af11866..6e0a20aa3cf3 100644 --- a/packages/platform-browser/animations/async/src/providers.ts +++ b/packages/platform-browser/animations/async/src/providers.ts @@ -14,7 +14,6 @@ import { NgZone, RendererFactory2, ɵperformanceMarkFeature as performanceMarkFeature, - InjectionToken, } from '@angular/core'; import {ɵDomRendererFactory2 as DomRendererFactory2} from '@angular/platform-browser'; @@ -51,6 +50,12 @@ export function provideAnimationsAsync( type: 'animations' | 'noop' = 'animations', ): EnvironmentProviders { performanceMarkFeature('NgAsyncAnimations'); + + // Animations don't work on the server so we switch them over to no-op automatically. + if (typeof ngServerMode !== 'undefined' && ngServerMode) { + type = 'noop'; + } + return makeEnvironmentProviders([ { provide: RendererFactory2, diff --git a/packages/platform-browser/animations/src/module.ts b/packages/platform-browser/animations/src/module.ts index 14d4a19a7a9c..9c514a6bcff3 100644 --- a/packages/platform-browser/animations/src/module.ts +++ b/packages/platform-browser/animations/src/module.ts @@ -46,7 +46,7 @@ export class BrowserAnimationsModule { * @usageNotes * When registering the `BrowserAnimationsModule`, you can use the `withConfig` * function as follows: - * ``` + * ```ts * @NgModule({ * imports: [BrowserAnimationsModule.withConfig(config)] * }) diff --git a/packages/platform-browser/animations/src/providers.ts b/packages/platform-browser/animations/src/providers.ts index f8797c332659..f311e965d285 100644 --- a/packages/platform-browser/animations/src/providers.ts +++ b/packages/platform-browser/animations/src/providers.ts @@ -71,20 +71,31 @@ const SHARED_ANIMATION_PROVIDERS: Provider[] = [ /** * Separate providers from the actual module so that we can do a local modification in Google3 to - * include them in the BrowserModule. + * include them in the BrowserTestingModule. */ -export const BROWSER_ANIMATIONS_PROVIDERS: Provider[] = [ - {provide: AnimationDriver, useFactory: () => new WebAnimationsDriver()}, - {provide: ANIMATION_MODULE_TYPE, useValue: 'BrowserAnimations'}, +export const BROWSER_NOOP_ANIMATIONS_PROVIDERS: Provider[] = [ + {provide: AnimationDriver, useClass: NoopAnimationDriver}, + {provide: ANIMATION_MODULE_TYPE, useValue: 'NoopAnimations'}, ...SHARED_ANIMATION_PROVIDERS, ]; /** * Separate providers from the actual module so that we can do a local modification in Google3 to - * include them in the BrowserTestingModule. + * include them in the BrowserModule. */ -export const BROWSER_NOOP_ANIMATIONS_PROVIDERS: Provider[] = [ - {provide: AnimationDriver, useClass: NoopAnimationDriver}, - {provide: ANIMATION_MODULE_TYPE, useValue: 'NoopAnimations'}, +export const BROWSER_ANIMATIONS_PROVIDERS: Provider[] = [ + // Note: the `ngServerMode` happen inside factories to give the variable time to initialize. + { + provide: AnimationDriver, + useFactory: () => + typeof ngServerMode !== 'undefined' && ngServerMode + ? new NoopAnimationDriver() + : new WebAnimationsDriver(), + }, + { + provide: ANIMATION_MODULE_TYPE, + useFactory: () => + typeof ngServerMode !== 'undefined' && ngServerMode ? 'NoopAnimations' : 'BrowserAnimations', + }, ...SHARED_ANIMATION_PROVIDERS, ]; diff --git a/packages/platform-browser/src/browser.ts b/packages/platform-browser/src/browser.ts index 5e489398e2bc..7e663ecb6bc5 100644 --- a/packages/platform-browser/src/browser.ts +++ b/packages/platform-browser/src/browser.ts @@ -13,25 +13,20 @@ import { ɵPLATFORM_BROWSER_ID as PLATFORM_BROWSER_ID, } from '@angular/common'; import { - APP_ID, ApplicationConfig as ApplicationConfigFromCore, ApplicationModule, ApplicationRef, createPlatformFactory, ErrorHandler, - Inject, InjectionToken, - ModuleWithProviders, NgModule, NgZone, - Optional, PLATFORM_ID, PLATFORM_INITIALIZER, platformCore, PlatformRef, Provider, RendererFactory2, - SkipSelf, StaticProvider, Testability, TestabilityRegistry, @@ -42,6 +37,7 @@ import { ɵsetDocument, ɵTESTABILITY as TESTABILITY, ɵTESTABILITY_GETTER as TESTABILITY_GETTER, + inject, } from '@angular/core'; import {BrowserDomAdapter} from './browser/browser_adapter'; @@ -237,7 +233,7 @@ const BROWSER_MODULE_PROVIDERS: Provider[] = [ provide: EVENT_MANAGER_PLUGINS, useClass: DomEventsPlugin, multi: true, - deps: [DOCUMENT, NgZone, PLATFORM_ID], + deps: [DOCUMENT], }, {provide: EVENT_MANAGER_PLUGINS, useClass: KeyEventsPlugin, multi: true, deps: [DOCUMENT]}, DomRendererFactory2, @@ -264,18 +260,20 @@ const BROWSER_MODULE_PROVIDERS: Provider[] = [ exports: [CommonModule, ApplicationModule], }) export class BrowserModule { - constructor( - @Optional() - @SkipSelf() - @Inject(BROWSER_MODULE_PROVIDERS_MARKER) - providersAlreadyPresent: boolean | null, - ) { - if ((typeof ngDevMode === 'undefined' || ngDevMode) && providersAlreadyPresent) { - throw new RuntimeError( - RuntimeErrorCode.BROWSER_MODULE_ALREADY_LOADED, - `Providers from the \`BrowserModule\` have already been loaded. If you need access ` + - `to common directives such as NgIf and NgFor, import the \`CommonModule\` instead.`, - ); + constructor() { + if (typeof ngDevMode === 'undefined' || ngDevMode) { + const providersAlreadyPresent = inject(BROWSER_MODULE_PROVIDERS_MARKER, { + optional: true, + skipSelf: true, + }); + + if (providersAlreadyPresent) { + throw new RuntimeError( + RuntimeErrorCode.BROWSER_MODULE_ALREADY_LOADED, + `Providers from the \`BrowserModule\` have already been loaded. If you need access ` + + `to common directives such as NgIf and NgFor, import the \`CommonModule\` instead.`, + ); + } } } } diff --git a/packages/platform-browser/src/browser/tools/common_tools.ts b/packages/platform-browser/src/browser/tools/common_tools.ts index bf3fc651f259..d9133c1a645e 100644 --- a/packages/platform-browser/src/browser/tools/common_tools.ts +++ b/packages/platform-browser/src/browser/tools/common_tools.ts @@ -39,7 +39,7 @@ export class AngularProfiler { * `record` (boolean) - causes the profiler to record a CPU profile while * it exercises the change detector. Example: * - * ``` + * ```ts * ng.profiler.timeChangeDetection({record: true}) * ``` */ diff --git a/packages/platform-browser/src/dom/dom_renderer.ts b/packages/platform-browser/src/dom/dom_renderer.ts index f0d1da86c95a..b116e87ee180 100644 --- a/packages/platform-browser/src/dom/dom_renderer.ts +++ b/packages/platform-browser/src/dom/dom_renderer.ts @@ -43,6 +43,8 @@ export const NAMESPACE_URIS: {[ns: string]: string} = { }; const COMPONENT_REGEX = /%COMP%/g; +const SOURCEMAP_URL_REGEXP = /\/\*#\s*sourceMappingURL=(.+?)\s*\*\//; +const PROTOCOL_REGEXP = /^https?:/; export const COMPONENT_VARIABLE = '%COMP%'; export const HOST_ATTR = `_nghost-${COMPONENT_VARIABLE}`; @@ -80,6 +82,52 @@ export function shimStylesContent(compId: string, styles: string[]): string[] { return styles.map((s) => s.replace(COMPONENT_REGEX, compId)); } +/** + * Prepends a baseHref to the `sourceMappingURL` within the provided CSS content. + * If the `sourceMappingURL` contains an inline (encoded) map, the function skips processing. + * + * @note For inline stylesheets, the `sourceMappingURL` is relative to the page's origin + * and not the provided baseHref. This function is needed as when accessing the page with a URL + * containing two or more segments. + * For example, if the baseHref is set to `/`, and you visit a URL like `http://localhost/foo/bar`, + * the map would be requested from `http://localhost/foo/bar/comp.css.map` instead of what you'd expect, + * which is `http://localhost/comp.css.map`. This behavior is corrected by modifying the `sourceMappingURL` + * to ensure external source maps are loaded relative to the baseHref. + * + + * @param baseHref - The base URL to prepend to the `sourceMappingURL`. + * @param styles - An array of CSS content strings, each potentially containing a `sourceMappingURL`. + * @returns The updated array of CSS content strings with modified `sourceMappingURL` values, + * or the original content if no modification is needed. + */ +export function addBaseHrefToCssSourceMap(baseHref: string, styles: string[]): string[] { + if (!baseHref) { + return styles; + } + + const absoluteBaseHrefUrl = new URL(baseHref, 'http://localhost'); + + return styles.map((cssContent) => { + if (!cssContent.includes('sourceMappingURL=')) { + return cssContent; + } + + return cssContent.replace(SOURCEMAP_URL_REGEXP, (_, sourceMapUrl) => { + if ( + sourceMapUrl[0] === '/' || + sourceMapUrl.startsWith('data:') || + PROTOCOL_REGEXP.test(sourceMapUrl) + ) { + return `/*# sourceMappingURL=${sourceMapUrl} */`; + } + + const {pathname: resolvedSourceMapUrl} = new URL(sourceMapUrl, absoluteBaseHrefUrl); + + return `/*# sourceMappingURL=${resolvedSourceMapUrl} */`; + }); + }); +} + @Injectable() export class DomRendererFactory2 implements RendererFactory2, OnDestroy { private readonly rendererByCompId = new Map< @@ -145,6 +193,7 @@ export class DomRendererFactory2 implements RendererFactory2, OnDestroy { const sharedStylesHost = this.sharedStylesHost; const removeStylesOnCompDestroy = this.removeStylesOnCompDestroy; const platformIsServer = this.platformIsServer; + const tracingService = this.tracingService; switch (type.encapsulation) { case ViewEncapsulation.Emulated: @@ -157,7 +206,7 @@ export class DomRendererFactory2 implements RendererFactory2, OnDestroy { doc, ngZone, platformIsServer, - this.tracingService, + tracingService, ); break; case ViewEncapsulation.ShadowDom: @@ -170,7 +219,7 @@ export class DomRendererFactory2 implements RendererFactory2, OnDestroy { ngZone, this.nonce, platformIsServer, - this.tracingService, + tracingService, ); default: renderer = new NoneEncapsulationDomRenderer( @@ -181,7 +230,7 @@ export class DomRendererFactory2 implements RendererFactory2, OnDestroy { doc, ngZone, platformIsServer, - this.tracingService, + tracingService, ); break; } @@ -449,9 +498,15 @@ class ShadowDomRenderer extends DefaultDomRenderer2 { ) { super(eventManager, doc, ngZone, platformIsServer, tracingService); this.shadowRoot = (hostEl as any).attachShadow({mode: 'open'}); - this.sharedStylesHost.addHost(this.shadowRoot); - const styles = shimStylesContent(component.id, component.styles); + let styles = component.styles; + if (ngDevMode) { + // We only do this in development, as for production users should not add CSS sourcemaps to components. + const baseHref = getDOM().getBaseHref(doc) ?? ''; + styles = addBaseHrefToCssSourceMap(baseHref, styles); + } + + styles = shimStylesContent(component.id, styles); for (const style of styles) { const styleEl = document.createElement('style'); @@ -520,7 +575,14 @@ class NoneEncapsulationDomRenderer extends DefaultDomRenderer2 { compId?: string, ) { super(eventManager, doc, ngZone, platformIsServer, tracingService); - this.styles = compId ? shimStylesContent(compId, component.styles) : component.styles; + let styles = component.styles; + if (ngDevMode) { + // We only do this in development, as for production users should not add CSS sourcemaps to components. + const baseHref = getDOM().getBaseHref(doc) ?? ''; + styles = addBaseHrefToCssSourceMap(baseHref, styles); + } + + this.styles = compId ? shimStylesContent(compId, styles) : styles; this.styleUrls = component.getExternalStyles?.(compId); } diff --git a/packages/platform-browser/src/dom/events/hammer_gestures.ts b/packages/platform-browser/src/dom/events/hammer_gestures.ts index 85810769f649..ae408e8f24b2 100644 --- a/packages/platform-browser/src/dom/events/hammer_gestures.ts +++ b/packages/platform-browser/src/dom/events/hammer_gestures.ts @@ -11,9 +11,9 @@ import { Inject, Injectable, InjectionToken, + Injector, NgModule, Optional, - Provider, ɵConsole as Console, } from '@angular/core'; @@ -68,7 +68,9 @@ const EVENT_NAMES = { * @ngModule HammerModule * @publicApi */ -export const HAMMER_GESTURE_CONFIG = new InjectionToken('HammerGestureConfig'); +export const HAMMER_GESTURE_CONFIG = new InjectionToken( + typeof ngDevMode === 'undefined' || ngDevMode ? 'HammerGestureConfig' : '', +); /** * Function that loads HammerJS, returning a promise that is resolved once HammerJs is loaded. @@ -84,7 +86,9 @@ export type HammerLoader = () => Promise; * * @publicApi */ -export const HAMMER_LOADER = new InjectionToken('HammerLoader'); +export const HAMMER_LOADER = new InjectionToken( + typeof ngDevMode === 'undefined' || ngDevMode ? 'HammerLoader' : '', +); export interface HammerInstance { on(eventName: string, callback?: Function): void; @@ -174,7 +178,7 @@ export class HammerGesturesPlugin extends EventManagerPlugin { constructor( @Inject(DOCUMENT) doc: any, @Inject(HAMMER_GESTURE_CONFIG) private _config: HammerGestureConfig, - private console: Console, + private _injector: Injector, @Optional() @Inject(HAMMER_LOADER) private loader?: HammerLoader | null, ) { super(doc); @@ -187,7 +191,10 @@ export class HammerGesturesPlugin extends EventManagerPlugin { if (!(window as any).Hammer && !this.loader) { if (typeof ngDevMode === 'undefined' || ngDevMode) { - this.console.warn( + // Get a `Console` through an injector to tree-shake the + // class when it is unused in production. + const _console = this._injector.get(Console); + _console.warn( `The "${eventName}" event cannot be bound because Hammer.JS is not ` + `loaded and no custom loader has been specified.`, ); @@ -219,9 +226,8 @@ export class HammerGesturesPlugin extends EventManagerPlugin { // If Hammer isn't actually loaded when the custom loader resolves, give up. if (!(window as any).Hammer) { if (typeof ngDevMode === 'undefined' || ngDevMode) { - this.console.warn( - `The custom HAMMER_LOADER completed, but Hammer.JS is not present.`, - ); + const _console = this._injector.get(Console); + _console.warn(`The custom HAMMER_LOADER completed, but Hammer.JS is not present.`); } deregister = () => {}; return; @@ -235,7 +241,8 @@ export class HammerGesturesPlugin extends EventManagerPlugin { } }).catch(() => { if (typeof ngDevMode === 'undefined' || ngDevMode) { - this.console.warn( + const _console = this._injector.get(Console); + _console.warn( `The "${eventName}" event cannot be bound because the custom ` + `Hammer.JS loader failed.`, ); @@ -293,7 +300,7 @@ export class HammerGesturesPlugin extends EventManagerPlugin { provide: EVENT_MANAGER_PLUGINS, useClass: HammerGesturesPlugin, multi: true, - deps: [DOCUMENT, HAMMER_GESTURE_CONFIG, Console, [new Optional(), HAMMER_LOADER]], + deps: [DOCUMENT, HAMMER_GESTURE_CONFIG, Injector, [new Optional(), HAMMER_LOADER]], }, {provide: HAMMER_GESTURE_CONFIG, useClass: HammerGestureConfig, deps: []}, ], diff --git a/packages/platform-browser/test/dom/dom_renderer_spec.ts b/packages/platform-browser/test/dom/dom_renderer_spec.ts index 442419859476..b76a432c149f 100644 --- a/packages/platform-browser/test/dom/dom_renderer_spec.ts +++ b/packages/platform-browser/test/dom/dom_renderer_spec.ts @@ -9,6 +9,7 @@ import {Component, Renderer2, ViewEncapsulation} from '@angular/core'; import {ComponentFixture, TestBed} from '@angular/core/testing'; import {By} from '@angular/platform-browser/src/dom/debug/by'; import { + addBaseHrefToCssSourceMap, NAMESPACE_URIS, REMOVE_STYLES_ON_COMPONENT_DESTROY, } from '@angular/platform-browser/src/dom/dom_renderer'; @@ -268,6 +269,89 @@ describe('DefaultDomRendererV2', () => { } }); }); + + it('should update an external sourceMappingURL by prepending the baseHref as a prefix', () => { + document.head.innerHTML = ``; + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ + declarations: [CmpEncapsulationNoneWithSourceMap], + }); + + const fixture = TestBed.createComponent(CmpEncapsulationNoneWithSourceMap); + fixture.detectChanges(); + + expect(document.head.querySelector('style')?.textContent).toContain( + '/*# sourceMappingURL=/base/cmp-none.css.map */', + ); + + document.head.innerHTML = ''; + }); +}); + +describe('addBaseHrefToCssSourceMap', () => { + it('should return the original styles if baseHref is empty', () => { + const styles = ['body { color: red; }']; + const result = addBaseHrefToCssSourceMap('', styles); + expect(result).toEqual(styles); + }); + + it('should skip styles that do not contain a sourceMappingURL', () => { + const styles = ['body { color: red; }', 'h1 { font-size: 2rem; }']; + const result = addBaseHrefToCssSourceMap('/base/', styles); + expect(result).toEqual(styles); + }); + + it('should not modify inline (encoded) sourceMappingURL maps', () => { + const styles = ['/*# sourceMappingURL=data:application/json;base64,xyz */']; + const result = addBaseHrefToCssSourceMap('/base/', styles); + expect(result).toEqual(styles); + }); + + it('should prepend baseHref to external sourceMappingURL', () => { + const styles = ['/*# sourceMappingURL=style.css */']; + const result = addBaseHrefToCssSourceMap('/base/', styles); + expect(result).toEqual(['/*# sourceMappingURL=/base/style.css */']); + }); + + it('should handle baseHref with a trailing slash correctly', () => { + const styles = ['/*# sourceMappingURL=style.css */']; + const result = addBaseHrefToCssSourceMap('/base/', styles); + expect(result).toEqual(['/*# sourceMappingURL=/base/style.css */']); + }); + + it('should handle baseHref without a trailing slash correctly', () => { + const styles = ['/*# sourceMappingURL=style.css */']; + const result = addBaseHrefToCssSourceMap('/base', styles); + expect(result).toEqual(['/*# sourceMappingURL=/style.css */']); + }); + + it('should not duplicate slashes in the final URL', () => { + const styles = ['/*# sourceMappingURL=./style.css */']; + const result = addBaseHrefToCssSourceMap('/base/', styles); + expect(result).toEqual(['/*# sourceMappingURL=/base/style.css */']); + }); + + it('should not add base href to sourceMappingURL that is absolute', () => { + const styles = ['/*# sourceMappingURL=http://example.com/style.css */']; + const result = addBaseHrefToCssSourceMap('/base/', styles); + expect(result).toEqual(['/*# sourceMappingURL=http://example.com/style.css */']); + }); + + it('should process multiple styles and handle each case correctly', () => { + const styles = [ + '/*# sourceMappingURL=style1.css */', + '/*# sourceMappingURL=data:application/json;base64,xyz */', + 'h1 { font-size: 2rem; }', + '/*# sourceMappingURL=style2.css */', + ]; + const result = addBaseHrefToCssSourceMap('/base/', styles); + expect(result).toEqual([ + '/*# sourceMappingURL=/base/style1.css */', + '/*# sourceMappingURL=data:application/json;base64,xyz */', + 'h1 { font-size: 2rem; }', + '/*# sourceMappingURL=/base/style2.css */', + ]); + }); }); async function styleCount( @@ -309,6 +393,15 @@ class CmpEncapsulationEmulated {} }) class CmpEncapsulationNone {} +@Component({ + selector: 'cmp-none', + template: `
    `, + styles: [`.none { color: lime; }\n/*# sourceMappingURL=cmp-none.css.map */`], + encapsulation: ViewEncapsulation.None, + standalone: false, +}) +class CmpEncapsulationNoneWithSourceMap {} + @Component({ selector: 'cmp-shadow', template: `
    `, diff --git a/packages/platform-browser/test/dom/events/hammer_gestures_spec.ts b/packages/platform-browser/test/dom/events/hammer_gestures_spec.ts index 30553e1d7ca6..7cf6a28bd0dd 100644 --- a/packages/platform-browser/test/dom/events/hammer_gestures_spec.ts +++ b/packages/platform-browser/test/dom/events/hammer_gestures_spec.ts @@ -15,7 +15,6 @@ import { describe('HammerGesturesPlugin', () => { let plugin: HammerGesturesPlugin; - let fakeConsole: any; if (isNode) { // Jasmine will throw if there are no tests. @@ -23,18 +22,15 @@ describe('HammerGesturesPlugin', () => { return; } - beforeEach(() => { - fakeConsole = {warn: jasmine.createSpy('console.warn')}; - }); - describe('with no custom loader', () => { beforeEach(() => { - plugin = new HammerGesturesPlugin(document, new HammerGestureConfig(), fakeConsole); + plugin = new HammerGesturesPlugin(document, new HammerGestureConfig(), TestBed); }); it('should warn user and do nothing when Hammer.js not loaded', () => { + const warnSpy = spyOn(console, 'warn'); expect(plugin.supports('swipe')).toBe(false); - expect(fakeConsole.warn).toHaveBeenCalledWith( + expect(warnSpy).toHaveBeenCalledWith( `The "swipe" event cannot be bound because Hammer.JS is not ` + `loaded and no custom loader has been specified.`, ); @@ -90,7 +86,7 @@ describe('HammerGesturesPlugin', () => { const hammerConfig = new HammerGestureConfig(); spyOn(hammerConfig, 'buildHammer').and.returnValue(fakeHammerInstance); - plugin = new HammerGesturesPlugin(document, hammerConfig, fakeConsole, loader); + plugin = new HammerGesturesPlugin(document, hammerConfig, TestBed, loader); // Use a fake EventManager that has access to the NgZone. plugin.manager = {getZone: () => ngZone} as EventManager; @@ -114,8 +110,9 @@ describe('HammerGesturesPlugin', () => { }); it('should not log a warning when HammerJS is not loaded', () => { + const warnSpy = spyOn(console, 'warn'); plugin.addEventListener(someElement, 'swipe', () => {}); - expect(fakeConsole.warn).not.toHaveBeenCalled(); + expect(warnSpy).not.toHaveBeenCalled(); }); it('should defer registering an event until Hammer is loaded', fakeAsync(() => { @@ -152,21 +149,25 @@ describe('HammerGesturesPlugin', () => { })); it('should log a warning when the loader fails', fakeAsync(() => { + const warnSpy = spyOn(console, 'warn'); + plugin.addEventListener(someElement, 'swipe', () => {}); failLoader(); tick(); - expect(fakeConsole.warn).toHaveBeenCalledWith( + expect(warnSpy).toHaveBeenCalledWith( `The "swipe" event cannot be bound because the custom Hammer.JS loader failed.`, ); })); it('should load a warning if the loader resolves and Hammer is not present', fakeAsync(() => { + const warnSpy = spyOn(console, 'warn'); + plugin.addEventListener(someElement, 'swipe', () => {}); resolveLoader(); tick(); - expect(fakeConsole.warn).toHaveBeenCalledWith( + expect(warnSpy).toHaveBeenCalledWith( `The custom HAMMER_LOADER completed, but Hammer.JS is not present.`, ); })); diff --git a/packages/platform-browser/test/hydration_spec.ts b/packages/platform-browser/test/hydration_spec.ts index 90066475d808..92d0d360db44 100644 --- a/packages/platform-browser/test/hydration_spec.ts +++ b/packages/platform-browser/test/hydration_spec.ts @@ -53,6 +53,14 @@ describe('provideClientHydration', () => { override isStable = new BehaviorSubject(false); } + beforeEach(() => { + globalThis['ngServerMode'] = true; + }); + + afterEach(() => { + globalThis['ngServerMode'] = undefined; + }); + describe('default', () => { beforeEach( withBody( diff --git a/packages/platform-server/BUILD.bazel b/packages/platform-server/BUILD.bazel index acd3b5de1544..cc0e649871ad 100644 --- a/packages/platform-server/BUILD.bazel +++ b/packages/platform-server/BUILD.bazel @@ -15,13 +15,11 @@ ng_module( ), deps = [ ":bundled_domino_lib", - "//packages/animations/browser", "//packages/common", "//packages/common/http", "//packages/compiler", "//packages/core", "//packages/platform-browser", - "//packages/platform-browser/animations", "//packages/zone.js/lib:zone_d_ts", "@npm//@types/node", "@npm//rxjs", diff --git a/packages/platform-server/package.json b/packages/platform-server/package.json index dd291777486a..14fa391716da 100644 --- a/packages/platform-server/package.json +++ b/packages/platform-server/package.json @@ -8,7 +8,6 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "0.0.0-PLACEHOLDER", "@angular/common": "0.0.0-PLACEHOLDER", "@angular/compiler": "0.0.0-PLACEHOLDER", "@angular/core": "0.0.0-PLACEHOLDER", diff --git a/packages/platform-server/src/provide_server.ts b/packages/platform-server/src/provide_server.ts index c3114af6c967..83e1adfb1af4 100644 --- a/packages/platform-server/src/provide_server.ts +++ b/packages/platform-server/src/provide_server.ts @@ -7,7 +7,6 @@ */ import {EnvironmentProviders, makeEnvironmentProviders} from '@angular/core'; -import {provideNoopAnimations} from '@angular/platform-browser/animations'; import {PLATFORM_SERVER_PROVIDERS} from './server'; @@ -31,5 +30,5 @@ export function provideServerRendering(): EnvironmentProviders { globalThis['ngServerMode'] = true; } - return makeEnvironmentProviders([provideNoopAnimations(), ...PLATFORM_SERVER_PROVIDERS]); + return makeEnvironmentProviders([...PLATFORM_SERVER_PROVIDERS]); } diff --git a/packages/platform-server/src/server.ts b/packages/platform-server/src/server.ts index 7a70321718b4..cfa579835c5c 100644 --- a/packages/platform-server/src/server.ts +++ b/packages/platform-server/src/server.ts @@ -35,7 +35,6 @@ import { EVENT_MANAGER_PLUGINS, ɵBrowserDomAdapter as BrowserDomAdapter, } from '@angular/platform-browser'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {DominoAdapter, parseDocument} from './domino_adapter'; import {SERVER_HTTP_PROVIDERS} from './http'; @@ -90,7 +89,6 @@ export const PLATFORM_SERVER_PROVIDERS: Provider[] = [ */ @NgModule({ exports: [BrowserModule], - imports: [NoopAnimationsModule], providers: PLATFORM_SERVER_PROVIDERS, }) export class ServerModule {} diff --git a/packages/platform-server/test/BUILD.bazel b/packages/platform-server/test/BUILD.bazel index 32e504e579d8..bfa6bd2d8811 100644 --- a/packages/platform-server/test/BUILD.bazel +++ b/packages/platform-server/test/BUILD.bazel @@ -47,6 +47,7 @@ ts_library( "//packages/localize", "//packages/localize/init", "//packages/platform-browser", + "//packages/platform-browser/animations", "//packages/platform-server", "//packages/private/testing", "//packages/router", diff --git a/packages/platform-server/test/dom_utils.ts b/packages/platform-server/test/dom_utils.ts index 20c42a755b73..57219253a44a 100644 --- a/packages/platform-server/test/dom_utils.ts +++ b/packages/platform-server/test/dom_utils.ts @@ -93,18 +93,20 @@ export function hydrate( hydrationFeatures?: () => HydrationFeature[]; } = {}, ) { - function _document(): any { - ɵsetDocument(doc); - global.document = doc; // needed for `DefaultDomRenderer2` - return doc; - } - const {envProviders = [], hydrationFeatures = () => []} = options; + // Apply correct reference to the `document` object, + // which will be used by runtime. + ɵsetDocument(doc); + + // Define `document` to make `DefaultDomRenderer2` work, since it + // references `document` directly to create style tags. + global.document = doc; + const providers = [ ...envProviders, {provide: PLATFORM_ID, useValue: 'browser'}, - {provide: DOCUMENT, useFactory: _document, deps: []}, + {provide: DOCUMENT, useFactory: () => doc}, provideClientHydration(...hydrationFeatures()), ]; diff --git a/packages/platform-server/test/event_replay_spec.ts b/packages/platform-server/test/event_replay_spec.ts index 26700c7f29c8..0fafae9b3f69 100644 --- a/packages/platform-server/test/event_replay_spec.ts +++ b/packages/platform-server/test/event_replay_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {Component, destroyPlatform, ErrorHandler, PLATFORM_ID, Type} from '@angular/core'; +import {APP_ID, Component, destroyPlatform, ErrorHandler, PLATFORM_ID, Type} from '@angular/core'; import { withEventReplay, bootstrapApplication, @@ -142,6 +142,40 @@ describe('event replay', () => { expect(onClickSpy).toHaveBeenCalled(); }); + it('should cleanup `window._ejsas[appId]` once app is destroyed', async () => { + @Component({ + selector: 'app', + standalone: true, + template: ` + + `, + }) + class AppComponent { + onClick() {} + } + + const html = await ssr(AppComponent); + const ssrContents = getAppContents(html); + const doc = getDocument(); + + prepareEnvironment(doc, ssrContents); + resetTViewsFor(AppComponent); + + const btn = doc.getElementById('btn')!; + btn.click(); + + const appRef = await hydrate(doc, AppComponent, { + hydrationFeatures: () => [withEventReplay()], + }); + appRef.tick(); + const appId = appRef.injector.get(APP_ID); + + appRef.destroy(); + // This ensure that `_ejsas` for the current application is cleaned up + // once the application is destroyed. + expect(window._ejsas![appId]).toBeUndefined(); + }); + it('should route to the appropriate component with content projection', async () => { const outerOnClickSpy = jasmine.createSpy(); const innerOnClickSpy = jasmine.createSpy(); diff --git a/packages/platform-server/test/full_app_hydration_spec.ts b/packages/platform-server/test/full_app_hydration_spec.ts index 5f28d71609cd..1089157fb7e8 100644 --- a/packages/platform-server/test/full_app_hydration_spec.ts +++ b/packages/platform-server/test/full_app_hydration_spec.ts @@ -11,6 +11,7 @@ import '@angular/localize/init'; import { CommonModule, DOCUMENT, + isPlatformBrowser, isPlatformServer, NgComponentOutlet, NgFor, @@ -35,6 +36,7 @@ import { inject, Input, NgZone, + PendingTasks, Pipe, PipeTransform, PLATFORM_ID, @@ -7023,6 +7025,63 @@ describe('platform-server full application hydration integration', () => { expect(clientRootNode.textContent).toContain('Hi!'); }, ); + + it('should not throw an error when app is destroyed before becoming stable', async () => { + // Spy manually, because we may not be able to retrieve the `DebugConsole` + // after we destroy the application, but we still want to ensure that + // no error is thrown in the console. + const errorSpy = spyOn(console, 'error').and.callThrough(); + const logs: string[] = []; + + @Component({ + standalone: true, + selector: 'app', + template: `Hi!`, + }) + class SimpleComponent { + constructor() { + const isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); + + if (isBrowser) { + const pendingTasks = inject(PendingTasks); + // Given that, in a real-world scenario, some APIs add a pending + // task and don't remove it until the app is destroyed. + // This could be an HTTP request that contributes to app stability + // and does not respond until the app is destroyed. + pendingTasks.add(); + } + } + } + + const html = await ssr(SimpleComponent); + + resetTViewsFor(SimpleComponent); + + const appRef = await prepareEnvironmentAndHydrate(doc, html, SimpleComponent); + + appRef.isStable.subscribe((isStable) => { + logs.push(`isStable=${isStable}`); + }); + + // Destroy the application before it becomes stable, because we added + // a task and didn't remove it explicitly. + appRef.destroy(); + + expect(logs).toEqual([ + 'isStable=false', + 'isStable=true', + 'isStable=false', + // In the end, the application became stable while being destroyed. + 'isStable=true', + ]); + + // Wait for a microtask so that `whenStableWithTimeout` resolves. + await Promise.resolve(); + + // Ensure no error has been logged in the console, + // such as "injector has already been destroyed." + expect(errorSpy).not.toHaveBeenCalled(); + }); }); describe('@if', () => { diff --git a/packages/platform-server/test/hydration_utils.ts b/packages/platform-server/test/hydration_utils.ts index 4baa77de1112..a7b91e6f08ed 100644 --- a/packages/platform-server/test/hydration_utils.ts +++ b/packages/platform-server/test/hydration_utils.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import { diff --git a/packages/platform-server/test/incremental_hydration_spec.ts b/packages/platform-server/test/incremental_hydration_spec.ts index 44e0c8b4665b..869dbeaf8fa6 100644 --- a/packages/platform-server/test/incremental_hydration_spec.ts +++ b/packages/platform-server/test/incremental_hydration_spec.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import { @@ -12,10 +12,13 @@ import { Component, destroyPlatform, inject, + Input, NgZone, PLATFORM_ID, Provider, + QueryList, signal, + ViewChildren, ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, } from '@angular/core'; @@ -61,6 +64,15 @@ function dynamicImportOf(type: T, timeout = 0): Promise { }); } +/** + * Emulates a failed dynamic import promise. + */ +function failedDynamicImport(): Promise { + return new Promise((_, reject) => { + setTimeout(() => reject()); + }); +} + /** * Helper function to await all pending dynamic imports * emulated using `dynamicImportOf` function. @@ -222,7 +234,7 @@ describe('platform-server partial hydration integration', () => { const ssrContents = getAppContents(html); expect(ssrContents).toContain( - '"__nghDeferData__":{"d0":{"p":null,"r":1,"s":2},"d1":{"p":"d0","r":2,"s":2}}', + '"__nghDeferData__":{"d0":{"r":1,"s":2},"d1":{"r":2,"s":2,"p":"d0"}}', ); }); @@ -285,9 +297,38 @@ describe('platform-server partial hydration integration', () => { const ssrContents = getAppContents(html); expect(ssrContents).toContain( - '"__nghDeferData__":{"d0":{"p":null,"r":1,"s":2},"d1":{"p":"d0","r":2,"s":2,"t":[2]}}', + '"__nghDeferData__":{"d0":{"r":1,"s":2},"d1":{"r":2,"s":2,"t":[2],"p":"d0"}}', ); }); + + it('should not include parent id in serialized data for top-level `@defer` blocks', async () => { + @Component({ + selector: 'app', + template: ` + @defer (on viewport; hydrate on interaction) { + Hello world! + } @placeholder { + Placeholder + } + `, + }) + class SimpleComponent {} + + const appId = 'custom-app-id'; + const providers = [{provide: APP_ID, useValue: appId}]; + const hydrationFeatures = () => [withIncrementalHydration()]; + + const html = await ssr(SimpleComponent, { + envProviders: providers, + hydrationFeatures, + }); + + const ssrContents = getAppContents(html); + + // Assert that the serialized data doesn't contain the "p" field, + // which contains parent id (which is not needed for top-level blocks). + expect(ssrContents).toContain('"__nghDeferData__":{"d0":{"r":1,"s":2}}}'); + }); }); describe('basic hydration behavior', () => { @@ -347,7 +388,7 @@ describe('platform-server partial hydration integration', () => { expect(ssrContents).toContain('

    { expect(ssrContents).toContain('

    { //

    is inside a nested defer block -> different namespace. // expect(ssrContents).toContain('

    { }); describe('timer', () => { - it('top level timer', async () => { - @Component({ - selector: 'app', - template: ` + const TEST_TIMEOUT = 10_000; // 10 seconds + + it( + 'top level timer', + async () => { + @Component({ + selector: 'app', + template: `

    - @defer (hydrate on timer(500)) { + @defer (hydrate on timer(150)) {
    defer block rendered! {{value()}} @@ -1315,72 +1360,76 @@ describe('platform-server partial hydration integration', () => { }
    `, - }) - class SimpleComponent { - value = signal('start'); - fnA() {} - fnB() { - this.value.set('end'); + }) + class SimpleComponent { + value = signal('start'); + fnA() {} + fnB() { + this.value.set('end'); + } } - } - const appId = 'custom-app-id'; - const providers = [{provide: APP_ID, useValue: appId}]; - const hydrationFeatures = () => [withIncrementalHydration()]; + const appId = 'custom-app-id'; + const providers = [{provide: APP_ID, useValue: appId}]; + const hydrationFeatures = () => [withIncrementalHydration()]; - const html = await ssr(SimpleComponent, {envProviders: providers, hydrationFeatures}); - const ssrContents = getAppContents(html); + const html = await ssr(SimpleComponent, {envProviders: providers, hydrationFeatures}); + const ssrContents = getAppContents(html); - //
    uses "eager" `custom-app-id` namespace. - expect(ssrContents).toContain('
    start'); + expect(appHostNode.outerHTML).toContain('start'); - const testElement = doc.getElementById('test')!; - const clickEvent2 = new CustomEvent('click'); - testElement.dispatchEvent(clickEvent2); + const testElement = doc.getElementById('test')!; + const clickEvent2 = new CustomEvent('click'); + testElement.dispatchEvent(clickEvent2); - appRef.tick(); + appRef.tick(); - expect(appHostNode.outerHTML).toContain('end'); - }); + expect(appHostNode.outerHTML).toContain('end'); + }, + TEST_TIMEOUT, + ); - it('nested timer', async () => { - @Component({ - selector: 'app', - template: ` + it( + 'nested timer', + async () => { + @Component({ + selector: 'app', + template: `
    @defer (on viewport; hydrate on interaction) {
    defer block rendered! - @defer (on viewport; hydrate on timer(500)) { + @defer (on viewport; hydrate on timer(150)) {

    Nested defer block

    {{value()}} @@ -1394,71 +1443,73 @@ describe('platform-server partial hydration integration', () => { }
    `, - }) - class SimpleComponent { - value = signal('start'); - fnA() {} - fnB() { - this.value.set('end'); + }) + class SimpleComponent { + value = signal('start'); + fnA() {} + fnB() { + this.value.set('end'); + } } - } - const appId = 'custom-app-id'; - const providers = [{provide: APP_ID, useValue: appId}]; - const hydrationFeatures = () => [withIncrementalHydration()]; + const appId = 'custom-app-id'; + const providers = [{provide: APP_ID, useValue: appId}]; + const hydrationFeatures = () => [withIncrementalHydration()]; - const html = await ssr(SimpleComponent, {envProviders: providers, hydrationFeatures}); - const ssrContents = getAppContents(html); + const html = await ssr(SimpleComponent, {envProviders: providers, hydrationFeatures}); + const ssrContents = getAppContents(html); - //
    uses "eager" `custom-app-id` namespace. - expect(ssrContents).toContain('
    start'); + expect(appHostNode.outerHTML).toContain('start'); - const testElement = doc.getElementById('test')!; - const clickEvent2 = new CustomEvent('click'); - testElement.dispatchEvent(clickEvent2); + const testElement = doc.getElementById('test')!; + const clickEvent2 = new CustomEvent('click'); + testElement.dispatchEvent(clickEvent2); - appRef.tick(); + appRef.tick(); - expect(appHostNode.outerHTML).toContain('end'); - }); + expect(appHostNode.outerHTML).toContain('end'); + }, + TEST_TIMEOUT, + ); }); it('when', async () => { @@ -1793,6 +1844,9 @@ describe('platform-server partial hydration integration', () => { describe('client side navigation', () => { beforeEach(() => { + // This test emulates client-side behavior, set global server mode flag to `false`. + globalThis['ngServerMode'] = false; + TestBed.configureTestingModule({ providers: [ {provide: PLATFORM_ID, useValue: PLATFORM_BROWSER_ID}, @@ -1801,32 +1855,28 @@ describe('platform-server partial hydration integration', () => { }); }); + afterEach(() => { + globalThis['ngServerMode'] = undefined; + }); + it('should not try to hydrate in CSR only cases', async () => { @Component({ selector: 'app', template: ` -
    - @defer (hydrate when true) { -
    - defer block rendered! - {{value()}} -
    - } @placeholder { - Outer block placeholder - } -
    + @defer (hydrate when true; on interaction) { +

    Defer block rendered!

    + } @placeholder { + Outer block placeholder + } `, }) - class SimpleComponent { - value = signal('start'); - fnA() {} - fnB() { - this.value.set('end'); - } - } + class SimpleComponent {} + const fixture = TestBed.createComponent(SimpleComponent); fixture.detectChanges(); + // Verify that `hydrate when true` doesn't trigger rendering of the main + // content in client-only use-cases (expecting to see placeholder content). expect(fixture.nativeElement.innerHTML).toContain('Outer block placeholder'); }); }); @@ -1914,6 +1964,168 @@ describe('platform-server partial hydration integration', () => { expect(appHostNode.outerHTML).not.toContain('Outer block placeholder'); expect(registry.cleanup).toHaveBeenCalledTimes(1); }); + + it('should handle hydration and cleanup when if then condition changes', async () => { + @Component({ + selector: 'app', + template: ` +
    + @defer (on interaction; hydrate on interaction) { +
    +

    Main defer block rendered!

    + @if (isServer) { + @defer (on interaction; hydrate on interaction) { +
    + nested defer block rendered! +
    + } @placeholder { + Outer block placeholder + } + } @else { +

    client side

    + } +
    + } @placeholder { + Outer block placeholder + } +
    + `, + }) + class SimpleComponent { + value = signal('start'); + isServer = isPlatformServer(inject(PLATFORM_ID)); + fnA() {} + fnB() { + this.value.set('end'); + } + } + + const appId = 'custom-app-id'; + const providers = [{provide: APP_ID, useValue: appId}]; + const hydrationFeatures = () => [withIncrementalHydration()]; + + const html = await ssr(SimpleComponent, {envProviders: providers, hydrationFeatures}); + const ssrContents = getAppContents(html); + + expect(ssrContents).toContain('
    client transition in this test. + resetTViewsFor(SimpleComponent); + + //////////////////////////////// + const doc = getDocument(); + const appRef = await prepareEnvironmentAndHydrate(doc, html, SimpleComponent, { + envProviders: [...providers, {provide: PLATFORM_ID, useValue: 'browser'}], + hydrationFeatures, + }); + const compRef = getComponentRef(appRef); + appRef.tick(); + await appRef.whenStable(); + + const appHostNode = compRef.location.nativeElement; + expect(appHostNode.outerHTML).toContain('nested defer block rendered'); + + const article = doc.getElementById('item')!; + const clickEvent = new CustomEvent('click', {bubbles: true}); + article.dispatchEvent(clickEvent); + await allPendingDynamicImports(); + + appRef.tick(); + + expect(appHostNode.outerHTML).not.toContain('nested defer block rendered'); + expect(appHostNode.outerHTML).toContain('

    client side

    '); + + // Emit an event inside of a defer block, which should result + // in triggering the defer block (start loading deps, etc) and + // subsequent hydration. + expect(appHostNode.outerHTML).not.toContain('Outer block placeholder'); + }); + + it('should render an error block when loading fails and cleanup the original content', async () => { + @Component({ + selector: 'nested-cmp', + standalone: true, + template: 'Rendering {{ block }} block.', + }) + class NestedCmp { + @Input() block!: string; + } + + @Component({ + standalone: true, + selector: 'app', + imports: [NestedCmp], + template: ` +
    + @defer (on interaction; hydrate on interaction) { +
    + +
    + } @placeholder { + Outer block placeholder + } @error { +

    Failed to load dependencies :(

    + + } +
    + `, + }) + class SimpleComponent { + @ViewChildren(NestedCmp) cmps!: QueryList; + value = signal('start'); + fnA() {} + fnB() { + this.value.set('end'); + } + } + + const deferDepsInterceptor = { + intercept() { + return () => [failedDynamicImport()]; + }, + }; + + const appId = 'custom-app-id'; + const providers = [{provide: APP_ID, useValue: appId}]; + const hydrationFeatures = () => [withIncrementalHydration()]; + + const html = await ssr(SimpleComponent, {envProviders: providers, hydrationFeatures}); + const ssrContents = getAppContents(html); + + expect(ssrContents).toContain('
    client transition in this test. + resetTViewsFor(SimpleComponent); + + //////////////////////////////// + const doc = getDocument(); + const appRef = await prepareEnvironmentAndHydrate(doc, html, SimpleComponent, { + envProviders: [ + ...providers, + {provide: PLATFORM_ID, useValue: 'browser'}, + {provide: ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, useValue: deferDepsInterceptor}, + ], + hydrationFeatures, + }); + const compRef = getComponentRef(appRef); + appRef.tick(); + await appRef.whenStable(); + + const appHostNode = compRef.location.nativeElement; + expect(appHostNode.outerHTML).toContain('Rendering primary block'); + + const article = doc.getElementById('item')!; + const clickEvent = new CustomEvent('click', {bubbles: true}); + article.dispatchEvent(clickEvent); + await allPendingDynamicImports(); + + appRef.tick(); + + expect(appHostNode.outerHTML).not.toContain('Rendering primary block'); + expect(appHostNode.outerHTML).toContain('Rendering error block'); + }); }); describe('cleanup', () => { diff --git a/packages/platform-server/test/integration_spec.ts b/packages/platform-server/test/integration_spec.ts index 153a5e512d5b..481b3cc2d81b 100644 --- a/packages/platform-server/test/integration_spec.ts +++ b/packages/platform-server/test/integration_spec.ts @@ -66,6 +66,7 @@ import {provideRouter, RouterOutlet, Routes} from '@angular/router'; import {Observable} from 'rxjs'; import {renderApplication, SERVER_CONTEXT} from '../src/utils'; +import {BrowserAnimationsModule, provideAnimations} from '@angular/platform-browser/animations'; const APP_CONFIG: ApplicationConfig = { providers: [provideServerRendering()], @@ -390,11 +391,13 @@ function createMyAnimationApp(standalone: boolean) { } const MyAnimationApp = createMyAnimationApp(false); -const MyAnimationAppStandalone = getStandaloneBootstrapFn(createMyAnimationApp(true)); +const MyAnimationAppStandalone = getStandaloneBootstrapFn(createMyAnimationApp(true), [ + provideAnimations(), +]); @NgModule({ declarations: [MyAnimationApp], - imports: [BrowserModule, ServerModule], + imports: [BrowserModule, BrowserAnimationsModule, ServerModule], bootstrap: [MyAnimationApp], }) class AnimationServerModule {} @@ -973,7 +976,7 @@ class HiddenModule {} }); const output = await bootstrap; expect(output).toMatch( - //, + //, ); }); diff --git a/packages/platform-server/testing/BUILD.bazel b/packages/platform-server/testing/BUILD.bazel index 7ad75ce764e1..39dff822fbf1 100644 --- a/packages/platform-server/testing/BUILD.bazel +++ b/packages/platform-server/testing/BUILD.bazel @@ -10,7 +10,6 @@ ng_module( deps = [ "//packages/core", "//packages/platform-browser-dynamic/testing", - "//packages/platform-browser/animations", "//packages/platform-server", ], ) diff --git a/packages/platform-server/testing/src/server.ts b/packages/platform-server/testing/src/server.ts index 11746bed7eae..6d899ace6543 100644 --- a/packages/platform-server/testing/src/server.ts +++ b/packages/platform-server/testing/src/server.ts @@ -11,7 +11,6 @@ import { BrowserDynamicTestingModule, ɵplatformCoreDynamicTesting as platformCoreDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import { ɵINTERNAL_SERVER_PLATFORM_PROVIDERS as INTERNAL_SERVER_PLATFORM_PROVIDERS, ɵSERVER_RENDER_PROVIDERS as SERVER_RENDER_PROVIDERS, @@ -35,7 +34,6 @@ export const platformServerTesting = createPlatformFactory( */ @NgModule({ exports: [BrowserDynamicTestingModule], - imports: [NoopAnimationsModule], providers: SERVER_RENDER_PROVIDERS, }) export class ServerTestingModule {} diff --git a/packages/router/README.md b/packages/router/README.md index 442792533efd..68ad6fae9691 100644 --- a/packages/router/README.md +++ b/packages/router/README.md @@ -6,4 +6,4 @@ Managing state transitions is one of the hardest parts of building applications. The Angular router is designed to solve these problems. Using the router, you can declaratively specify application state, manage state transitions while taking care of the URL, and load components on demand. ## Guide -Read the dev guide [here](https://angular.io/guide/routing/common-router-tasks). +Read the dev guide [here](https://angular.dev/guide/routing). diff --git a/packages/router/src/directives/router_link_active.ts b/packages/router/src/directives/router_link_active.ts index f6162f7ebb46..4d2f6b82f143 100644 --- a/packages/router/src/directives/router_link_active.ts +++ b/packages/router/src/directives/router_link_active.ts @@ -143,7 +143,7 @@ export class RouterLinkActive implements OnChanges, OnDestroy, AfterContentInit * true -> Route is active * false -> Route is inactive * - * ``` + * ```html * * inject(myGuard).canActivate()]`. @@ -974,8 +974,7 @@ export type CanActivateChildFn = ( * Here, the defined guard function is provided as part of the `Route` object * in the router configuration: * - * ``` - * + * ```ts * @Injectable() * class CanDeactivateTeam implements CanDeactivate { * constructor(private permissions: Permissions, private currentUser: UserToken) {} @@ -1071,8 +1070,7 @@ export type CanDeactivateFn = ( * Here, the defined guard function is provided as part of the `Route` object * in the router configuration: * - * ``` - * + * ```ts * @NgModule({ * imports: [ * RouterModule.forRoot([ @@ -1151,8 +1149,7 @@ export type CanMatchFn = (route: Route, segments: UrlSegment[]) => MaybeAsync = ( * Here, the defined guard function is provided as part of the `Route` object * in the router configuration: * - * ``` - * + * ```ts * @NgModule({ * imports: [ * RouterModule.forRoot([ @@ -1497,7 +1493,7 @@ export interface NavigationBehaviorOptions { * This feature is useful for redirects, such as redirecting to an error page, without changing * the value that will be displayed in the browser's address bar. * - * ``` + * ```ts * const canActivate: CanActivateFn = (route: ActivatedRouteSnapshot) => { * const userService = inject(UserService); * const router = inject(Router); diff --git a/packages/router/src/navigation_transition.ts b/packages/router/src/navigation_transition.ts index f209a3a98546..e32ae8c794a2 100644 --- a/packages/router/src/navigation_transition.ts +++ b/packages/router/src/navigation_transition.ts @@ -8,6 +8,7 @@ import {Location} from '@angular/common'; import { + DestroyRef, EnvironmentInjector, inject, Injectable, @@ -124,7 +125,7 @@ export interface UrlCreationOptions { * The following `go()` function navigates to the `list` route by * interpreting the destination URI as relative to the activated `child` route * - * ``` + * ```ts * @Component({...}) * class ChildComponent { * constructor(private router: Router, private route: ActivatedRoute) {} @@ -354,6 +355,7 @@ export class NavigationTransitions { readonly transitionAbortSubject = new Subject(); private readonly configLoader = inject(RouterConfigLoader); private readonly environmentInjector = inject(EnvironmentInjector); + private readonly destroyRef = inject(DestroyRef); private readonly urlSerializer = inject(UrlSerializer); private readonly rootContexts = inject(ChildrenOutletContexts); private readonly location = inject(Location); @@ -381,11 +383,16 @@ export class NavigationTransitions { /** @internal */ rootComponentType: Type | null = null; + private destroyed = false; + constructor() { const onLoadStart = (r: Route) => this.events.next(new RouteConfigLoadStart(r)); const onLoadEnd = (r: Route) => this.events.next(new RouteConfigLoadEnd(r)); this.configLoader.onLoadEndListener = onLoadEnd; this.configLoader.onLoadStartListener = onLoadStart; + this.destroyRef.onDestroy(() => { + this.destroyed = true; + }); } complete() { @@ -831,6 +838,14 @@ export class NavigationTransitions { } }), catchError((e) => { + // If the application is already destroyed, the catch block should not + // execute anything in practice because other resources have already + // been released and destroyed. + if (this.destroyed) { + overallTransitionState.resolve(false); + return EMPTY; + } + errored = true; /* This error type is issued during Redirect, and is handled as a * cancellation rather than an error. */ diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index ca305559117a..12cb111ed113 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -355,7 +355,7 @@ export class Router { * * @usageNotes * - * ``` + * ```ts * router.resetConfig([ * { path: 'team/:id', component: TeamCmp, children: [ * { path: 'simple', component: SimpleCmp }, @@ -498,7 +498,7 @@ export class Router { * * The following calls request navigation to an absolute path. * - * ``` + * ```ts * router.navigateByUrl("/team/33/user/11"); * * // Navigate without updating the URL @@ -540,7 +540,7 @@ export class Router { * * The following calls request navigation to a dynamic route path relative to the current URL. * - * ``` + * ```ts * router.navigate(['team', 33, 'user', 11], {relativeTo: route}); * * // Navigate without updating the URL, overriding the default behavior diff --git a/packages/router/src/router_devtools.ts b/packages/router/src/router_devtools.ts index 2bba93c5be46..b2aba86d23e3 100644 --- a/packages/router/src/router_devtools.ts +++ b/packages/router/src/router_devtools.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ɵpublishExternalGlobalUtil} from '@angular/core'; diff --git a/packages/router/src/router_module.ts b/packages/router/src/router_module.ts index f1477362bb8c..165b84d8c888 100644 --- a/packages/router/src/router_module.ts +++ b/packages/router/src/router_module.ts @@ -63,9 +63,7 @@ const ROUTER_DIRECTIVES = [RouterOutlet, RouterLink, RouterLinkActive, EmptyOutl * @docsNotRequired */ export const ROUTER_FORROOT_GUARD = new InjectionToken( - typeof ngDevMode === 'undefined' || ngDevMode - ? 'router duplicate forRoot guard' - : 'ROUTER_FORROOT_GUARD', + typeof ngDevMode === 'undefined' || ngDevMode ? 'router duplicate forRoot guard' : '', ); // TODO(atscott): All of these except `ActivatedRoute` are `providedIn: 'root'`. They are only kept @@ -112,7 +110,11 @@ export const ROUTER_PROVIDERS: Provider[] = [ exports: ROUTER_DIRECTIVES, }) export class RouterModule { - constructor(@Optional() @Inject(ROUTER_FORROOT_GUARD) guard: any) {} + constructor() { + if (typeof ngDevMode === 'undefined' || ngDevMode) { + inject(ROUTER_FORROOT_GUARD, {optional: true}); + } + } /** * Creates and configures a module with all the router providers and directives. @@ -120,7 +122,7 @@ export class RouterModule { * * When registering the NgModule at the root, import as follows: * - * ``` + * ```ts * @NgModule({ * imports: [RouterModule.forRoot(ROUTES)] * }) @@ -143,11 +145,13 @@ export class RouterModule { : [] : [], {provide: ROUTES, multi: true, useValue: routes}, - { - provide: ROUTER_FORROOT_GUARD, - useFactory: provideForRootGuard, - deps: [[Router, new Optional(), new SkipSelf()]], - }, + typeof ngDevMode === 'undefined' || ngDevMode + ? { + provide: ROUTER_FORROOT_GUARD, + useFactory: provideForRootGuard, + deps: [[Router, new Optional(), new SkipSelf()]], + } + : [], config?.errorHandler ? { provide: NAVIGATION_ERROR_HANDLER, @@ -171,7 +175,7 @@ export class RouterModule { * without creating a new Router service. * When registering for submodules and lazy-loaded submodules, create the NgModule as follows: * - * ``` + * ```ts * @NgModule({ * imports: [RouterModule.forChild(ROUTES)] * }) @@ -224,7 +228,7 @@ function providePathLocationStrategy(): Provider { } export function provideForRootGuard(router: Router): any { - if ((typeof ngDevMode === 'undefined' || ngDevMode) && router) { + if (router) { throw new RuntimeError( RuntimeErrorCode.FOR_ROOT_CALLED_TWICE, `The Router was provided more than once. This can happen if 'forRoot' is used outside of the root injector.` + diff --git a/packages/router/src/router_state.ts b/packages/router/src/router_state.ts index ea88e9850fa4..00deff77de2c 100644 --- a/packages/router/src/router_state.ts +++ b/packages/router/src/router_state.ts @@ -349,7 +349,7 @@ export class ActivatedRouteSnapshot { * You can compute all params (or data) in the router state or to get params outside * of an activated component by traversing the `RouterState` tree as in the following * example: - * ``` + * ```ts * collectRouteParams(router: Router) { * let params = {}; * let stack: ActivatedRouteSnapshot[] = [router.routerState.snapshot.root]; diff --git a/packages/router/src/utils/navigations.ts b/packages/router/src/utils/navigations.ts index b20f71ac3c97..2f96b5b35f87 100644 --- a/packages/router/src/utils/navigations.ts +++ b/packages/router/src/utils/navigations.ts @@ -18,7 +18,7 @@ import { NavigationSkipped, } from '../events'; -enum NavigationResult { +const enum NavigationResult { COMPLETE, FAILED, REDIRECTING, diff --git a/packages/router/test/integration.spec.ts b/packages/router/test/integration.spec.ts index ed9ff19743f1..772169d66c69 100644 --- a/packages/router/test/integration.spec.ts +++ b/packages/router/test/integration.spec.ts @@ -25,6 +25,7 @@ import { ViewChildren, ɵConsole as Console, ɵNoopNgZone as NoopNgZone, + DestroyRef, } from '@angular/core'; import {ComponentFixture, fakeAsync, inject, TestBed, tick} from '@angular/core/testing'; import {By} from '@angular/platform-browser/src/dom/debug/by'; @@ -74,7 +75,7 @@ import { UrlTree, } from '@angular/router'; import {RouterTestingHarness} from '@angular/router/testing'; -import {concat, EMPTY, firstValueFrom, Observable, Observer, of, Subscription} from 'rxjs'; +import {concat, EMPTY, firstValueFrom, Observable, Observer, of, Subject, Subscription} from 'rxjs'; import {delay, filter, first, last, map, mapTo, takeWhile, tap} from 'rxjs/operators'; import { @@ -3619,6 +3620,49 @@ for (const browserAPI of ['navigation', 'history'] as const) { }); describe('guards', () => { describe('CanActivate', () => { + describe('guard completes before emitting a value', () => { + @Injectable({providedIn: 'root'}) + class CompletesBeforeEmitting { + private subject$ = new Subject(); + + constructor(destroyRef: DestroyRef) { + destroyRef.onDestroy(() => this.subject$.complete()); + } + + // Note that this is a simple illustrative case of when an observable + // completes without emitting a value. In a real-world scenario, this + // might represent an HTTP request that never emits before the app is + // destroyed and then completes when the app is destroyed. + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { + return this.subject$; + } + } + + it('should not thrown an unhandled promise rejection', fakeAsync( + inject([Router], async (router: Router) => { + const fixture = createRoot(router, RootCmp); + + const onUnhandledrejection = jasmine.createSpy(); + window.addEventListener('unhandledrejection', onUnhandledrejection); + + router.resetConfig([ + {path: 'team/:id', component: TeamCmp, canActivate: [CompletesBeforeEmitting]}, + ]); + + router.navigateByUrl('/team/22'); + + // This was previously throwing an error `NG0205: Injector has already been destroyed`. + fixture.destroy(); + + // Wait until the event task is dispatched. + await new Promise((resolve) => setTimeout(resolve, 10)); + window.removeEventListener('unhandledrejection', onUnhandledrejection); + + expect(onUnhandledrejection).not.toHaveBeenCalled(); + }), + )); + }); + describe('should not activate a route when CanActivate returns false', () => { beforeEach(() => { TestBed.configureTestingModule({ diff --git a/packages/router/testing/src/router_testing_module.ts b/packages/router/testing/src/router_testing_module.ts index b540d4d9f577..56dc6eda52d7 100644 --- a/packages/router/testing/src/router_testing_module.ts +++ b/packages/router/testing/src/router_testing_module.ts @@ -6,42 +6,19 @@ * found in the LICENSE file at https://angular.dev/license */ -import {Location} from '@angular/common'; import {provideLocationMocks} from '@angular/common/testing'; -import {Compiler, inject, Injector, ModuleWithProviders, NgModule} from '@angular/core'; +import {ModuleWithProviders, NgModule} from '@angular/core'; import { - ChildrenOutletContexts, ExtraOptions, NoPreloading, - Route, - Router, ROUTER_CONFIGURATION, - RouteReuseStrategy, RouterModule, ROUTES, Routes, - TitleStrategy, - UrlHandlingStrategy, - UrlSerializer, withPreloading, ɵROUTER_PROVIDERS as ROUTER_PROVIDERS, } from '@angular/router'; -function isUrlHandlingStrategy( - opts: ExtraOptions | UrlHandlingStrategy, -): opts is UrlHandlingStrategy { - // This property check is needed because UrlHandlingStrategy is an interface and doesn't exist at - // runtime. - return 'shouldProcessUrl' in opts; -} - -function throwInvalidConfigError(parameter: string): never { - throw new Error( - `Parameter ${parameter} does not match the one available in the injector. ` + - '`setupTestingRouter` is meant to be used as a factory function with dependencies coming from DI.', - ); -} - /** * @description * diff --git a/packages/service-worker/BUILD.bazel b/packages/service-worker/BUILD.bazel index b198aa6a2981..05988e13243e 100644 --- a/packages/service-worker/BUILD.bazel +++ b/packages/service-worker/BUILD.bazel @@ -11,7 +11,6 @@ ng_module( ], ), deps = [ - "//packages/common", "//packages/core", "@npm//rxjs", ], diff --git a/packages/service-worker/package.json b/packages/service-worker/package.json index c16fafe98a49..163eed6be28e 100644 --- a/packages/service-worker/package.json +++ b/packages/service-worker/package.json @@ -23,7 +23,7 @@ }, "peerDependencies": { "@angular/core": "0.0.0-PLACEHOLDER", - "@angular/common": "0.0.0-PLACEHOLDER" + "rxjs": "^6.5.3 || ^7.4.0" }, "repository": { "type": "git", diff --git a/packages/service-worker/src/provider.ts b/packages/service-worker/src/provider.ts index 6c051aace61a..fae503661cf9 100644 --- a/packages/service-worker/src/provider.ts +++ b/packages/service-worker/src/provider.ts @@ -6,7 +6,6 @@ * found in the LICENSE file at https://angular.dev/license */ -import {isPlatformBrowser} from '@angular/common'; import { APP_INITIALIZER, ApplicationRef, @@ -15,7 +14,6 @@ import { Injector, makeEnvironmentProviders, NgZone, - PLATFORM_ID, } from '@angular/core'; import {merge, from, Observable, of} from 'rxjs'; import {delay, take} from 'rxjs/operators'; @@ -30,12 +28,13 @@ export function ngswAppInitializer( injector: Injector, script: string, options: SwRegistrationOptions, - platformId: string, ): Function { return () => { - if ( - !(isPlatformBrowser(platformId) && 'serviceWorker' in navigator && options.enabled !== false) - ) { + if (typeof ngServerMode !== 'undefined' && ngServerMode) { + return; + } + + if (!('serviceWorker' in navigator && options.enabled !== false)) { return; } @@ -109,12 +108,11 @@ function delayWithTimeout(timeout: number): Observable { return of(null).pipe(delay(timeout)); } -export function ngswCommChannelFactory( - opts: SwRegistrationOptions, - platformId: string, -): NgswCommChannel { +export function ngswCommChannelFactory(opts: SwRegistrationOptions): NgswCommChannel { + const isBrowser = !(typeof ngServerMode !== 'undefined' && ngServerMode); + return new NgswCommChannel( - isPlatformBrowser(platformId) && opts.enabled !== false ? navigator.serviceWorker : undefined, + isBrowser && opts.enabled !== false ? navigator.serviceWorker : undefined, ); } @@ -207,12 +205,12 @@ export function provideServiceWorker( { provide: NgswCommChannel, useFactory: ngswCommChannelFactory, - deps: [SwRegistrationOptions, PLATFORM_ID], + deps: [SwRegistrationOptions], }, { provide: APP_INITIALIZER, useFactory: ngswAppInitializer, - deps: [Injector, SCRIPT, SwRegistrationOptions, PLATFORM_ID], + deps: [Injector, SCRIPT, SwRegistrationOptions], multi: true, }, ]); diff --git a/packages/service-worker/test/comm_spec.ts b/packages/service-worker/test/comm_spec.ts index 21bd1d513e1d..5c1fcdd8b9c9 100644 --- a/packages/service-worker/test/comm_spec.ts +++ b/packages/service-worker/test/comm_spec.ts @@ -62,21 +62,32 @@ describe('ServiceWorker library', () => { }); describe('ngswCommChannelFactory', () => { - it('gives disabled NgswCommChannel for platform-server', () => { - TestBed.configureTestingModule({ - providers: [ - {provide: PLATFORM_ID, useValue: 'server'}, - {provide: SwRegistrationOptions, useValue: {enabled: true}}, - { - provide: NgswCommChannel, - useFactory: ngswCommChannelFactory, - deps: [SwRegistrationOptions, PLATFORM_ID], - }, - ], + describe('server', () => { + beforeEach(() => { + globalThis['ngServerMode'] = true; }); - expect(TestBed.inject(NgswCommChannel).isEnabled).toEqual(false); + afterEach(() => { + globalThis['ngServerMode'] = undefined; + }); + + it('gives disabled NgswCommChannel for platform-server', () => { + TestBed.configureTestingModule({ + providers: [ + {provide: PLATFORM_ID, useValue: 'server'}, + {provide: SwRegistrationOptions, useValue: {enabled: true}}, + { + provide: NgswCommChannel, + useFactory: ngswCommChannelFactory, + deps: [SwRegistrationOptions, PLATFORM_ID], + }, + ], + }); + + expect(TestBed.inject(NgswCommChannel).isEnabled).toEqual(false); + }); }); + it("gives disabled NgswCommChannel when 'enabled' option is false", () => { TestBed.configureTestingModule({ providers: [ diff --git a/packages/upgrade/src/dynamic/src/upgrade_adapter.ts b/packages/upgrade/src/dynamic/src/upgrade_adapter.ts index 3d83bae47296..fda4d24d0f03 100644 --- a/packages/upgrade/src/dynamic/src/upgrade_adapter.ts +++ b/packages/upgrade/src/dynamic/src/upgrade_adapter.ts @@ -198,7 +198,7 @@ export class UpgradeAdapter { * * ### Example * - * ``` + * ```angular-ts * const adapter = new UpgradeAdapter(forwardRef(() => MyNg2Module)); * const module = angular.module('myExample', []); * module.directive('greet', adapter.downgradeNg2Component(Greeter)); @@ -277,7 +277,7 @@ export class UpgradeAdapter { * * ### Example * - * ``` + * ```angular-ts * const adapter = new UpgradeAdapter(forwardRef(() => MyNg2Module)); * const module = angular.module('myExample', []); * @@ -327,7 +327,7 @@ export class UpgradeAdapter { * @usageNotes * ### Example * - * ``` + * ```ts * const upgradeAdapter = new UpgradeAdapter(MyNg2Module); * * // configure the adapter with upgrade/downgrade components and services @@ -386,7 +386,7 @@ export class UpgradeAdapter { * @usageNotes * ### Example * - * ``` + * ```angular-ts * const adapter = new UpgradeAdapter(MyNg2Module); * const module = angular.module('myExample', []); * module.directive('ng2', adapter.downgradeNg2Component(Ng2)); @@ -467,7 +467,7 @@ export class UpgradeAdapter { * @usageNotes * ### Example * - * ``` + * ```ts * class Login { ... } * class Server { ... } * @@ -507,7 +507,7 @@ export class UpgradeAdapter { * @usageNotes * ### Example * - * ``` + * ```ts * class Example { * } * @@ -538,7 +538,7 @@ export class UpgradeAdapter { * @usageNotes * ### Example * - * ``` + * ```ts * const upgradeAdapter = new UpgradeAdapter(MyNg2Module); * upgradeAdapter.declareNg1Module(['heroApp']); * ``` diff --git a/packages/zone.js/lib/zone.configurations.api.ts b/packages/zone.js/lib/zone.configurations.api.ts index 6c2096253006..652c062cf555 100644 --- a/packages/zone.js/lib/zone.configurations.api.ts +++ b/packages/zone.js/lib/zone.configurations.api.ts @@ -22,7 +22,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const EventEmitter = require('events'); * class MyEmitter extends EventEmitter {} * const myEmitter = new MyEmitter(); @@ -52,7 +52,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const fs = require('fs'); * * const zone = Zone.current.fork({name: 'myZone'}); @@ -80,7 +80,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * setTimeout(() => { @@ -106,7 +106,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * process.nextTick(() => { @@ -132,7 +132,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const crypto = require('crypto'); * * const zone = Zone.current.fork({name: 'myZone'}); @@ -182,7 +182,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const proto = Object.create(HTMLElement.prototype); * proto.createdCallback = function() { * console.log('createdCallback is invoked in the zone', Zone.current.name); @@ -225,7 +225,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * div.addEventListener('click', () => { @@ -251,7 +251,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * setTimeout(() => { @@ -279,7 +279,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * requestAnimationFrame(() => { @@ -310,7 +310,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * queueMicrotask(() => { @@ -342,7 +342,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * div.addEventListener('click', () => { @@ -382,7 +382,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * div.onclick = () => { @@ -407,7 +407,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * class TestCustomElement extends HTMLElement { * constructor() { super(); } * connectedCallback() {} @@ -443,7 +443,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({ * name: 'myZone', * onScheduleTask: (delegate, curr, target, task) => { @@ -477,7 +477,7 @@ declare global { * * Consider the following examples: * - * ``` + * ```ts * const zone = Zone.current.fork({ * name: 'myZone' * }); @@ -506,7 +506,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({ * name: 'myZone' * }); @@ -533,7 +533,7 @@ declare global { * * Consider the following examples: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * * const p = Promise.resolve(1); @@ -716,7 +716,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * describe('jasmine.clock integration', () => { * beforeEach(() => { * jasmine.clock().install(); @@ -749,7 +749,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * describe('jasmine.clock integration', () => { * beforeEach(() => { * jasmine.clock().install(); @@ -774,7 +774,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * describe('jasmine.clock integration', () => { * beforeEach(() => { * jasmine.clock().install(); @@ -803,7 +803,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * describe('wait never resolved promise', () => { * it('async with never resolved promise test', async(() => { * const p = new Promise(() => {}); diff --git a/packages/zone.js/test/jest/jest.spec.js b/packages/zone.js/test/jest/jest.spec.js index eb195ac15db8..aed6f781c2fd 100644 --- a/packages/zone.js/test/jest/jest.spec.js +++ b/packages/zone.js/test/jest/jest.spec.js @@ -141,7 +141,7 @@ describe('jest modern fakeTimers with zone.js fakeAsync', () => { let d = fakeAsyncZoneSpec.getRealSystemTime(); jest.setSystemTime(d); expect(Date.now()).toEqual(d); - for (let i = 0; i < 100000; i++) {} + for (let i = 0; i < 10_000_000; i++) {} expect(fakeAsyncZoneSpec.getRealSystemTime()).not.toEqual(d); d = fakeAsyncZoneSpec.getRealSystemTime(); let timeoutTriggered = false; diff --git a/packages/zone.js/yarn.lock b/packages/zone.js/yarn.lock index 1b24ffbd1c26..0c307258807a 100644 --- a/packages/zone.js/yarn.lock +++ b/packages/zone.js/yarn.lock @@ -10,7 +10,7 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -19,49 +19,49 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.25.9": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" - integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== +"@babel/compat-data@^7.26.5": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.8.tgz#821c1d35641c355284d4a870b8a4a7b0c141e367" + integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" - integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.9.tgz#71838542a4b1e49dfed353d7acbc6eb89f4a76f2" + integrity sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.0" - "@babel/generator" "^7.26.0" - "@babel/helper-compilation-targets" "^7.25.9" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.9" + "@babel/helper-compilation-targets" "^7.26.5" "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.0" - "@babel/parser" "^7.26.0" - "@babel/template" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.26.0" + "@babel/helpers" "^7.26.9" + "@babel/parser" "^7.26.9" + "@babel/template" "^7.26.9" + "@babel/traverse" "^7.26.9" + "@babel/types" "^7.26.9" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.26.0", "@babel/generator@^7.26.3", "@babel/generator@^7.7.2": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" - integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== +"@babel/generator@^7.26.9", "@babel/generator@^7.7.2": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.9.tgz#75a9482ad3d0cc7188a537aa4910bc59db67cbca" + integrity sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg== dependencies: - "@babel/parser" "^7.26.3" - "@babel/types" "^7.26.3" + "@babel/parser" "^7.26.9" + "@babel/types" "^7.26.9" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" -"@babel/helper-compilation-targets@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" - integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== +"@babel/helper-compilation-targets@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" + integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== dependencies: - "@babel/compat-data" "^7.25.9" + "@babel/compat-data" "^7.26.5" "@babel/helper-validator-option" "^7.25.9" browserslist "^4.24.0" lru-cache "^5.1.1" @@ -85,9 +85,9 @@ "@babel/traverse" "^7.25.9" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" - integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== "@babel/helper-string-parser@^7.25.9": version "7.25.9" @@ -104,20 +104,20 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== -"@babel/helpers@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" - integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== +"@babel/helpers@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.9.tgz#28f3fb45252fc88ef2dc547c8a911c255fc9fef6" + integrity sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA== dependencies: - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.0" + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.9" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" - integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.9.tgz#d9e78bee6dc80f9efd8f2349dcfbbcdace280fd5" + integrity sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A== dependencies: - "@babel/types" "^7.26.3" + "@babel/types" "^7.26.9" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -238,32 +238,32 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/template@^7.25.9", "@babel/template@^7.3.3": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" - integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== +"@babel/template@^7.26.9", "@babel/template@^7.3.3": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.26.9.tgz#4577ad3ddf43d194528cff4e1fa6b232fa609bb2" + integrity sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA== dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/code-frame" "^7.26.2" + "@babel/parser" "^7.26.9" + "@babel/types" "^7.26.9" -"@babel/traverse@^7.25.9": - version "7.26.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" - integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== +"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.9.tgz#4398f2394ba66d05d988b2ad13c219a2c857461a" + integrity sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg== dependencies: "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.3" - "@babel/parser" "^7.26.3" - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.3" + "@babel/generator" "^7.26.9" + "@babel/parser" "^7.26.9" + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3", "@babel/types@^7.3.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" - integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.9", "@babel/types@^7.3.3": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.9.tgz#08b43dec79ee8e682c2ac631c010bdcac54a21ce" + integrity sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -628,9 +628,9 @@ parse5 "^7.0.0" "@types/node@*": - version "22.10.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.5.tgz#95af89a3fb74a2bb41ef9927f206e6472026e48b" - integrity sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ== + version "22.13.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.4.tgz#3fe454d77cd4a2d73c214008b3e331bfaaf5038a" + integrity sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg== dependencies: undici-types "~6.20.0" @@ -858,9 +858,9 @@ browser-stdout@^1.3.1: integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserslist@^4.24.0: - version "4.24.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.3.tgz#5fc2725ca8fb3c1432e13dac278c7cc103e026d2" - integrity sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA== + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== dependencies: caniuse-lite "^1.0.30001688" electron-to-chromium "^1.5.73" @@ -895,9 +895,9 @@ camelcase@^6.0.0, camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001688: - version "1.0.30001690" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" - integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== + version "1.0.30001699" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz#a102cf330d153bf8c92bfb5be3cd44c0a89c8c12" + integrity sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w== chalk@4.x, chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" @@ -933,18 +933,9 @@ ci-info@^3.2.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" - integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" + version "1.4.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d" + integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== cliui@^8.0.1: version "8.0.1" @@ -1084,9 +1075,9 @@ decamelize@^4.0.0: integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== decimal.js@^10.4.2: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + version "10.5.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.5.0.tgz#0f371c7cf6c4898ce0afb09836db73cd82010f22" + integrity sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw== dedent@^1.0.0: version "1.5.3" @@ -1135,9 +1126,9 @@ eastasianwidth@^0.2.0: integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.5.73: - version "1.5.76" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz#db20295c5061b68f07c8ea4dfcbd701485d94a3d" - integrity sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ== + version "1.5.100" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.100.tgz#c99b7cfe49ec72c5e22237f036bb8b1d8b7f0621" + integrity sha512-u1z9VuzDXV86X2r3vAns0/5ojfXBue9o0+JDUDBKYqGLjxLkSqsSUoPU/6kW0gx76V44frHaf6Zo+QF74TQCMg== emittery@^0.13.1: version "0.13.1" @@ -2197,9 +2188,9 @@ minimist@1.x: integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== mocha@^11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.0.1.tgz#85c1c0e806275fe2479245be4ac4a0d81f533aa8" - integrity sha512-+3GkODfsDG71KSCQhc4IekSW+ItCK/kiez1Z28ksWvYhKXV/syxMlerR/sC7whDp7IyreZ4YxceMLdTs5hQE8A== + version "11.1.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.1.0.tgz#20d7c6ac4d6d6bcb60a8aa47971fca74c65c3c66" + integrity sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg== dependencies: ansi-colors "^4.1.3" browser-stdout "^1.3.1" @@ -2218,8 +2209,8 @@ mocha@^11.0.0: strip-json-comments "^3.1.1" supports-color "^8.1.1" workerpool "^6.5.1" - yargs "^16.2.0" - yargs-parser "^20.2.9" + yargs "^17.7.2" + yargs-parser "^21.1.1" yargs-unparser "^2.0.0" mock-require@3.0.3: @@ -2371,7 +2362,7 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -picocolors@^1.0.0, picocolors@^1.1.0: +picocolors@^1.0.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== @@ -2543,9 +2534,9 @@ semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.5.3, semver@^7.5.4: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== serialize-javascript@^6.0.2: version "6.0.2" @@ -2782,12 +2773,12 @@ universalify@^0.2.0: integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== update-browserslist-db@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" - integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" + integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== dependencies: escalade "^3.2.0" - picocolors "^1.1.0" + picocolors "^1.1.1" url-parse@^1.5.3: version "1.5.10" @@ -2946,11 +2937,6 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yargs-parser@^20.2.2, yargs-parser@^20.2.9: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" @@ -2966,20 +2952,7 @@ yargs-unparser@^2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.3.1: +yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== diff --git a/renovate.json b/renovate.json index c0f90707eb67..a7805f293cf6 100644 --- a/renovate.json +++ b/renovate.json @@ -26,6 +26,9 @@ "executionMode": "branch" }, "ignoreDeps": [ + "@bazel/ibazel", + "@bazel/runfiles", + "@rollup/plugin-node-resolve", "@types/node", "@types/selenium-webdriver", "angular-1.5", @@ -36,29 +39,27 @@ "angular-mocks-1.6", "angular-mocks-1.7", "angular-mocks-1.8", - "remark", - "remark-html", - "selenium-webdriver", - "watchr", - "rxjs", - "glob", + "aspect_bazel_lib", + "build_bazel_rules_nodejs", "chalk", "convert-source-map", - "@rollup/plugin-node-resolve", - "hast-util-is-element", + "glob", "hast-util-has-property", + "hast-util-is-element", "hast-util-to-string", "rehype-slug", + "remark", + "remark-html", "rollup", + "rules_pkg", + "rxjs", + "selenium-webdriver", "systemjs", "unist-util-filter", "unist-util-source", "unist-util-visit", "unist-util-visit-parents", - "rules_pkg", - "aspect_bazel_lib", - "@bazel/runfiles", - "build_bazel_rules_nodejs" + "watchr" ], "packageRules": [ { diff --git a/tools/manual_api_docs/blocks/for.md b/tools/manual_api_docs/blocks/for.md index 2ad9fa9c6562..f3520567ff72 100644 --- a/tools/manual_api_docs/blocks/for.md +++ b/tools/manual_api_docs/blocks/for.md @@ -19,6 +19,8 @@ but there are performance advantages of using a regular `Array`. You can optionally include an `@empty` section immediately after the `@for` block content. The content of the `@empty` block displays when there are no items. +Angular's `@for` block does not support flow-modifying statements like JavaScript's `continue` or `break`. + ### `track` and objects identity The value of the `track` expression determines a key used to associate array items with the views in diff --git a/tools/manual_api_docs/blocks/let.md b/tools/manual_api_docs/blocks/let.md index 8b6d9778202a..cb76226d0598 100644 --- a/tools/manual_api_docs/blocks/let.md +++ b/tools/manual_api_docs/blocks/let.md @@ -45,4 +45,4 @@ The `@let` syntax is formally defined as: - Followed by an Angular expression which can be multi-line. - Terminated by the `;` symbol. -HELPFUL: A comprehensive description of the feature is availble on [the templates guide](guide/templates/variables#local-template-variables-with-let) +HELPFUL: A comprehensive description of the feature is available on [the templates guide](guide/templates/variables#local-template-variables-with-let) diff --git a/yarn.lock b/yarn.lock index 62250d95cf61..bc7a0c95e4e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -40,121 +40,121 @@ resolved "https://registry.yarnpkg.com/@actions/io/-/io-1.1.3.tgz#4cdb6254da7962b07473ff5c335f3da485d94d71" integrity sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q== -"@algolia/client-abtesting@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.18.0.tgz#1bc368444d08b6e48ce56f1d5c935bfb9f658a98" - integrity sha512-DLIrAukjsSrdMNNDx1ZTks72o4RH/1kOn8Wx5zZm8nnqFexG+JzY4SANnCNEjnFQPJTTvC+KpgiNW/CP2lumng== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/client-analytics@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.18.0.tgz#de0dc80011fdbaa9853adbdb836e0a80f08f53df" - integrity sha512-0VpGG2uQW+h2aejxbG8VbnMCQ9ary9/ot7OASXi6OjE0SRkYQ/+pkW+q09+IScif3pmsVVYggmlMPtAsmYWHng== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/client-common@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.18.0.tgz#8de3991b25ff3c9bbf5ef06c19f6a4a4fa64f328" - integrity sha512-X1WMSC+1ve2qlMsemyTF5bIjwipOT+m99Ng1Tyl36ZjQKTa54oajBKE0BrmM8LD8jGdtukAgkUhFoYOaRbMcmQ== - -"@algolia/client-insights@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.18.0.tgz#2c6f158e57265fd0888f5b84fe7302d6d659c0ff" - integrity sha512-FAJRNANUOSs/FgYOJ/Njqp+YTe4TMz2GkeZtfsw1TMiA5mVNRS/nnMpxas9771aJz7KTEWvK9GwqPs0K6RMYWg== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/client-personalization@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.18.0.tgz#26128f6a1aef523ae32f29ef9afd18fd2f159b98" - integrity sha512-I2dc94Oiwic3SEbrRp8kvTZtYpJjGtg5y5XnqubgnA15AgX59YIY8frKsFG8SOH1n2rIhUClcuDkxYQNXJLg+w== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/client-query-suggestions@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.18.0.tgz#9911560aa2dd26984a6d3f9803f14aecc2f1d10e" - integrity sha512-x6XKIQgKFTgK/bMasXhghoEjHhmgoP61pFPb9+TaUJ32aKOGc65b12usiGJ9A84yS73UDkXS452NjyP50Knh/g== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/client-search@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.18.0.tgz#26a3b55b6783cf7eaa8c28b48b891ed245c7e708" - integrity sha512-qI3LcFsVgtvpsBGR7aNSJYxhsR+Zl46+958ODzg8aCxIcdxiK7QEVLMJMZAR57jGqW0Lg/vrjtuLFDMfSE53qA== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/ingestion@1.18.0": - version "1.18.0" - resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.18.0.tgz#023e2fda366655b0e8f2cdddd98666412815429d" - integrity sha512-bGvJg7HnGGm+XWYMDruZXWgMDPVt4yCbBqq8DM6EoaMBK71SYC4WMfIdJaw+ABqttjBhe6aKNRkWf/bbvYOGyw== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/monitoring@1.18.0": - version "1.18.0" - resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.18.0.tgz#e94a4c436be0d8c1e9d19c69aeff8e67d0237736" - integrity sha512-lBssglINIeGIR+8KyzH05NAgAmn1BCrm5D2T6pMtr/8kbTHvvrm1Zvcltc5dKUQEFyyx3J5+MhNc7kfi8LdjVw== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/recommend@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.18.0.tgz#bd07d3057dd2030718c6707a4fe247b871f1834d" - integrity sha512-uSnkm0cdAuFwdMp4pGT5vHVQ84T6AYpTZ3I0b3k/M3wg4zXDhl3aCiY8NzokEyRLezz/kHLEEcgb/tTTobOYVw== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/requester-browser-xhr@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.18.0.tgz#6e7e56bb687904a01c91988393f5c1969944ee3d" - integrity sha512-1XFjW0C3pV0dS/9zXbV44cKI+QM4ZIz9cpatXpsjRlq6SUCpLID3DZHsXyE6sTb8IhyPaUjk78GEJT8/3hviqg== - dependencies: - "@algolia/client-common" "5.18.0" - -"@algolia/requester-fetch@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.18.0.tgz#fcccc76bd7d16fb54c56d15baa6b5f657b17ca71" - integrity sha512-0uodeNdAHz1YbzJh6C5xeQ4T6x5WGiUxUq3GOaT/R4njh5t78dq+Rb187elr7KtnjUmETVVuCvmEYaThfTHzNg== - dependencies: - "@algolia/client-common" "5.18.0" - -"@algolia/requester-node-http@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.18.0.tgz#c5b16de53d83276067583e7b2f56b09eac938435" - integrity sha512-tZCqDrqJ2YE2I5ukCQrYN8oiF6u3JIdCxrtKq+eniuLkjkO78TKRnXrVcKZTmfFJyyDK8q47SfDcHzAA3nHi6w== - dependencies: - "@algolia/client-common" "5.18.0" +"@algolia/client-abtesting@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.20.2.tgz#e0d950735cbe4e00960418749839820a333f9df0" + integrity sha512-IS8JSFsDD33haaKIIFaL7qj3bEIG9GldZfb3ILW0QF3at7TcrIJYy58hrDvFee5T3p3E2aH/+wqIr0eha8jB/w== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/client-analytics@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.20.2.tgz#b8bc4ff50c3968e58b11a56ce50e8732c056ca19" + integrity sha512-k0KxCfcX/HZySqPasKy6GkiiDuebaMh2v/nE0HHg1PbsyeyagLapDi6Ktjkxhz8NlUq6eTJR+ddGJegippKQtQ== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/client-common@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.20.2.tgz#4a80baedbe739ae84fde300a1f539508e5ae38a7" + integrity sha512-xoZcL/Uu49KYDb3feu2n06gALD17p5CslO8Zk3mZ7+uTurK3lgjLws7LNetZ172Ap/GpzPCRXI83d2iDoYQD6Q== + +"@algolia/client-insights@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.20.2.tgz#cf1c21e2c40c3751276c27048c72a3b164b0a4f2" + integrity sha512-fy7aCbo9y7WHt/9G03EYc471Dd5kIaM8PNP4z6AEQYr9a9X8c4inwNs6tePxAEfRHwVQi0CZ7kuVdn6/MjWx1A== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/client-personalization@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.20.2.tgz#ab8342c1e5f1a4ae71383dffdb25910c5df9d06e" + integrity sha512-ocL1ZXulfuXzJAwsKw2kMscKMD0rs/f4CFYu6Gjh4mK4um6rGfa1a6u1MSc4swFqRQer0wNP9Pi+kVfKhuKt5A== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/client-query-suggestions@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.20.2.tgz#fc2d5836aaf90fba60fc347e0f1b1e8e4ab15592" + integrity sha512-Xjs4Tj1zkLCnmq1ys8RRhLQPy002I6GuT/nbHVdSQmQu4yKCI0gOFbwxHdM6yYPEuE3cJx7A4wSQjCH21mUKsg== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/client-search@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.20.2.tgz#941788be5c238197d30a21237e0b3f28d80db874" + integrity sha512-2cD3RGB5byusLS0DAX1Nvl5MLiv7OoGgQrRs+94dTalqjvK8lGKzxxJhXoVojgx2qcROyIUAIDXFdTqv6NIHaA== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/ingestion@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.20.2.tgz#f506af644979974a6842fb75ac90df8782da4b0d" + integrity sha512-S593Kmhc98+5zdzGet4GrZEBEBGl4vVtqg/MPfW8dCRf9qDRNYSkhBsIzlhQe9JWiohe9oB9LW5meibwOgRmww== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/monitoring@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.20.2.tgz#920ce38c5d2250bc34692bc256b622e72c3f8169" + integrity sha512-bW41aWLYgBv/coJUIT85mkN3kk1VBKsM8tlwB5S/s446Mgc7r8t5TX7kA8kCR2UbwDedOK51i/85/x/rM0ZXbg== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/recommend@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.20.2.tgz#423ebaddf13de43a8eb28b0642b60e85f3393e34" + integrity sha512-wBMf3J1L5ogvU8p8ifHkknDXWn1zdZ2epkqpt2MkUaZynE3G77rrFU9frcO+Pu1FQJQ5xCDTKcYUUcJCDD00rg== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/requester-browser-xhr@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.2.tgz#ec674ae20e9fecde1c1a73c5cb0fcfacd3803bac" + integrity sha512-w+VMzOkIq2XDGg6Ybzr74RlBZvJQnuIdKpVusQSXCXknvxwAwbO457LmoavhZWl06Lcsk9YDx1X2k0zb+iJQmw== + dependencies: + "@algolia/client-common" "5.20.2" + +"@algolia/requester-fetch@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.20.2.tgz#13d59d9c946d9cd3de319865d70db64e255028e4" + integrity sha512-wpjnbvbi3A13b0DvijE45DRYDvwcP5Ttz7RTMkPWTkF1s6AHuo6O2UcwGyaogMAGa1QOOzFYfp5u4YQwMOQx5g== + dependencies: + "@algolia/client-common" "5.20.2" + +"@algolia/requester-node-http@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.20.2.tgz#29bd7333dbec0d24dfecd2e1d8276fe40e67ea9d" + integrity sha512-YuSSdtgUt1dFBTNYUb+2TA5j0Hd0eDXE0bVISjUvTCqmoaGsGLwW+rKI7p1eLQ1r7RESwBAvUwcY1qP2Wl3Lyw== + dependencies: + "@algolia/client-common" "5.20.2" "@ampproject/remapping@2.3.0", "@ampproject/remapping@^2.2.0": version "2.3.0" @@ -164,55 +164,55 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@angular-devkit/architect-cli@0.1901.0-next.2": - version "0.1901.0-next.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect-cli/-/architect-cli-0.1901.0-next.2.tgz#ef4631d284cf1ad37560316e2714968fd7b76703" - integrity sha512-Stp/m4nj9WBHgjrdN4H7woxBA6WzNweLOmCalQy/5eTU/ZyppodPsJIBTYhxv9PECvsW+6VlPMJbzycUMS592g== +"@angular-devkit/architect-cli@0.1902.0-next.2": + version "0.1902.0-next.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect-cli/-/architect-cli-0.1902.0-next.2.tgz#63ff37f2b1296a320e521080eb801c21dbc5965d" + integrity sha512-3dVppTdx3+WNwzw8oxSK5Gt7UCrMh5Rrms7B5IR1avFe1D3V6khyhkIycFU0gLBGXbs3N83yogtSxZckDRjugA== dependencies: - "@angular-devkit/architect" "0.1901.0-next.2" - "@angular-devkit/core" "19.1.0-next.2" + "@angular-devkit/architect" "0.1902.0-next.2" + "@angular-devkit/core" "19.2.0-next.2" ansi-colors "4.1.3" progress "2.0.3" symbol-observable "4.0.0" yargs-parser "21.1.1" -"@angular-devkit/architect@0.1901.0-next.1": - version "0.1901.0-next.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1901.0-next.1.tgz#e2f10e4eb750a3cae149f25c791ea46d12a3a72f" - integrity sha512-bZS5UlLsdL5eF3JqMaheYdIBVYrEIoDs6Q5UN50cJe5gKcakDvn8ky/Dhmv8kxfq5efb9zUevTC5xqnu+cgcmg== +"@angular-devkit/architect@0.1901.0-rc.0": + version "0.1901.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1901.0-rc.0.tgz#0f3c39529b2639910ae0cf084d43187bffffef8e" + integrity sha512-BDZV/o1afvbUu8dqr77jjTovcC03DfQB/LGoSN6BkW2vu0jwFCHPXdc/D588p0Bw8cdlMJghkyQhqZ7SHPRivg== dependencies: - "@angular-devkit/core" "19.1.0-next.1" + "@angular-devkit/core" "19.1.0-rc.0" rxjs "7.8.1" -"@angular-devkit/architect@0.1901.0-next.2": - version "0.1901.0-next.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1901.0-next.2.tgz#eaa8be9d313b0052a28ed8a65ac06ae7b643ae90" - integrity sha512-LJH2kZ6zGgWqCg4l42n/x+1jxUtcgJFrhBR11jXtkQperDvxRmhWpCEbjx0e9frGJbDe3vBlPdPy2PMYimwAvQ== +"@angular-devkit/architect@0.1902.0-next.2": + version "0.1902.0-next.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1902.0-next.2.tgz#68eaa74bd04266d843b90efb8563553ada17638c" + integrity sha512-EWOrRAADKDeirVKfZJsngkgMnjU+SrYdQSqXy6sWcLhxFrd6iQFDarFuYtulHfhyaBv5gDR1119Oc4H7BresGw== dependencies: - "@angular-devkit/core" "19.1.0-next.2" + "@angular-devkit/core" "19.2.0-next.2" rxjs "7.8.1" -"@angular-devkit/build-angular@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-19.1.0-next.2.tgz#2797d13d98a523ce4b211c8d409c89bfccde2c48" - integrity sha512-a5pR6lly9nKnHQ5+NVA6wLHPDW3ziZF0HdOg9VquahssqJoiMc7CrMu0oG3kgb88VYdNJoiHv+EiIQ+7jFbE4g== +"@angular-devkit/build-angular@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-19.2.0-next.2.tgz#db4d88a89f3ec0d84b2680e9dbc90afe55c2c263" + integrity sha512-o3/X02x4p9pCVaPB4uoc2VUL2s2YvGW58jfSHRhwtiLVoIgpnbyHyyhtIdO8rLRr09Pk1fLUvXVY4/d6hjXt1Q== dependencies: "@ampproject/remapping" "2.3.0" - "@angular-devkit/architect" "0.1901.0-next.2" - "@angular-devkit/build-webpack" "0.1901.0-next.2" - "@angular-devkit/core" "19.1.0-next.2" - "@angular/build" "19.1.0-next.2" - "@babel/core" "7.26.0" - "@babel/generator" "7.26.3" + "@angular-devkit/architect" "0.1902.0-next.2" + "@angular-devkit/build-webpack" "0.1902.0-next.2" + "@angular-devkit/core" "19.2.0-next.2" + "@angular/build" "19.2.0-next.2" + "@babel/core" "7.26.8" + "@babel/generator" "7.26.8" "@babel/helper-annotate-as-pure" "7.25.9" "@babel/helper-split-export-declaration" "7.24.7" - "@babel/plugin-transform-async-generator-functions" "7.25.9" + "@babel/plugin-transform-async-generator-functions" "7.26.8" "@babel/plugin-transform-async-to-generator" "7.25.9" - "@babel/plugin-transform-runtime" "7.25.9" - "@babel/preset-env" "7.26.0" - "@babel/runtime" "7.26.0" + "@babel/plugin-transform-runtime" "7.26.8" + "@babel/preset-env" "7.26.8" + "@babel/runtime" "7.26.7" "@discoveryjs/json-ext" "0.6.3" - "@ngtools/webpack" "19.1.0-next.2" + "@ngtools/webpack" "19.2.0-next.2" "@vitejs/plugin-basic-ssl" "1.2.0" ansi-colors "4.1.3" autoprefixer "10.4.20" @@ -220,13 +220,13 @@ browserslist "^4.21.5" copy-webpack-plugin "12.0.2" css-loader "7.1.2" - esbuild-wasm "0.24.0" - fast-glob "3.3.2" + esbuild-wasm "0.25.0" + fast-glob "3.3.3" http-proxy-middleware "3.0.3" istanbul-lib-instrument "6.0.3" jsonc-parser "3.3.1" karma-source-map-support "1.4.0" - less "4.2.1" + less "4.2.2" less-loader "12.2.0" license-webpack-plugin "4.0.2" loader-utils "3.3.1" @@ -235,16 +235,16 @@ ora "5.4.1" picomatch "4.0.2" piscina "4.8.0" - postcss "8.4.49" + postcss "8.5.2" postcss-loader "8.1.1" resolve-url-loader "5.0.0" rxjs "7.8.1" - sass "1.83.0" + sass "1.84.0" sass-loader "16.0.4" - semver "7.6.3" + semver "7.7.1" source-map-loader "5.0.0" source-map-support "0.5.21" - terser "5.37.0" + terser "5.38.2" tree-kill "1.2.2" tslib "2.8.1" webpack "5.97.1" @@ -253,7 +253,7 @@ webpack-merge "6.0.1" webpack-subresource-integrity "5.1.0" optionalDependencies: - esbuild "0.24.0" + esbuild "0.25.0" "@angular-devkit/build-optimizer@0.14.0-beta.5": version "0.14.0-beta.5" @@ -265,18 +265,18 @@ typescript "3.2.4" webpack-sources "1.3.0" -"@angular-devkit/build-webpack@0.1901.0-next.2": - version "0.1901.0-next.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1901.0-next.2.tgz#7d6192741ab3de31cd8e2ea6128e23a9a4f520c4" - integrity sha512-i+Q0PaWXec9hKpDgh4k2/ds6Z2GbQj7UfZozaJN1Sen19BGyq4Dl0ADiIr1tgZc6y1Ym09AgCFT0gpI3v4grjg== +"@angular-devkit/build-webpack@0.1902.0-next.2": + version "0.1902.0-next.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1902.0-next.2.tgz#49469c7a104376927d625ffc521a47b40a6c68ed" + integrity sha512-RSHIFtVxFmwxiUN9Nun3ZdlOoo7d+sNKpnexcjOQ01sTWkOtO9wuBgCPCRWjPgs5JSBN6iDAzBQrydlCOqpwgQ== dependencies: - "@angular-devkit/architect" "0.1901.0-next.2" + "@angular-devkit/architect" "0.1902.0-next.2" rxjs "7.8.1" -"@angular-devkit/core@19.1.0-next.1": - version "19.1.0-next.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-19.1.0-next.1.tgz#8f46c3e25cc811945880bb5ebb42b1c885c91ac9" - integrity sha512-2xzT/jBSKuDO2avbB00qiuM4Moir9RcLtK++oyJm/CVQ8tUFppVvpb2MIp0TB/FuV+Tfm8APf0etY0w/fWfWZA== +"@angular-devkit/core@19.1.0-rc.0": + version "19.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-19.1.0-rc.0.tgz#b71c99234200e85d0a74ba526fceb9e465fb50bf" + integrity sha512-0kGErE+1jgEU2a6Q2JCg0XHeI+3PW48ZkINWMgD249TyRO7vC/VChSBMTi3CxuEatxp+1t9MQgMehZSuN4JL9w== dependencies: ajv "8.17.1" ajv-formats "3.0.1" @@ -285,10 +285,10 @@ rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/core@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-19.1.0-next.2.tgz#2e302f300ec3257e15305382829d9c72deee4256" - integrity sha512-e02oakLxYszcpltPhZDuQ2AKGWXblJLU2Ua7xD57BtjQtZt5c10bvePOvU4M5KnD5KqZUzjYQZtC6nqKOVvkMA== +"@angular-devkit/core@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-19.2.0-next.2.tgz#5d26a8cc5a868b38e1dd85f65d75ee8499976abf" + integrity sha512-V1O42Dqo7rcy1VtMwqM/TQr47KQ/B3OXrjmM8G8fQyCZMqT2haknf3r44ZrsKuZqYgEBOZ5ILiHn7X1ojQgscQ== dependencies: ajv "8.17.1" ajv-formats "3.0.1" @@ -297,21 +297,21 @@ rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/schematics@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-19.1.0-next.2.tgz#23025b85f760cfdf124ef8abf992c4d24e473af5" - integrity sha512-He6LD1PYLUWldYZrMZ7N5Z86KujGKFtzUC/wh93L2HnMnMRSARm8AAhZHekntG6BNq/0SOVFVL0g3C05aQjBOg== +"@angular-devkit/schematics@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-19.2.0-next.2.tgz#6b382f24118b68943bf192f4ac4ba5ea7c67a318" + integrity sha512-p8Q7insna5BD+EbEJZvykxxgRm0gwe5Fjar+oXSnmiwd4RX/nNP46IZXPxZM65hq6IRDx2sVk6Scfd1GbPrseQ== dependencies: - "@angular-devkit/core" "19.1.0-next.2" + "@angular-devkit/core" "19.2.0-next.2" jsonc-parser "3.3.1" - magic-string "0.30.15" + magic-string "0.30.17" ora "5.4.1" rxjs "7.8.1" -"@angular/animations@^19.1.0-next": - version "19.1.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-19.1.0-next.4.tgz#62dff46f056e3533bd1ef73253dfc81364080d82" - integrity sha512-UJQVQsMSloo+1IITfE3pqQL/Gmm7nt5XtKaz+cXUGeTPS5szDFrUjmFJSWVmcj595FmqaiFBL8fuxgWv+Qmvlg== +"@angular/animations@^19.2.0-next": + version "19.2.0-next.3" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-19.2.0-next.3.tgz#14633e295cba9f1903e015577337a09f7e0b56ba" + integrity sha512-yG941CZo2RbBX3ap5mw7heKFSmxPAVRSzHaIun3S6FkSZ40PdhVDKPV6ATGvv6Q8IhuCS1uSyWWSczdYI4N8hw== dependencies: tslib "^2.3.0" @@ -323,13 +323,12 @@ "@angular/core" "^13.0.0 || ^14.0.0-0" reflect-metadata "^0.1.13" -"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#0850ed7e3d784457d3ecac29d48a3241c6eb7da0": - version "0.0.0-289aa644e65a557bcb21adcf75ad60605a9c9859" - uid "0850ed7e3d784457d3ecac29d48a3241c6eb7da0" - resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#0850ed7e3d784457d3ecac29d48a3241c6eb7da0" +"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#ce04ec6cf7604014191821a637e60964a1a3bb4a": + version "0.0.0-2670abf637fa155971cdd1f7e570a7f234922a65" + resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#ce04ec6cf7604014191821a637e60964a1a3bb4a" dependencies: "@angular/benchpress" "0.3.0" - "@angular/build" "19.1.0-next.1" + "@angular/build" "19.1.0-rc.0" "@babel/core" "^7.16.0" "@babel/plugin-proposal-async-generator-functions" "^7.20.1" "@bazel/buildifier" "6.3.3" @@ -339,7 +338,7 @@ "@bazel/runfiles" "5.8.1" "@bazel/terser" "5.8.1" "@bazel/typescript" "5.8.1" - "@microsoft/api-extractor" "7.48.0" + "@microsoft/api-extractor" "7.49.1" "@types/browser-sync" "^2.26.3" "@types/minimatch" "^5.1.2" "@types/node" "^18.19.21" @@ -357,105 +356,105 @@ tmp "^0.2.1" "true-case-path" "^2.2.1" tslib "^2.5.2" - typescript "5.7.2" + typescript "5.7.3" uuid "^11.0.0" yargs "^17.0.0" -"@angular/build@19.1.0-next.1": - version "19.1.0-next.1" - resolved "https://registry.yarnpkg.com/@angular/build/-/build-19.1.0-next.1.tgz#8b9ff247f3ec9463dc9bdf99640ede88feb70726" - integrity sha512-rLzY+2AxkNb82TSRp7DaZH/y0/ZdUV3g0OwJl7ajXvyIH0oJgq5mtNAO4VUreU+MR6h3tGO+XJRg6W0OUM9rzw== +"@angular/build@19.1.0-rc.0": + version "19.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular/build/-/build-19.1.0-rc.0.tgz#7ac3a48be233c2978d94d3587badc74a817d60bd" + integrity sha512-ALl+MVMYBF+E7HyAQ+1MtE6sNIOAX0o2Sfs0wdIQfM2unRl6jPsz/Ker4BjnNQIK4wRCcstyzBv5mZBDulfFIQ== dependencies: "@ampproject/remapping" "2.3.0" - "@angular-devkit/architect" "0.1901.0-next.1" + "@angular-devkit/architect" "0.1901.0-rc.0" "@babel/core" "7.26.0" "@babel/helper-annotate-as-pure" "7.25.9" "@babel/helper-split-export-declaration" "7.24.7" "@babel/plugin-syntax-import-attributes" "7.26.0" - "@inquirer/confirm" "5.1.0" + "@inquirer/confirm" "5.1.1" "@vitejs/plugin-basic-ssl" "1.2.0" beasties "0.2.0" browserslist "^4.23.0" - esbuild "0.24.0" - fast-glob "3.3.2" + esbuild "0.24.2" + fast-glob "3.3.3" https-proxy-agent "7.0.6" istanbul-lib-instrument "6.0.3" listr2 "8.2.5" - magic-string "0.30.15" + magic-string "0.30.17" mrmime "2.0.0" parse5-html-rewriting-stream "7.0.0" picomatch "4.0.2" piscina "4.8.0" - rollup "4.28.1" - sass "1.82.0" + rollup "4.30.1" + sass "1.83.1" semver "7.6.3" - vite "6.0.3" + vite "6.0.7" watchpack "2.4.2" optionalDependencies: - lmdb "3.2.0" + lmdb "3.2.2" -"@angular/build@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@angular/build/-/build-19.1.0-next.2.tgz#0864a7a4d9e7fab35d66d07374d01634375211b3" - integrity sha512-HDyPsyyqbMpUQXA3VBcfFcGu6sj0vxKL/DEKxnxIgbC9dZ/01yNDMTPIszpGg16fRPt10xEefx3hUFMMgYzWJQ== +"@angular/build@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@angular/build/-/build-19.2.0-next.2.tgz#c08ffd25db28fa456f51da7784b19b88feb7590c" + integrity sha512-FmpJla0+M+BE1bQbHIKbl5wKrHsSg6JTIl+kiW/kW4GKKZsS4FJkg56UhyI7+bjuId9s3wptpdMIFpRDaDytRg== dependencies: "@ampproject/remapping" "2.3.0" - "@angular-devkit/architect" "0.1901.0-next.2" - "@babel/core" "7.26.0" + "@angular-devkit/architect" "0.1902.0-next.2" + "@babel/core" "7.26.8" "@babel/helper-annotate-as-pure" "7.25.9" "@babel/helper-split-export-declaration" "7.24.7" "@babel/plugin-syntax-import-attributes" "7.26.0" - "@inquirer/confirm" "5.1.0" + "@inquirer/confirm" "5.1.5" "@vitejs/plugin-basic-ssl" "1.2.0" beasties "0.2.0" browserslist "^4.23.0" - esbuild "0.24.0" - fast-glob "3.3.2" + esbuild "0.25.0" + fast-glob "3.3.3" https-proxy-agent "7.0.6" istanbul-lib-instrument "6.0.3" listr2 "8.2.5" - magic-string "0.30.15" + magic-string "0.30.17" mrmime "2.0.0" parse5-html-rewriting-stream "7.0.0" picomatch "4.0.2" piscina "4.8.0" - rollup "4.28.1" - sass "1.83.0" - semver "7.6.3" - vite "6.0.3" + rollup "4.34.6" + sass "1.84.0" + semver "7.7.1" + vite "6.1.0" watchpack "2.4.2" optionalDependencies: - lmdb "3.2.0" + lmdb "3.2.6" -"@angular/cdk@19.1.0-next.3": - version "19.1.0-next.3" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-19.1.0-next.3.tgz#7966fffbd21b1b14cedbe79766a29ffd38464ae9" - integrity sha512-7JX7kzV3PmeXwoL7dd2xLjDvZ7w/U+vuP/IHxSv0p+ThBZraMibcSUK/OeFC2XDKMs7Z8/0YnH/OWaAkxj8gmA== +"@angular/cdk@19.2.0-next.4": + version "19.2.0-next.4" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-19.2.0-next.4.tgz#a3c9fe76a712974e26828ae04e37761805efeda4" + integrity sha512-fmmwokyT2IGLRGzQEj2j4EoQBNdML+QYKyH3J3KlGN7i3p3G63uitzrvz5sEAdsXnpebxemhAs9aPW+HPhsvew== dependencies: tslib "^2.3.0" optionalDependencies: parse5 "^7.1.2" -"@angular/cli@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-19.1.0-next.2.tgz#32b3f6bfa2e35f01e28e26ad4fe2e0ab2a25dacd" - integrity sha512-Z1HLXWMaw/FVmkuBibpB1X85a2m+gWvtwc8ZFG11ulKhqMiCNo1bFzWrJh4wqbOHXlw8RBkklOuWVmhaWuFg8g== +"@angular/cli@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-19.2.0-next.2.tgz#97074ebe6dc6b024561b74125c6184670f836b61" + integrity sha512-sWh9Ltn45rZTHnsbOTNh7hBUiUyJSOLpiOBkaRkJwyH+021PapuCIXr5PBLgkEI2o++DtIXvAdE3UHPKEvRQ/A== dependencies: - "@angular-devkit/architect" "0.1901.0-next.2" - "@angular-devkit/core" "19.1.0-next.2" - "@angular-devkit/schematics" "19.1.0-next.2" - "@inquirer/prompts" "7.2.0" + "@angular-devkit/architect" "0.1902.0-next.2" + "@angular-devkit/core" "19.2.0-next.2" + "@angular-devkit/schematics" "19.2.0-next.2" + "@inquirer/prompts" "7.3.1" "@listr2/prompt-adapter-inquirer" "2.0.18" - "@schematics/angular" "19.1.0-next.2" + "@schematics/angular" "19.2.0-next.2" "@yarnpkg/lockfile" "1.1.0" ini "5.0.0" jsonc-parser "3.3.1" listr2 "8.2.5" - npm-package-arg "12.0.1" + npm-package-arg "12.0.2" npm-pick-manifest "10.0.0" pacote "20.0.0" - resolve "1.22.8" - semver "7.6.3" + resolve "1.22.10" + semver "7.7.1" symbol-observable "4.0.0" yargs "17.7.2" @@ -466,56 +465,56 @@ dependencies: tslib "^2.3.0" -"@angular/core@^19.1.0-next": - version "19.1.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-19.1.0-next.4.tgz#02c60c0f40c970a55786ef310c53d711c8b1c8ce" - integrity sha512-TxgjuK2VZPSWP3Wn8EzWZphyOXz8Mwq/OKSBkPKfUkgM8fxZAZ/kORFu+Db96Ov3SgCvDYy5mmDCoCgC8IKGbg== +"@angular/core@^19.2.0-next": + version "19.2.0-next.3" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-19.2.0-next.3.tgz#c352ccda7afc9bd321ec0b23d87f273b9cdb1cc5" + integrity sha512-AvbXcJZjo2djukfVsSOHQFQ6yV/D1aySqMxlwpNdGwr/cL03Rsf+Is40NBl9uakhJSg9UN16k5klmul0hczIhQ== dependencies: tslib "^2.3.0" -"@angular/material@19.1.0-next.3": - version "19.1.0-next.3" - resolved "https://registry.yarnpkg.com/@angular/material/-/material-19.1.0-next.3.tgz#6c58e47c28fc5d893841c68ed79ac1eb2db17256" - integrity sha512-aq92B77YkgHSoew2aN2Fqeg9eu/DiL3c09JKul0PW7cQfMejYU1UmiiyhXS5MhxFdVofhsJdV5C8m4aMzjagVw== +"@angular/material@19.2.0-next.4": + version "19.2.0-next.4" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-19.2.0-next.4.tgz#4fa6cd7216b52edff40d617cbea276c0b1ffb8fe" + integrity sha512-darSa77CFdlVFax88GLNJWstHJp8j5qUo/kbQwUNsN0ltigS4o7eaczBA9ukekoSpXSgijq6y2VfnkkYi8hCZQ== dependencies: tslib "^2.3.0" -"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#d300539f8ebeadaa46e6cb8ed36e4748ac6d303a": - version "0.0.0-289aa644e65a557bcb21adcf75ad60605a9c9859" - uid d300539f8ebeadaa46e6cb8ed36e4748ac6d303a - resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#d300539f8ebeadaa46e6cb8ed36e4748ac6d303a" +"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#252589f7bc8fe6ca13b31e02d506ec52e826cdd2": + version "0.0.0-0ad6a370f70638e785d6ef1f90dc6ede34684a47" + resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#252589f7bc8fe6ca13b31e02d506ec52e826cdd2" dependencies: - "@google-cloud/spanner" "7.16.0" - "@octokit/rest" "21.0.2" + "@google-cloud/spanner" "7.18.1" + "@octokit/rest" "21.1.1" "@types/semver" "^7.3.6" - "@types/supports-color" "^8.1.1" + "@types/supports-color" "^10.0.0" "@yarnpkg/lockfile" "^1.1.0" chalk "^5.0.1" semver "^7.5.4" - supports-color "9.4.0" + supports-color "10.0.0" typed-graphqlify "^3.1.1" typescript "~4.9.0" - yaml "2.6.1" + which "^5.0.0" + yaml "2.7.0" -"@angular/ssr@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@angular/ssr/-/ssr-19.1.0-next.2.tgz#ccc570eb5b34c346e037d8fdf0819f0328b20fc6" - integrity sha512-UBSkHUi9W+N5q+IgVNtwt8u6Sfcjj8sOesgUjEWPcqKUrVjIpVNVJLPP2t6WkogTqyRWOHH2zuGktKzglBQaeA== +"@angular/ssr@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@angular/ssr/-/ssr-19.2.0-next.2.tgz#c1205c1cdc5a7375225b05b40e84f80c3a5e1b49" + integrity sha512-JN5Utru8xJRpCF+ArG3CCgzlCYgbnB2XUV4J6uO56KgdqK5OeCOCcsuJYBHu+ifaF4ecb74JdXWm0VgB/HQKXA== dependencies: tslib "^2.3.0" -"@antfu/install-pkg@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-0.4.1.tgz#d1d7f3be96ecdb41581629cafe8626d1748c0cf1" - integrity sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw== +"@antfu/install-pkg@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-1.0.0.tgz#2912a150fc8b35ec912f583f90074ee98f64d66a" + integrity sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw== dependencies: - package-manager-detector "^0.2.0" - tinyexec "^0.3.0" + package-manager-detector "^0.2.8" + tinyexec "^0.3.2" -"@antfu/utils@^0.7.10": - version "0.7.10" - resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-0.7.10.tgz#ae829f170158e297a9b6a28f161a8e487d00814d" - integrity sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww== +"@antfu/utils@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-8.1.0.tgz#eea8fd74f35942a31c98f2bbd5a79b20bc18a515" + integrity sha512-XPR7Jfwp0FFl/dFYPX8ZjpmU4/1mIXTjnZ1ba48BLMyKOV62/tiRjdsFcPs2hsYcSud4tzk7w3a3LjX8Fu3huA== "@apidevtools/json-schema-ref-parser@^9.0.3": version "9.1.2" @@ -527,6 +526,17 @@ call-me-maybe "^1.0.1" js-yaml "^4.1.0" +"@asamuzakjp/css-color@^2.8.2": + version "2.8.3" + resolved "https://registry.yarnpkg.com/@asamuzakjp/css-color/-/css-color-2.8.3.tgz#665f0f5e8edb95d8f543847529e30fe5cc437ef7" + integrity sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw== + dependencies: + "@csstools/css-calc" "^2.1.1" + "@csstools/css-color-parser" "^3.0.7" + "@csstools/css-parser-algorithms" "^3.0.4" + "@csstools/css-tokenizer" "^3.0.3" + lru-cache "^10.4.3" + "@babel/cli@7.26.4": version "7.26.4" resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.26.4.tgz#4101ff8ee5de8447a6c395397a97921056411d20" @@ -543,7 +553,7 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.6.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -552,12 +562,12 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" - integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.5", "@babel/compat-data@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.8.tgz#821c1d35641c355284d4a870b8a4a7b0c141e367" + integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== -"@babel/core@7.26.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.23.9": +"@babel/core@7.26.0": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== @@ -578,13 +588,67 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@7.26.3", "@babel/generator@^7.26.0", "@babel/generator@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" - integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== +"@babel/core@7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.8.tgz#7742f11c75acea6b08a8e24c5c0c8c89e89bf53e" + integrity sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.8" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.7" + "@babel/parser" "^7.26.8" + "@babel/template" "^7.26.8" + "@babel/traverse" "^7.26.8" + "@babel/types" "^7.26.8" + "@types/gensync" "^1.0.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/core@7.26.9", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.23.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.9.tgz#71838542a4b1e49dfed353d7acbc6eb89f4a76f2" + integrity sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw== dependencies: - "@babel/parser" "^7.26.3" - "@babel/types" "^7.26.3" + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.9" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.9" + "@babel/parser" "^7.26.9" + "@babel/template" "^7.26.9" + "@babel/traverse" "^7.26.9" + "@babel/types" "^7.26.9" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.8.tgz#f9c5e770309e12e3099ad8271e52f6caa15442ab" + integrity sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA== + dependencies: + "@babel/parser" "^7.26.8" + "@babel/types" "^7.26.8" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/generator@7.26.9", "@babel/generator@^7.26.0", "@babel/generator@^7.26.8", "@babel/generator@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.9.tgz#75a9482ad3d0cc7188a537aa4910bc59db67cbca" + integrity sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg== + dependencies: + "@babel/parser" "^7.26.9" + "@babel/types" "^7.26.9" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -596,28 +660,28 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" - integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9", "@babel/helper-compilation-targets@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" + integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== dependencies: - "@babel/compat-data" "^7.25.9" + "@babel/compat-data" "^7.26.5" "@babel/helper-validator-option" "^7.25.9" browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz#7644147706bb90ff613297d49ed5266bde729f83" - integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ== + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz#d6f83e3039547fbb39967e78043cd3c8b7820c71" + integrity sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg== dependencies: "@babel/helper-annotate-as-pure" "^7.25.9" "@babel/helper-member-expression-to-functions" "^7.25.9" "@babel/helper-optimise-call-expression" "^7.25.9" - "@babel/helper-replace-supers" "^7.25.9" + "@babel/helper-replace-supers" "^7.26.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/traverse" "^7.26.9" semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": @@ -679,10 +743,10 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" - integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.26.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== "@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.25.9": version "7.25.9" @@ -693,14 +757,14 @@ "@babel/helper-wrap-function" "^7.25.9" "@babel/traverse" "^7.25.9" -"@babel/helper-replace-supers@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" - integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ== +"@babel/helper-replace-supers@^7.25.9", "@babel/helper-replace-supers@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz#6cb04e82ae291dae8e72335dfe438b0725f14c8d" + integrity sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg== dependencies: "@babel/helper-member-expression-to-functions" "^7.25.9" "@babel/helper-optimise-call-expression" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/traverse" "^7.26.5" "@babel/helper-skip-transparent-expression-wrappers@^7.25.9": version "7.25.9" @@ -741,20 +805,20 @@ "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/helpers@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" - integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== +"@babel/helpers@^7.26.0", "@babel/helpers@^7.26.7", "@babel/helpers@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.9.tgz#28f3fb45252fc88ef2dc547c8a911c255fc9fef6" + integrity sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA== dependencies: - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.0" + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.9" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.25.3", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" - integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.3", "@babel/parser@^7.26.0", "@babel/parser@^7.26.7", "@babel/parser@^7.26.8", "@babel/parser@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.9.tgz#d9e78bee6dc80f9efd8f2349dcfbbcdace280fd5" + integrity sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A== dependencies: - "@babel/types" "^7.26.3" + "@babel/types" "^7.26.9" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" @@ -795,7 +859,7 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/traverse" "^7.25.9" -"@babel/plugin-proposal-async-generator-functions@^7.20.1": +"@babel/plugin-proposal-async-generator-functions@7.20.7", "@babel/plugin-proposal-async-generator-functions@^7.20.1": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== @@ -846,14 +910,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-async-generator-functions@7.25.9", "@babel/plugin-transform-async-generator-functions@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz#1b18530b077d18a407c494eb3d1d72da505283a2" - integrity sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw== +"@babel/plugin-transform-async-generator-functions@7.26.8", "@babel/plugin-transform-async-generator-functions@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz#5e3991135e3b9c6eaaf5eff56d1ae5a11df45ff8" + integrity sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/helper-remap-async-to-generator" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/traverse" "^7.26.8" "@babel/plugin-transform-async-to-generator@7.25.9", "@babel/plugin-transform-async-to-generator@^7.25.9": version "7.25.9" @@ -864,12 +928,12 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/helper-remap-async-to-generator" "^7.25.9" -"@babel/plugin-transform-block-scoped-functions@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458" - integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA== +"@babel/plugin-transform-block-scoped-functions@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz#3dc4405d31ad1cbe45293aa57205a6e3b009d53e" + integrity sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/plugin-transform-block-scoping@^7.25.9": version "7.25.9" @@ -951,7 +1015,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-exponentiation-operator@^7.25.9": +"@babel/plugin-transform-exponentiation-operator@^7.26.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== @@ -966,11 +1030,11 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-for-of@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz#4bdc7d42a213397905d89f02350c5267866d5755" - integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A== + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz#27231f79d5170ef33b5111f07fe5cafeb2c96a56" + integrity sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" "@babel/plugin-transform-function-name@^7.25.9": @@ -1018,7 +1082,7 @@ "@babel/helper-module-transforms" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.25.9": +"@babel/plugin-transform-modules-commonjs@^7.26.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== @@ -1059,12 +1123,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-nullish-coalescing-operator@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz#bcb1b0d9e948168102d5f7104375ca21c3266949" - integrity sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog== +"@babel/plugin-transform-nullish-coalescing-operator@^7.26.6": + version "7.26.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz#fbf6b3c92cb509e7b319ee46e3da89c5bedd31fe" + integrity sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/plugin-transform-numeric-separator@^7.25.9": version "7.25.9" @@ -1159,13 +1223,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-runtime@7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea" - integrity sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ== +"@babel/plugin-transform-runtime@7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.8.tgz#e025e062c08809db61de7e249193a8de1bc83092" + integrity sha512-H0jlQxFMI0Q8SyGPsj9pO3ygVQRxPkIGytsL3m1Zqca8KrCPpMlvh+e2dxknqdfS8LFwBw+PpiYPD9qy/FPQpA== dependencies: "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.6" babel-plugin-polyfill-regenerator "^0.6.1" @@ -1193,19 +1257,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-template-literals@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz#6dbd4a24e8fad024df76d1fac6a03cf413f60fe1" - integrity sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw== +"@babel/plugin-transform-template-literals@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz#966b15d153a991172a540a69ad5e1845ced990b5" + integrity sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" -"@babel/plugin-transform-typeof-symbol@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz#224ba48a92869ddbf81f9b4a5f1204bbf5a2bc4b" - integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA== +"@babel/plugin-transform-typeof-symbol@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz#d0e33acd9223744c1e857dbd6fa17bd0a3786937" + integrity sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/plugin-transform-unicode-escapes@^7.25.9": version "7.25.9" @@ -1238,14 +1302,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/preset-env@7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.0.tgz#30e5c6bc1bcc54865bff0c5a30f6d4ccdc7fa8b1" - integrity sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw== +"@babel/preset-env@7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.8.tgz#7af0090829b606d2046db99679004731e1dc364d" + integrity sha512-um7Sy+2THd697S4zJEfv/U5MHGJzkN2xhtsR3T/SWRbVSic62nbISh51VVfU9JiO/L/Z97QczHTaFVkOU8IzNg== dependencies: - "@babel/compat-data" "^7.26.0" - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/compat-data" "^7.26.8" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/helper-validator-option" "^7.25.9" "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" @@ -1257,9 +1321,9 @@ "@babel/plugin-syntax-import-attributes" "^7.26.0" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.25.9" - "@babel/plugin-transform-async-generator-functions" "^7.25.9" + "@babel/plugin-transform-async-generator-functions" "^7.26.8" "@babel/plugin-transform-async-to-generator" "^7.25.9" - "@babel/plugin-transform-block-scoped-functions" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.26.5" "@babel/plugin-transform-block-scoping" "^7.25.9" "@babel/plugin-transform-class-properties" "^7.25.9" "@babel/plugin-transform-class-static-block" "^7.26.0" @@ -1270,7 +1334,7 @@ "@babel/plugin-transform-duplicate-keys" "^7.25.9" "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" "@babel/plugin-transform-dynamic-import" "^7.25.9" - "@babel/plugin-transform-exponentiation-operator" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.26.3" "@babel/plugin-transform-export-namespace-from" "^7.25.9" "@babel/plugin-transform-for-of" "^7.25.9" "@babel/plugin-transform-function-name" "^7.25.9" @@ -1279,12 +1343,12 @@ "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" "@babel/plugin-transform-member-expression-literals" "^7.25.9" "@babel/plugin-transform-modules-amd" "^7.25.9" - "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.26.3" "@babel/plugin-transform-modules-systemjs" "^7.25.9" "@babel/plugin-transform-modules-umd" "^7.25.9" "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" "@babel/plugin-transform-new-target" "^7.25.9" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.26.6" "@babel/plugin-transform-numeric-separator" "^7.25.9" "@babel/plugin-transform-object-rest-spread" "^7.25.9" "@babel/plugin-transform-object-super" "^7.25.9" @@ -1300,17 +1364,17 @@ "@babel/plugin-transform-shorthand-properties" "^7.25.9" "@babel/plugin-transform-spread" "^7.25.9" "@babel/plugin-transform-sticky-regex" "^7.25.9" - "@babel/plugin-transform-template-literals" "^7.25.9" - "@babel/plugin-transform-typeof-symbol" "^7.25.9" + "@babel/plugin-transform-template-literals" "^7.26.8" + "@babel/plugin-transform-typeof-symbol" "^7.26.7" "@babel/plugin-transform-unicode-escapes" "^7.25.9" "@babel/plugin-transform-unicode-property-regex" "^7.25.9" "@babel/plugin-transform-unicode-regex" "^7.25.9" "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.6" + babel-plugin-polyfill-corejs3 "^0.11.0" babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.38.1" + core-js-compat "^3.40.0" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": @@ -1322,39 +1386,46 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@7.26.0", "@babel/runtime@^7.8.4": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" - integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== +"@babel/runtime@7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.7.tgz#f4e7fe527cd710f8dc0618610b61b4b060c3c341" + integrity sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" - integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== +"@babel/runtime@^7.8.4": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.9.tgz#aa4c6facc65b9cb3f87d75125ffd47781b475433" + integrity sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg== dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/types" "^7.25.9" + regenerator-runtime "^0.14.0" -"@babel/traverse@^7.25.9": - version "7.26.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" - integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== +"@babel/template@^7.25.9", "@babel/template@^7.26.8", "@babel/template@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.26.9.tgz#4577ad3ddf43d194528cff4e1fa6b232fa609bb2" + integrity sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA== dependencies: "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.3" - "@babel/parser" "^7.26.3" - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.3" + "@babel/parser" "^7.26.9" + "@babel/types" "^7.26.9" + +"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.5", "@babel/traverse@^7.26.8", "@babel/traverse@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.9.tgz#4398f2394ba66d05d988b2ad13c219a2c857461a" + integrity sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.9" + "@babel/parser" "^7.26.9" + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3", "@babel/types@^7.4.4": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" - integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.8", "@babel/types@^7.26.9", "@babel/types@^7.4.4": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.9.tgz#08b43dec79ee8e682c2ac631c010bdcac54a21ce" + integrity sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -1369,10 +1440,10 @@ resolved "https://registry.yarnpkg.com/@bazel/buildifier/-/buildifier-6.3.3.tgz#ff21352ac9f72df6a53cc8ad9b862eb68918c1e9" integrity sha512-0f5eNWhylZQbiTddfVkIXKkugQadzZdonLw4ur58oK4X+gIHOZ42Xv94sepu8Di9UWKFXNc4zxuuTiWM22hGvw== -"@bazel/buildifier@^7.0.0": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@bazel/buildifier/-/buildifier-7.3.1.tgz#ac988d719dd79589ec02db90c1b41ae5c88a0de6" - integrity sha512-qhSjryLo2uHeib/uLc8Yeh6SBisqdf9pPO79QPlyNO3Apc4g9J1Tir/52VdOo9czHTgSasbtOjfWJCPzMoCSIA== +"@bazel/buildifier@^8.0.0": + version "8.0.3" + resolved "https://registry.yarnpkg.com/@bazel/buildifier/-/buildifier-8.0.3.tgz#445c6f078040e8c155fe0922ae1114dafc7ce1ee" + integrity sha512-X4BbSHDZrvXaldGKW0AkBMC0HPOosJyPykE8Z5LpGBCmCdgIhRJHtAjBOG21NRmZpwI8fc7A1rhhSOJ7UGmbFg== "@bazel/concatjs@5.8.1": version "5.8.1" @@ -1388,10 +1459,10 @@ resolved "https://registry.yarnpkg.com/@bazel/esbuild/-/esbuild-5.8.1.tgz#74668d33bfb29652cbe8e2852aa8dca5e0839e73" integrity sha512-8k4LL8P3ivCnFeBOcjiFxL8U+M5VtEGuOyIqm2hfEiP8xDWsZLS7YQ7KhshKJy7Elh2dlK9oGgMtl0D/x9kxxg== -"@bazel/ibazel@^0.25.0": - version "0.25.0" - resolved "https://registry.yarnpkg.com/@bazel/ibazel/-/ibazel-0.25.0.tgz#5431a4622ebc5c5bc48ea8b979f82f745a210d25" - integrity sha512-dtosfsuZCSaqlUe5EyxNdaN7Gow0Y+ZJixdlciytcSieUcB/1lXPFTx6OihxhjgtTHkeFovlQ/QbvArRPnk+nQ== +"@bazel/ibazel@0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@bazel/ibazel/-/ibazel-0.16.2.tgz#05dd7f06659759fda30f87b15534f1e42f1201bb" + integrity sha512-KgqAWMH0emL6f3xH6nqyTryoBMqlJ627LBIe9PT1PRRQPz2FtHib3FIHJPukp1slzF3hJYZvdiVwgPnHbaSOOA== "@bazel/jasmine@5.8.1": version "5.8.1" @@ -1488,9 +1559,9 @@ integrity sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ== "@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.11.1": - version "6.18.4" - resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.18.4.tgz#4394f55d6771727179f2e28a871ef46bbbeb11b1" - integrity sha512-sFAphGQIqyQZfP2ZBsSHV7xQvo9Py0rV0dW7W3IMRdS+zDuNb2l3no78CvUaWKGfzFjI4FTrLdUSj86IGb2hRA== + version "6.18.6" + resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz#de26e864a1ec8192a1b241eb86addbb612964ddb" + integrity sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg== dependencies: "@codemirror/language" "^6.0.0" "@codemirror/state" "^6.0.0" @@ -1498,9 +1569,9 @@ "@lezer/common" "^1.0.0" "@codemirror/commands@^6.3.2": - version "6.7.1" - resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.7.1.tgz#04561e95bc0779eaa49efd63e916c4efb3bbf6d6" - integrity sha512-llTrboQYw5H4THfhN4U3qCnSZ1SOJ60ohhz+SzU0ADGtwlc533DtklQP0vSFaQuCPDn3BPpOd1GbbnUtwNjsrw== + version "6.8.0" + resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.8.0.tgz#92f200b66f852939bd6ebb90d48c2d9e9c813d64" + integrity sha512-q8VPEFaEP4ikSlt6ZxjB3zW72+7osfAYW9i8Zu943uqbKuz6utc1+F170hyLUCUltXORjQXRyYQNfkckzA/bPQ== dependencies: "@codemirror/language" "^6.0.0" "@codemirror/state" "^6.4.0" @@ -1546,9 +1617,9 @@ "@lezer/html" "^1.3.0" "@codemirror/lang-javascript@^6.0.0", "@codemirror/lang-javascript@^6.1.2", "@codemirror/lang-javascript@^6.2.1": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz#7141090b22994bef85bcc5608a3bc1257f2db2ad" - integrity sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg== + version "6.2.3" + resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.2.3.tgz#d705c359dc816afcd3bcdf120a559f83d31d4cda" + integrity sha512-8PR3vIWg7pSu7ur8A07pGiYHgy3hHj+mRYRCSG8q+mPIrl0F02rgpGv+DsQTHRTc30rydOsf5PZ7yjKFg2Ackw== dependencies: "@codemirror/autocomplete" "^6.0.0" "@codemirror/language" "^6.6.0" @@ -1591,25 +1662,25 @@ crelt "^1.0.5" "@codemirror/search@^6.5.5": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.5.8.tgz#b59b3659b46184cc75d6108d7c050a4ca344c3a0" - integrity sha512-PoWtZvo7c1XFeZWmmyaOp2G0XVbOnm+fJzvghqGAktBW3cufwJUWvSCcNG0ppXiBEM05mZu6RhMtXPv2hpllig== + version "6.5.9" + resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.5.9.tgz#08829cf1db9d093dd4822bb22ece93da3ebffefc" + integrity sha512-7DdQ9aaZMMxuWB1u6IIFWWuK9NocVZwvo4nG8QjJTS6oZGvteoLSiXw3EbVZVlO08Ri2ltO89JVInMpfcJxhtg== dependencies: "@codemirror/state" "^6.0.0" "@codemirror/view" "^6.0.0" crelt "^1.0.5" "@codemirror/state@^6.0.0", "@codemirror/state@^6.3.3", "@codemirror/state@^6.4.0", "@codemirror/state@^6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.5.0.tgz#e98dde85620618651543152fe1c2483300a0ccc9" - integrity sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw== + version "6.5.2" + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.5.2.tgz#8eca3a64212a83367dc85475b7d78d5c9b7076c6" + integrity sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA== dependencies: "@marijn/find-cluster-break" "^1.0.0" "@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.22.2", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0": - version "6.36.1" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.36.1.tgz#3c543b8fd72c96b30c4b2b1464d1ebce7e0c5c4b" - integrity sha512-miD1nyT4m4uopZaDdO2uXU/LLHliKNYL9kB1C1wJHrunHLm/rpkb5QVSokqgw9hFqEZakrdlb/VGWX8aYZTslQ== + version "6.36.2" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.36.2.tgz#aeb644e161440734ac5a153bf6e5b4a4355047be" + integrity sha512-DZ6ONbs8qdJK0fdN7AB82CgI6tYXf4HWk1wSVa0+9bhVznCuuvhQtX8bFBoy3dv8rZSQqUd8GvhVAcielcidrA== dependencies: "@codemirror/state" "^6.5.0" style-mod "^4.1.0" @@ -1640,6 +1711,34 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@csstools/color-helpers@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-5.0.1.tgz#829f1c76f5800b79c51c709e2f36821b728e0e10" + integrity sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA== + +"@csstools/css-calc@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-2.1.1.tgz#a7dbc66627f5cf458d42aed14bda0d3860562383" + integrity sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag== + +"@csstools/css-color-parser@^3.0.7": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz#442d61d58e54ad258d52c309a787fceb33906484" + integrity sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA== + dependencies: + "@csstools/color-helpers" "^5.0.1" + "@csstools/css-calc" "^2.1.1" + +"@csstools/css-parser-algorithms@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz#74426e93bd1c4dcab3e441f5cc7ba4fb35d94356" + integrity sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A== + +"@csstools/css-tokenizer@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz#a5502c8539265fecbd873c1e395a890339f119c2" + integrity sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw== + "@dabh/diagnostics@^2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" @@ -1649,13 +1748,13 @@ enabled "2.0.x" kuler "^2.0.0" -"@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== +"@dependents/detective-less@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@dependents/detective-less/-/detective-less-5.0.1.tgz#e6c5b502f0d26a81da4170c1ccd848a6eaa68470" + integrity sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ== dependencies: gonzales-pe "^4.3.0" - node-source-walk "^7.0.0" + node-source-walk "^7.0.1" "@discoveryjs/json-ext@0.6.3": version "0.6.3" @@ -1670,385 +1769,390 @@ buffer-crc32 "~0.2.3" fd-slicer2 "^1.2.0" -"@electric-sql/pglite@^0.2.0": - version "0.2.15" - resolved "https://registry.yarnpkg.com/@electric-sql/pglite/-/pglite-0.2.15.tgz#c9535b50f311baa317ed7ba0113e2fdc0139e045" - integrity sha512-Jiq31Dnk+rg8rMhcSxs4lQvHTyizNo5b269c1gCC3ldQ0sCLrNVPGzy+KnmonKy1ZArTUuXZf23/UamzFMKVaA== +"@electric-sql/pglite@^0.2.16": + version "0.2.17" + resolved "https://registry.yarnpkg.com/@electric-sql/pglite/-/pglite-0.2.17.tgz#23d53a9b7ddd1590d59d7c701aba23b037f08108" + integrity sha512-qEpKRT2oUaWDH6tjRxLHjdzMqRUGYDnGZlKrnL4dJ77JVMcP2Hpo3NYnOSPKdZdeec57B6QPprCUFg0picx5Pw== "@esbuild/aix-ppc64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz#51299374de171dbd80bb7d838e1cfce9af36f353" integrity sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ== -"@esbuild/aix-ppc64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c" - integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw== - "@esbuild/aix-ppc64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz#38848d3e25afe842a7943643cbcd387cc6e13461" integrity sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA== +"@esbuild/aix-ppc64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz#499600c5e1757a524990d5d92601f0ac3ce87f64" + integrity sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ== + "@esbuild/android-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018" integrity sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw== -"@esbuild/android-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0" - integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w== - "@esbuild/android-arm64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz#f592957ae8b5643129fa889c79e69cd8669bb894" integrity sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg== +"@esbuild/android-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz#b9b8231561a1dfb94eb31f4ee056b92a985c324f" + integrity sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g== + "@esbuild/android-arm@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee" integrity sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ== -"@esbuild/android-arm@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810" - integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew== - "@esbuild/android-arm@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz#72d8a2063aa630308af486a7e5cbcd1e134335b3" integrity sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q== +"@esbuild/android-arm@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.0.tgz#ca6e7888942505f13e88ac9f5f7d2a72f9facd2b" + integrity sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g== + "@esbuild/android-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517" integrity sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg== -"@esbuild/android-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705" - integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ== - "@esbuild/android-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz#9a7713504d5f04792f33be9c197a882b2d88febb" integrity sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw== +"@esbuild/android-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.0.tgz#e765ea753bac442dfc9cb53652ce8bd39d33e163" + integrity sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg== + "@esbuild/darwin-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz#05b17f91a87e557b468a9c75e9d85ab10c121b16" integrity sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q== -"@esbuild/darwin-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz#2d0d9414f2acbffd2d86e98253914fca603a53dd" - integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw== - "@esbuild/darwin-arm64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz#02ae04ad8ebffd6e2ea096181b3366816b2b5936" integrity sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA== +"@esbuild/darwin-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz#fa394164b0d89d4fdc3a8a21989af70ef579fa2c" + integrity sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw== + "@esbuild/darwin-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931" integrity sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw== -"@esbuild/darwin-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107" - integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA== - "@esbuild/darwin-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz#9ec312bc29c60e1b6cecadc82bd504d8adaa19e9" integrity sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA== +"@esbuild/darwin-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz#91979d98d30ba6e7d69b22c617cc82bdad60e47a" + integrity sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg== + "@esbuild/freebsd-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc" integrity sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA== -"@esbuild/freebsd-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7" - integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA== - "@esbuild/freebsd-arm64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz#5e82f44cb4906d6aebf24497d6a068cfc152fa00" integrity sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg== +"@esbuild/freebsd-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz#b97e97073310736b430a07b099d837084b85e9ce" + integrity sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w== + "@esbuild/freebsd-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730" integrity sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g== -"@esbuild/freebsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93" - integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ== - "@esbuild/freebsd-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz#3fb1ce92f276168b75074b4e51aa0d8141ecce7f" integrity sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q== +"@esbuild/freebsd-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz#f3b694d0da61d9910ec7deff794d444cfbf3b6e7" + integrity sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A== + "@esbuild/linux-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383" integrity sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g== -"@esbuild/linux-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75" - integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g== - "@esbuild/linux-arm64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz#856b632d79eb80aec0864381efd29de8fd0b1f43" integrity sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg== +"@esbuild/linux-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz#f921f699f162f332036d5657cad9036f7a993f73" + integrity sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg== + "@esbuild/linux-arm@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771" integrity sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ== -"@esbuild/linux-arm@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d" - integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw== - "@esbuild/linux-arm@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz#c846b4694dc5a75d1444f52257ccc5659021b736" integrity sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA== +"@esbuild/linux-arm@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz#cc49305b3c6da317c900688995a4050e6cc91ca3" + integrity sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg== + "@esbuild/linux-ia32@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333" integrity sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ== -"@esbuild/linux-ia32@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb" - integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA== - "@esbuild/linux-ia32@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz#f8a16615a78826ccbb6566fab9a9606cfd4a37d5" integrity sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw== +"@esbuild/linux-ia32@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz#3e0736fcfab16cff042dec806247e2c76e109e19" + integrity sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg== + "@esbuild/linux-loong64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac" integrity sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw== -"@esbuild/linux-loong64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c" - integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g== - "@esbuild/linux-loong64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz#1c451538c765bf14913512c76ed8a351e18b09fc" integrity sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ== +"@esbuild/linux-loong64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz#ea2bf730883cddb9dfb85124232b5a875b8020c7" + integrity sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw== + "@esbuild/linux-mips64el@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6" integrity sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q== -"@esbuild/linux-mips64el@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3" - integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA== - "@esbuild/linux-mips64el@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz#0846edeefbc3d8d50645c51869cc64401d9239cb" integrity sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw== +"@esbuild/linux-mips64el@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz#4cababb14eede09248980a2d2d8b966464294ff1" + integrity sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ== + "@esbuild/linux-ppc64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96" integrity sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw== -"@esbuild/linux-ppc64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e" - integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ== - "@esbuild/linux-ppc64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz#8e3fc54505671d193337a36dfd4c1a23b8a41412" integrity sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw== +"@esbuild/linux-ppc64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz#8860a4609914c065373a77242e985179658e1951" + integrity sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw== + "@esbuild/linux-riscv64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7" integrity sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA== -"@esbuild/linux-riscv64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25" - integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw== - "@esbuild/linux-riscv64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz#6a1e92096d5e68f7bb10a0d64bb5b6d1daf9a694" integrity sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q== +"@esbuild/linux-riscv64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz#baf26e20bb2d38cfb86ee282dff840c04f4ed987" + integrity sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA== + "@esbuild/linux-s390x@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f" integrity sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw== -"@esbuild/linux-s390x@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319" - integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g== - "@esbuild/linux-s390x@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz#ab18e56e66f7a3c49cb97d337cd0a6fea28a8577" integrity sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw== +"@esbuild/linux-s390x@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz#8323afc0d6cb1b6dc6e9fd21efd9e1542c3640a4" + integrity sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA== + "@esbuild/linux-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24" integrity sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ== -"@esbuild/linux-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef" - integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA== - "@esbuild/linux-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz#8140c9b40da634d380b0b29c837a0b4267aff38f" integrity sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q== +"@esbuild/linux-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz#08fcf60cb400ed2382e9f8e0f5590bac8810469a" + integrity sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw== + "@esbuild/netbsd-arm64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz#65f19161432bafb3981f5f20a7ff45abb2e708e6" integrity sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw== +"@esbuild/netbsd-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz#935c6c74e20f7224918fbe2e6c6fe865b6c6ea5b" + integrity sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw== + "@esbuild/netbsd-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653" integrity sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA== -"@esbuild/netbsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c" - integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg== - "@esbuild/netbsd-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz#7a3a97d77abfd11765a72f1c6f9b18f5396bcc40" integrity sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw== +"@esbuild/netbsd-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz#414677cef66d16c5a4d210751eb2881bb9c1b62b" + integrity sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA== + "@esbuild/openbsd-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7" integrity sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q== -"@esbuild/openbsd-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2" - integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg== - "@esbuild/openbsd-arm64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz#58b00238dd8f123bfff68d3acc53a6ee369af89f" integrity sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A== +"@esbuild/openbsd-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz#8fd55a4d08d25cdc572844f13c88d678c84d13f7" + integrity sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw== + "@esbuild/openbsd-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273" integrity sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA== -"@esbuild/openbsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf" - integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q== - "@esbuild/openbsd-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz#0ac843fda0feb85a93e288842936c21a00a8a205" integrity sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA== +"@esbuild/openbsd-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz#0c48ddb1494bbc2d6bcbaa1429a7f465fa1dedde" + integrity sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg== + "@esbuild/sunos-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403" integrity sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA== -"@esbuild/sunos-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4" - integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA== - "@esbuild/sunos-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz#8b7aa895e07828d36c422a4404cc2ecf27fb15c6" integrity sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig== +"@esbuild/sunos-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz#86ff9075d77962b60dd26203d7352f92684c8c92" + integrity sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg== + "@esbuild/win32-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2" integrity sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A== -"@esbuild/win32-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b" - integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA== - "@esbuild/win32-arm64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz#c023afb647cabf0c3ed13f0eddfc4f1d61c66a85" integrity sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ== +"@esbuild/win32-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz#849c62327c3229467f5b5cd681bf50588442e96c" + integrity sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw== + "@esbuild/win32-ia32@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac" integrity sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ== -"@esbuild/win32-ia32@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103" - integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw== - "@esbuild/win32-ia32@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz#96c356132d2dda990098c8b8b951209c3cd743c2" integrity sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA== +"@esbuild/win32-ia32@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz#f62eb480cd7cca088cb65bb46a6db25b725dc079" + integrity sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA== + "@esbuild/win32-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== -"@esbuild/win32-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz#168ab1c7e1c318b922637fad8f339d48b01e1244" - integrity sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA== - "@esbuild/win32-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz#34aa0b52d0fbb1a654b596acfa595f0c7b77a77b" integrity sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg== +"@esbuild/win32-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz#c8e119a30a7c8d60b9d2e22d2073722dde3b710b" + integrity sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ== + "@fastify/busboy@^2.0.0": version "2.1.1" resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== "@google-cloud/cloud-sql-connector@^1.3.3": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@google-cloud/cloud-sql-connector/-/cloud-sql-connector-1.5.0.tgz#1c2dfb9275ee9e7ccb5c1109a3b49ab1ec9ff1ff" - integrity sha512-uI4CzMLb7Sc2WjTohB5wt+5j6kWBUqKLRzJrPfPer8A4sz7yyqUfyOFI2CKap4eRIAtSnVX4WapcNqziX3pBSg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/@google-cloud/cloud-sql-connector/-/cloud-sql-connector-1.6.0.tgz#3ab3d4a4ce18077cd2cae118cfdf7cffaa7c51d6" + integrity sha512-YkgPaxHbWRjp8YS7OCZAGge4qwX/pwFKT/cxKxV5PYyeS4CbaY6URF2f5Lo6Pabn6bs2AxwjB/SA9UeCdLbj7A== dependencies: "@googleapis/sqladmin" "^24.0.0" gaxios "^6.1.1" @@ -2094,16 +2198,16 @@ integrity sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g== "@google-cloud/pubsub@^4.5.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-4.9.0.tgz#42acbb37d67a0850ea2a6444992e5dde532e9bad" - integrity sha512-VLGRwWwjEnyC+NVEiScCRGfVBJzAw9fT5IM3YvC6mlEkv8llr5vcVsoDjv1EbE0P31I601RqlLXH7s6J9tqpfA== + version "4.10.0" + resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-4.10.0.tgz#f1380fccecd87910758c747b0711f722aae06a50" + integrity sha512-HLlIA8qGr6PxAnjK4YjSi2swqEiXjGAC2Tj9GHMNYFtL4uubTIJLHv4CtbJ/Gzem5Cb1HRjuubt/H0oTuRLV0g== dependencies: "@google-cloud/paginator" "^5.0.0" "@google-cloud/precise-date" "^4.0.0" "@google-cloud/projectify" "^4.0.0" "@google-cloud/promisify" "^4.0.0" "@opentelemetry/api" "~1.9.0" - "@opentelemetry/semantic-conventions" "~1.26.0" + "@opentelemetry/semantic-conventions" "~1.28.0" arrify "^2.0.0" extend "^3.0.2" google-auth-library "^9.3.0" @@ -2113,10 +2217,10 @@ lodash.snakecase "^4.1.1" p-defer "^3.0.0" -"@google-cloud/spanner@7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@google-cloud/spanner/-/spanner-7.16.0.tgz#29511842de6208d117175d0364749fab2098bcb6" - integrity sha512-9/rQau/WNgM1Zle9sEJm6jUp1l4sbHtiHGcktQnQc2LPs5EjMMg9eYaP4UfWgDzoxny+3hyKTyhBbAzHR8pQGA== +"@google-cloud/spanner@7.18.1": + version "7.18.1" + resolved "https://registry.yarnpkg.com/@google-cloud/spanner/-/spanner-7.18.1.tgz#4589327e14de18ee5d27e01774c9f501171bb0cd" + integrity sha512-7CwpTX5njfoUAVQL/otowTm3gjWPn+ceUKKH+KGWr/DuAeDsrc4sZH1LY+t2mt/vvMULS/PlWkAkv6Hk/Oi8cw== dependencies: "@google-cloud/common" "^5.0.0" "@google-cloud/precise-date" "^4.0.0" @@ -2125,6 +2229,7 @@ "@grpc/proto-loader" "^0.7.0" "@opentelemetry/api" "^1.9.0" "@opentelemetry/context-async-hooks" "^1.26.0" + "@opentelemetry/core" "^1.27.0" "@opentelemetry/semantic-conventions" "^1.25.1" "@types/big.js" "^6.0.0" "@types/stack-trace" "0.0.33" @@ -2157,9 +2262,9 @@ googleapis-common "^7.0.0" "@grpc/grpc-js@^1.10.9", "@grpc/grpc-js@^1.7.0": - version "1.12.5" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.12.5.tgz#0064a28fe9b1ec54ac27e1c9bf70720aa01285e8" - integrity sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA== + version "1.12.6" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.12.6.tgz#a3586ffdfb6a1f5cd5b4866dec9074c4a1e65472" + integrity sha512-JXUj6PI0oqqzTGvKtzOkxtpsyPRNsrmhh41TtIz/zEB6J+AUiZZ0dxWzcMwO9Ns5rmSPuMdghlTbUuqIM48d3Q== dependencies: "@grpc/proto-loader" "^0.7.13" "@js-sdsl/ordered-map" "^4.4.2" @@ -2197,39 +2302,31 @@ integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== "@iconify/utils@^2.1.32": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.2.1.tgz#635b9bd8fd3e5e53742471bc0b5291f1570dda41" - integrity sha512-0/7J7hk4PqXmxo5PDBDxmnecw5PxklZJfNjIVG9FM0mEfVrvfudS22rYWsqVk6gR3UJ/mSYS90X4R3znXnqfNA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.3.0.tgz#1bbbf8c477ebe9a7cacaea78b1b7e8937f9cbfba" + integrity sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA== dependencies: - "@antfu/install-pkg" "^0.4.1" - "@antfu/utils" "^0.7.10" + "@antfu/install-pkg" "^1.0.0" + "@antfu/utils" "^8.1.0" "@iconify/types" "^2.0.0" debug "^4.4.0" - globals "^15.13.0" + globals "^15.14.0" kolorist "^1.8.0" - local-pkg "^0.5.1" - mlly "^1.7.3" + local-pkg "^1.0.0" + mlly "^1.7.4" -"@inquirer/checkbox@^4.0.3", "@inquirer/checkbox@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.0.4.tgz#e7335f9c23f4100f789a8fceb26417c9a74a6dee" - integrity sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg== +"@inquirer/checkbox@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.1.1.tgz#5f2c0ce74a75e3872f8e170fd209655972ce7802" + integrity sha512-os5kFd/52gZTl/W6xqMfhaKVJHQM8V/U1P8jcSaQJ/C4Qhdrf2jEXdA/HaxfQs9iiUA/0yzYhk5d3oRHTxGDDQ== dependencies: - "@inquirer/core" "^10.1.2" - "@inquirer/figures" "^1.0.9" - "@inquirer/type" "^3.0.2" + "@inquirer/core" "^10.1.6" + "@inquirer/figures" "^1.0.10" + "@inquirer/type" "^3.0.4" ansi-escapes "^4.3.2" yoctocolors-cjs "^2.1.2" -"@inquirer/confirm@5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.0.tgz#061cd0790c8debe092353589a501211b0d6c53ef" - integrity sha512-osaBbIMEqVFjTX5exoqPXs6PilWQdjaLhGtMDXMXg/yxkHXNq43GlxGyTA35lK2HpzUgDN+Cjh/2AmqCN0QJpw== - dependencies: - "@inquirer/core" "^10.1.1" - "@inquirer/type" "^3.0.1" - -"@inquirer/confirm@^5.1.0", "@inquirer/confirm@^5.1.1": +"@inquirer/confirm@5.1.1": version "5.1.1" resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.1.tgz#18385064b8275eb79fdba505ce527801804eea04" integrity sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg== @@ -2237,128 +2334,119 @@ "@inquirer/core" "^10.1.2" "@inquirer/type" "^3.0.2" -"@inquirer/core@^10.1.1", "@inquirer/core@^10.1.2": - version "10.1.2" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.2.tgz#a9c5b9ed814a636e99b5c0a8ca4f1626d99fd75d" - integrity sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ== +"@inquirer/confirm@5.1.5", "@inquirer/confirm@^5.1.5": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.5.tgz#0e6bf86794f69f849667ee38815608d6cd5917ba" + integrity sha512-ZB2Cz8KeMINUvoeDi7IrvghaVkYT2RB0Zb31EaLWOE87u276w4wnApv0SH2qWaJ3r0VSUa3BIuz7qAV2ZvsZlg== dependencies: - "@inquirer/figures" "^1.0.9" - "@inquirer/type" "^3.0.2" + "@inquirer/core" "^10.1.6" + "@inquirer/type" "^3.0.4" + +"@inquirer/core@^10.1.2", "@inquirer/core@^10.1.6": + version "10.1.6" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.6.tgz#2a92a219cb48c81453e145a5040d0e04f7df1aa2" + integrity sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA== + dependencies: + "@inquirer/figures" "^1.0.10" + "@inquirer/type" "^3.0.4" ansi-escapes "^4.3.2" cli-width "^4.1.0" mute-stream "^2.0.0" signal-exit "^4.1.0" - strip-ansi "^6.0.1" wrap-ansi "^6.2.0" yoctocolors-cjs "^2.1.2" -"@inquirer/editor@^4.2.0", "@inquirer/editor@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.1.tgz#9887e95aa28a52eb20e9e08d85cb3698ef404601" - integrity sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA== +"@inquirer/editor@^4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.6.tgz#dec442b9f7ada0804bb9ba689370cc05fd385b20" + integrity sha512-l0smvr8g/KAVdXx4I92sFxZiaTG4kFc06cFZw+qqwTirwdUHMFLnouXBB9OafWhpO3cfEkEz2CdPoCmor3059A== dependencies: - "@inquirer/core" "^10.1.2" - "@inquirer/type" "^3.0.2" + "@inquirer/core" "^10.1.6" + "@inquirer/type" "^3.0.4" external-editor "^3.1.0" -"@inquirer/expand@^4.0.3", "@inquirer/expand@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.4.tgz#e3b052835e48fd4ebcf71813b7eae8b03c729d1b" - integrity sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg== +"@inquirer/expand@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.8.tgz#8438bd34af182d4a37d8d7101a328e10430efadc" + integrity sha512-k0ouAC6L+0Yoj/j0ys2bat0fYcyFVtItDB7h+pDFKaDDSFJey/C/YY1rmIOqkmFVZ5rZySeAQuS8zLcKkKRLmg== dependencies: - "@inquirer/core" "^10.1.2" - "@inquirer/type" "^3.0.2" + "@inquirer/core" "^10.1.6" + "@inquirer/type" "^3.0.4" yoctocolors-cjs "^2.1.2" -"@inquirer/figures@^1.0.9": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.9.tgz#9d8128f8274cde4ca009ca8547337cab3f37a4a3" - integrity sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ== +"@inquirer/figures@^1.0.10": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.10.tgz#e3676a51c9c51aaabcd6ba18a28e82b98417db37" + integrity sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw== -"@inquirer/input@^4.1.0", "@inquirer/input@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.1.1.tgz#aea2e463087c6aae57b9801e1ae5648f50d0d22e" - integrity sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg== +"@inquirer/input@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.1.5.tgz#ea3ffed7947c28d61ef3f261c4f261e99c4cac8a" + integrity sha512-bB6wR5wBCz5zbIVBPnhp94BHv/G4eKbUEjlpCw676pI2chcvzTx1MuwZSCZ/fgNOdqDlAxkhQ4wagL8BI1D3Zg== dependencies: - "@inquirer/core" "^10.1.2" - "@inquirer/type" "^3.0.2" + "@inquirer/core" "^10.1.6" + "@inquirer/type" "^3.0.4" -"@inquirer/number@^3.0.3", "@inquirer/number@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.4.tgz#090dcac6886d0cddc255f6624b61fb4461747fee" - integrity sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA== +"@inquirer/number@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.8.tgz#ca44c09a8ac74040e2327e04694799eae603e9de" + integrity sha512-CTKs+dT1gw8dILVWATn8Ugik1OHLkkfY82J+Musb57KpmF6EKyskv8zmMiEJPzOnLTZLo05X/QdMd8VH9oulXw== dependencies: - "@inquirer/core" "^10.1.2" - "@inquirer/type" "^3.0.2" + "@inquirer/core" "^10.1.6" + "@inquirer/type" "^3.0.4" -"@inquirer/password@^4.0.3", "@inquirer/password@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.4.tgz#77891ae3ed5736607e6e942993ac40ca00411a2c" - integrity sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w== +"@inquirer/password@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.8.tgz#ac2b14800a75f15e3404d98616d9dc7d8c2df38b" + integrity sha512-MgA+Z7o3K1df2lGY649fyOBowHGfrKRz64dx3+b6c1w+h2W7AwBoOkHhhF/vfhbs5S4vsKNCuDzS3s9r5DpK1g== dependencies: - "@inquirer/core" "^10.1.2" - "@inquirer/type" "^3.0.2" + "@inquirer/core" "^10.1.6" + "@inquirer/type" "^3.0.4" ansi-escapes "^4.3.2" -"@inquirer/prompts@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.2.0.tgz#15010df2257a243866480513d36f3e19c98d7fb1" - integrity sha512-ZXYZ5oGVrb+hCzcglPeVerJ5SFwennmDOPfXq1WyeZIrPGySLbl4W6GaSsBFvu3WII36AOK5yB8RMIEEkBjf8w== - dependencies: - "@inquirer/checkbox" "^4.0.3" - "@inquirer/confirm" "^5.1.0" - "@inquirer/editor" "^4.2.0" - "@inquirer/expand" "^4.0.3" - "@inquirer/input" "^4.1.0" - "@inquirer/number" "^3.0.3" - "@inquirer/password" "^4.0.3" - "@inquirer/rawlist" "^4.0.3" - "@inquirer/search" "^3.0.3" - "@inquirer/select" "^4.0.3" - -"@inquirer/prompts@^7.0.0": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.2.1.tgz#f00fbcf06998a07faebc10741efa289384529950" - integrity sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ== - dependencies: - "@inquirer/checkbox" "^4.0.4" - "@inquirer/confirm" "^5.1.1" - "@inquirer/editor" "^4.2.1" - "@inquirer/expand" "^4.0.4" - "@inquirer/input" "^4.1.1" - "@inquirer/number" "^3.0.4" - "@inquirer/password" "^4.0.4" - "@inquirer/rawlist" "^4.0.4" - "@inquirer/search" "^3.0.4" - "@inquirer/select" "^4.0.4" - -"@inquirer/rawlist@^4.0.3", "@inquirer/rawlist@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.0.4.tgz#d10bbd6c529cd468d3d764c19de21334a01fa6d9" - integrity sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg== +"@inquirer/prompts@7.3.1", "@inquirer/prompts@^7.0.0": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.3.1.tgz#3fa954a7d9e71197b489a1d2a25a1e19b6688e76" + integrity sha512-r1CiKuDV86BDpvj9DRFR+V+nIjsVBOsa2++dqdPqLYAef8kgHYvmQ8ySdP/ZeAIOWa27YGJZRkENdP3dK0H3gg== + dependencies: + "@inquirer/checkbox" "^4.1.1" + "@inquirer/confirm" "^5.1.5" + "@inquirer/editor" "^4.2.6" + "@inquirer/expand" "^4.0.8" + "@inquirer/input" "^4.1.5" + "@inquirer/number" "^3.0.8" + "@inquirer/password" "^4.0.8" + "@inquirer/rawlist" "^4.0.8" + "@inquirer/search" "^3.0.8" + "@inquirer/select" "^4.0.8" + +"@inquirer/rawlist@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.0.8.tgz#1d4389186d63861a2abe2dd107f72e813dc0ea4b" + integrity sha512-hl7rvYW7Xl4un8uohQRUgO6uc2hpn7PKqfcGkCOWC0AA4waBxAv6MpGOFCEDrUaBCP+pXPVqp4LmnpWmn1E1+g== dependencies: - "@inquirer/core" "^10.1.2" - "@inquirer/type" "^3.0.2" + "@inquirer/core" "^10.1.6" + "@inquirer/type" "^3.0.4" yoctocolors-cjs "^2.1.2" -"@inquirer/search@^3.0.3", "@inquirer/search@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.0.4.tgz#fcf51a853536add37491920634a182ecc9f5524b" - integrity sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A== +"@inquirer/search@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.0.8.tgz#38c25f5b2db15a268be76b09bd12b4599ecc216b" + integrity sha512-ihSE9D3xQAupNg/aGDZaukqoUSXG2KfstWosVmFCG7jbMQPaj2ivxWtsB+CnYY/T4D6LX1GHKixwJLunNCffww== dependencies: - "@inquirer/core" "^10.1.2" - "@inquirer/figures" "^1.0.9" - "@inquirer/type" "^3.0.2" + "@inquirer/core" "^10.1.6" + "@inquirer/figures" "^1.0.10" + "@inquirer/type" "^3.0.4" yoctocolors-cjs "^2.1.2" -"@inquirer/select@^4.0.3", "@inquirer/select@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.0.4.tgz#026ada15754def1cd3fbc01efc56eae45ccc7de4" - integrity sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w== +"@inquirer/select@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.0.8.tgz#dde85e10bc4e650c51542de533a91b6bc63498b7" + integrity sha512-Io2prxFyN2jOCcu4qJbVoilo19caiD3kqkD3WR0q3yDA5HUCo83v4LrRtg55ZwniYACW64z36eV7gyVbOfORjA== dependencies: - "@inquirer/core" "^10.1.2" - "@inquirer/figures" "^1.0.9" - "@inquirer/type" "^3.0.2" + "@inquirer/core" "^10.1.6" + "@inquirer/figures" "^1.0.10" + "@inquirer/type" "^3.0.4" ansi-escapes "^4.3.2" yoctocolors-cjs "^2.1.2" @@ -2369,10 +2457,10 @@ dependencies: mute-stream "^1.0.0" -"@inquirer/type@^3.0.1", "@inquirer/type@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.2.tgz#baff9f8d70947181deb36772cd9a5b6876d3e60c" - integrity sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g== +"@inquirer/type@^3.0.2", "@inquirer/type@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.4.tgz#fa5f9e91a0abf3c9e93d3e1990ecb891d8195cf2" + integrity sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -2487,9 +2575,9 @@ integrity sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA== "@lezer/css@^1.1.0", "@lezer/css@^1.1.7": - version "1.1.9" - resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.1.9.tgz#404563d361422c5a1fe917295f1527ee94845ed1" - integrity sha512-TYwgljcDv+YrV0MZFFvYFQHCfGgbPMR6nuqLabBdmZoFH3EP1gvw8t0vae326Ne3PszQkbXfVBjCnf3ZVCr0bA== + version "1.1.10" + resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.1.10.tgz#99cef68b26bfdefb76e269b9ee13b0de28edd8ed" + integrity sha512-V5/89eDapjeAkWPBpWEfQjZ1Hag3aYUUJOL8213X0dFRuXJ4BXa5NKl9USzOnaLod4AOpmVCkduir2oKwZYZtg== dependencies: "@lezer/common" "^1.2.0" "@lezer/highlight" "^1.0.0" @@ -2543,35 +2631,65 @@ dependencies: "@inquirer/type" "^1.5.5" -"@lmdb/lmdb-darwin-arm64@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.0.tgz#fefac30026690e8e68a9b508b650ce0cbfe8a122" - integrity sha512-Ca5N6DGDlH/lIycMj2U3FtokNPdUmGyL+htto3G+gexoXYaDE9cbojVgwXd3/Zih9Friqh7l5qZk+LZEVDwJvQ== +"@lmdb/lmdb-darwin-arm64@3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz#39e25e2a95d35a7350862af96d05e5396ea8a074" + integrity sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g== -"@lmdb/lmdb-darwin-x64@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.0.tgz#ae7134b12d8e479bcde5c5bcbdf1d17ba535f35b" - integrity sha512-s/MXLuRXxJjQpg0aM/yN3FJh34tqEPo6Zg+FJvc9+gUNpzXzZwBB9MOTYA05WVrvxwtIKxMg7ocLjAH1LQUT3A== +"@lmdb/lmdb-darwin-arm64@3.2.6": + version "3.2.6" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.6.tgz#5de419e9b95ba7aa5a0305a451e202be41dd76c0" + integrity sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg== -"@lmdb/lmdb-linux-arm64@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.0.tgz#7492adba1667789f4f129945c71d38b936517628" - integrity sha512-XRkaZok4AkzMXKLfsdJYVBXYJ/6idDpuLIPGiVjelxKLbZIKB7F+Xp2BDfeelAPdjRbW/qhzF7FNA0u1blz/Og== +"@lmdb/lmdb-darwin-x64@3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz#7b9eac5b7a89dbf3433648622fe52799dd4202e5" + integrity sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA== -"@lmdb/lmdb-linux-arm@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.0.tgz#cbea8970baaa7a802f0ff1b17d6873c50a6fb1b0" - integrity sha512-e9pljI8rZk1UAaDdi7sGiY0zkqsNAS3a4llOuk2UslAH4UP9vGZfjfCR5D+HKPUPbSEk28adOiNmIUT4N2lTBw== +"@lmdb/lmdb-darwin-x64@3.2.6": + version "3.2.6" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.6.tgz#1e2a066f49b454411ed778a589ee57a6051851df" + integrity sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg== -"@lmdb/lmdb-linux-x64@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.0.tgz#0424671e51802f0864873501abe558c5e6f8461e" - integrity sha512-c8HMb044qzMT/wvk4HzBesRv3wQNeFkUFz6laH3FKVs0+ztM7snuT3izPWdeYhgCLkAiIqshqlcbvzQfPDeg2Q== +"@lmdb/lmdb-linux-arm64@3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz#f81b9233b2b78141af4cd22864f152cfeeed7b93" + integrity sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g== -"@lmdb/lmdb-win32-x64@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.0.tgz#082b3996e46bc6b4333df08287813ecb53288ea3" - integrity sha512-xcrdSOPtpZ4ScWJM2x4g+eWCOctINOcaEWGSvZbmXPFD69SAFywyhqNsB3snAY3assYV0B52PWmiAwXWfijd+g== +"@lmdb/lmdb-linux-arm64@3.2.6": + version "3.2.6" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.6.tgz#42c4c67dd67da62860f8fb7dd57e9171f407c1d2" + integrity sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg== + +"@lmdb/lmdb-linux-arm@3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz#251fa02ed9d2d8b8a4827f5e53bf1e2d8aa745b8" + integrity sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA== + +"@lmdb/lmdb-linux-arm@3.2.6": + version "3.2.6" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.6.tgz#a4aabc336dfbb2efdad6c91e39a95bece96fa7bd" + integrity sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ== + +"@lmdb/lmdb-linux-x64@3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz#f794a5b4c06019a82622565ba3d38e47aa113a2c" + integrity sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw== + +"@lmdb/lmdb-linux-x64@3.2.6": + version "3.2.6" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.6.tgz#83fb669606ebe6275915a06f2ca2e34d2ce1664e" + integrity sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q== + +"@lmdb/lmdb-win32-x64@3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz#d160454f0e6c4f4af0a5a05d85141c3bd9523f9c" + integrity sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ== + +"@lmdb/lmdb-win32-x64@3.2.6": + version "3.2.6" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.6.tgz#729f2035ddef1975279b3329532f5c1f86c91918" + integrity sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg== "@marijn/find-cluster-break@^1.0.0": version "1.0.2" @@ -2585,61 +2703,61 @@ dependencies: langium "3.0.0" -"@microsoft/api-extractor-model@7.30.0": - version "7.30.0" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.0.tgz#18a0528350124015b2c08397474e9309a8b3c807" - integrity sha512-26/LJZBrsWDKAkOWRiQbdVgcfd1F3nyJnAiJzsAgpouPk7LtOIj7PK9aJtBaw/pUXrkotEg27RrT+Jm/q0bbug== +"@microsoft/api-extractor-model@7.30.2": + version "7.30.2" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.2.tgz#9c0b2446f6bbcdd0159e16b0e8f8694d645ce257" + integrity sha512-3/t2F+WhkJgBzSNwlkTIL0tBgUoBqDqL66pT+nh2mPbM0NIDGVGtpqbGWPgHIzn/mn7kGS/Ep8D8po58e8UUIw== dependencies: "@microsoft/tsdoc" "~0.15.1" "@microsoft/tsdoc-config" "~0.17.1" - "@rushstack/node-core-library" "5.10.0" + "@rushstack/node-core-library" "5.10.2" -"@microsoft/api-extractor-model@7.30.1": - version "7.30.1" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.1.tgz#719e2ab8afe8fe3a5dd65aaa8783dbba90f7c802" - integrity sha512-CTS2PlASJHxVY8hqHORVb1HdECWOEMcMnM6/kDkPr0RZapAFSIHhg9D4jxuE8g+OWYHtPc10LCpmde5pylTRlA== +"@microsoft/api-extractor-model@7.30.3": + version "7.30.3" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.3.tgz#d1256b6955c8c2a1115e0cfe99e1e8f9802e52cc" + integrity sha512-yEAvq0F78MmStXdqz9TTT4PZ05Xu5R8nqgwI5xmUmQjWBQ9E6R2n8HB/iZMRciG4rf9iwI2mtuQwIzDXBvHn1w== dependencies: "@microsoft/tsdoc" "~0.15.1" "@microsoft/tsdoc-config" "~0.17.1" - "@rushstack/node-core-library" "5.10.1" + "@rushstack/node-core-library" "5.11.0" -"@microsoft/api-extractor@7.48.0": - version "7.48.0" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.48.0.tgz#d87243bdafbfadcf87b336b2b4e5de71ecc7caab" - integrity sha512-FMFgPjoilMUWeZXqYRlJ3gCVRhB7WU/HN88n8OLqEsmsG4zBdX/KQdtJfhq95LQTQ++zfu0Em1LLb73NqRCLYQ== +"@microsoft/api-extractor@7.49.1": + version "7.49.1" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.49.1.tgz#e525cadfa09a9d376fd05e8b9415f6bc6260f01a" + integrity sha512-jRTR/XbQF2kb+dYn8hfYSicOGA99+Fo00GrsdMwdfE3eIgLtKdH6Qa2M3wZV9S2XmbgCaGX1OdPtYctbfu5jQg== dependencies: - "@microsoft/api-extractor-model" "7.30.0" + "@microsoft/api-extractor-model" "7.30.2" "@microsoft/tsdoc" "~0.15.1" "@microsoft/tsdoc-config" "~0.17.1" - "@rushstack/node-core-library" "5.10.0" + "@rushstack/node-core-library" "5.10.2" "@rushstack/rig-package" "0.5.3" - "@rushstack/terminal" "0.14.3" - "@rushstack/ts-command-line" "4.23.1" + "@rushstack/terminal" "0.14.5" + "@rushstack/ts-command-line" "4.23.3" lodash "~4.17.15" minimatch "~3.0.3" resolve "~1.22.1" semver "~7.5.4" source-map "~0.6.1" - typescript "5.4.2" + typescript "5.7.2" "@microsoft/api-extractor@^7.24.2": - version "7.48.1" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.48.1.tgz#792197cfc5113cd2efc04524c065d682ef58d2ba" - integrity sha512-HN9Osa1WxqLM66RaqB5nPAadx+nTIQmY/XtkFdaJvusjG8Tus++QqZtD7KPZDSkhEMGHsYeSyeU8qUzCDUXPjg== + version "7.50.0" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.50.0.tgz#e9fa4ecdb4fbb3327cb199fc5f87b79eae6b3f13" + integrity sha512-Ds/PHTiVzuENQsmXrJKkSdfgNkr/SDG/2rDef0AWl3BchAnXdO7gXaYsAkNx4gWiC4OngNA3fQfd3+BcQxP1DQ== dependencies: - "@microsoft/api-extractor-model" "7.30.1" + "@microsoft/api-extractor-model" "7.30.3" "@microsoft/tsdoc" "~0.15.1" "@microsoft/tsdoc-config" "~0.17.1" - "@rushstack/node-core-library" "5.10.1" + "@rushstack/node-core-library" "5.11.0" "@rushstack/rig-package" "0.5.3" - "@rushstack/terminal" "0.14.4" - "@rushstack/ts-command-line" "4.23.2" + "@rushstack/terminal" "0.15.0" + "@rushstack/ts-command-line" "4.23.5" lodash "~4.17.15" minimatch "~3.0.3" resolve "~1.22.1" semver "~7.5.4" source-map "~0.6.1" - typescript "5.4.2" + typescript "5.7.2" "@microsoft/tsdoc-config@~0.17.1": version "0.17.1" @@ -2788,10 +2906,10 @@ "@napi-rs/nice-win32-ia32-msvc" "1.0.1" "@napi-rs/nice-win32-x64-msvc" "1.0.1" -"@ngtools/webpack@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-19.1.0-next.2.tgz#03de00461233c620320e86a8196030a0ae1e9fb4" - integrity sha512-p/iDYNSMp20ArnMuZmQ7y9NLkiB0n2iYP0lqywga8EOHrl/e+Nt84wqVgQ6plapo2LCkS6ZdIlwMi7yN1fz1IA== +"@ngtools/webpack@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-19.2.0-next.2.tgz#e9f04bf6c5f65ba3c2c12ca8d847b6631cced3d6" + integrity sha512-YxtR1+YiXjOmaunOIt3CpmEQunV42pbG5pYd/l6Pjqg/83MHxO8h2ax51By/LIzKm6P1qKsGTEtyZBanG7JgGQ== "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" @@ -2884,17 +3002,17 @@ integrity sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA== "@npmcli/package-json@^6.0.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-6.1.0.tgz#34f0875da178b04df1a7746c02bdc26479819afb" - integrity sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug== + version "6.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-6.1.1.tgz#78ff92d138fdcb85f31cab907455d5db96d017cb" + integrity sha512-d5qimadRAUCO4A/Txw71VM7UrRZzV+NPclxz/dc+M6B2oYwjWTjqh8HA/sGQgs9VZuJ6I/P7XIAlJvgrl27ZOw== dependencies: "@npmcli/git" "^6.0.0" glob "^10.2.2" hosted-git-info "^8.0.0" json-parse-even-better-errors "^4.0.0" - normalize-package-data "^7.0.0" proc-log "^5.0.0" semver "^7.5.3" + validate-npm-package-license "^3.0.4" "@npmcli/promise-spawn@^8.0.0": version "8.0.2" @@ -2904,9 +3022,9 @@ which "^5.0.0" "@npmcli/redact@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/redact/-/redact-3.0.0.tgz#ab3b6413355be7f3c02e87c36c2b0c2f9773fce4" - integrity sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/redact/-/redact-3.1.1.tgz#ac295c148d01c70a5a006d2e162388b3cef15195" + integrity sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA== "@npmcli/run-script@^9.0.0": version "9.0.2" @@ -2926,9 +3044,9 @@ integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== "@octokit/auth-token@^5.0.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-5.1.1.tgz#3bbfe905111332a17f72d80bd0b51a3e2fa2cf07" - integrity sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA== + version "5.1.2" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-5.1.2.tgz#68a486714d7a7fd1df56cb9bc89a860a0de866de" + integrity sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw== "@octokit/core@^5.0.1": version "5.2.0" @@ -2943,31 +3061,31 @@ before-after-hook "^2.2.0" universal-user-agent "^6.0.0" -"@octokit/core@^6.1.2": - version "6.1.3" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-6.1.3.tgz#280d3bb66c702297baac0a202219dd66611286e4" - integrity sha512-z+j7DixNnfpdToYsOutStDgeRzJSMnbj8T1C/oQjB6Aa+kRfNjs/Fn7W6c8bmlt6mfy3FkgeKBRnDjxQow5dow== +"@octokit/core@^6.1.4": + version "6.1.4" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-6.1.4.tgz#f5ccf911cc95b1ce9daf6de425d1664392f867db" + integrity sha512-lAS9k7d6I0MPN+gb9bKDt7X8SdxknYqAMh44S5L+lNqIN2NuV8nvv3g8rPp7MuRxcOpxpUIATWprO0C34a8Qmg== dependencies: "@octokit/auth-token" "^5.0.0" "@octokit/graphql" "^8.1.2" - "@octokit/request" "^9.1.4" - "@octokit/request-error" "^6.1.6" + "@octokit/request" "^9.2.1" + "@octokit/request-error" "^6.1.7" "@octokit/types" "^13.6.2" before-after-hook "^3.0.2" universal-user-agent "^7.0.0" -"@octokit/endpoint@^10.0.0": - version "10.1.2" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-10.1.2.tgz#d38e727e2a64287114fdaa1eb9cd7c81c09460df" - integrity sha512-XybpFv9Ms4hX5OCHMZqyODYqGTZ3H6K6Vva+M9LR7ib/xr1y1ZnlChYv9H680y77Vd/i/k+thXApeRASBQkzhA== +"@octokit/endpoint@^10.1.3": + version "10.1.3" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-10.1.3.tgz#bfe8ff2ec213eb4216065e77654bfbba0fc6d4de" + integrity sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA== dependencies: "@octokit/types" "^13.6.2" universal-user-agent "^7.0.2" "@octokit/endpoint@^9.0.1": - version "9.0.5" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.5.tgz#e6c0ee684e307614c02fc6ac12274c50da465c44" - integrity sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw== + version "9.0.6" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.6.tgz#114d912108fe692d8b139cfe7fc0846dfd11b6c0" + integrity sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw== dependencies: "@octokit/types" "^13.1.0" universal-user-agent "^6.0.0" @@ -2982,12 +3100,12 @@ universal-user-agent "^6.0.0" "@octokit/graphql@^8.0.0", "@octokit/graphql@^8.1.2": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-8.1.2.tgz#98b9072b22e0471b782d52ed0da08e2b2de52b17" - integrity sha512-bdlj/CJVjpaz06NBpfHhp4kGJaRZfz7AzC+6EwUImRtrwIw8dIgJ63Xg0OzV9pRn3rIzrt5c2sa++BL0JJ8GLw== + version "8.2.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-8.2.0.tgz#983a7ebc6479338d78921a1ca9b4095f85991e28" + integrity sha512-gejfDywEml/45SqbWTWrhfwvLBrcGYhOn50sPOjIeVvH6i7D16/9xcFA8dAJNp2HMcd+g4vru41g4E2RBiZvfQ== dependencies: "@octokit/request" "^9.1.4" - "@octokit/types" "^13.6.2" + "@octokit/types" "^13.8.0" universal-user-agent "^7.0.0" "@octokit/openapi-types@^20.0.0": @@ -2995,17 +3113,17 @@ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-20.0.0.tgz#9ec2daa0090eeb865ee147636e0c00f73790c6e5" integrity sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA== -"@octokit/openapi-types@^22.2.0": - version "22.2.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e" - integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== +"@octokit/openapi-types@^23.0.1": + version "23.0.1" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-23.0.1.tgz#3721646ecd36b596ddb12650e0e89d3ebb2dd50e" + integrity sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g== -"@octokit/plugin-paginate-rest@^11.0.0": - version "11.3.6" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.6.tgz#82f33c87464202423c2a89d5cc8c38761f4aa86b" - integrity sha512-zcvqqf/+TicbTCa/Z+3w4eBJcAxCFymtc0UAIsR3dEVoNilWld4oXdscQ3laXamTszUZdusw97K8+DrbFiOwjw== +"@octokit/plugin-paginate-rest@^11.4.2": + version "11.4.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.2.tgz#8f46a1de74c35e016c86701ef4ea0e8ef25a06e0" + integrity sha512-BXJ7XPCTDXFF+wxcg/zscfgw2O/iDPtNSkwwR1W1W5c4Mb3zav/M2XvxQ23nVmKj7jpweB4g8viMeCQdm7LMVA== dependencies: - "@octokit/types" "^13.6.2" + "@octokit/types" "^13.7.0" "@octokit/plugin-paginate-rest@^9.0.0": version "9.2.1" @@ -3026,12 +3144,12 @@ dependencies: "@octokit/types" "^12.6.0" -"@octokit/plugin-rest-endpoint-methods@^13.0.0": - version "13.2.6" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.6.tgz#b9d343dbe88a6cb70cc7fa16faa98f0a29ffe654" - integrity sha512-wMsdyHMjSfKjGINkdGKki06VEkgdEldIGstIEyGX0wbYHGByOwN/KiM+hAAlUwAtPkP3gvXtVQA9L3ITdV2tVw== +"@octokit/plugin-rest-endpoint-methods@^13.3.0": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.1.tgz#1915976b689662f14d033a16e7d9307c22842234" + integrity sha512-o8uOBdsyR+WR8MK9Cco8dCgvG13H1RlM1nWnK/W7TEACQBFux/vPREgKucxUfuDQ5yi1T3hGf4C5ZmZXAERgwQ== dependencies: - "@octokit/types" "^13.6.1" + "@octokit/types" "^13.8.0" "@octokit/request-error@^5.1.0": version "5.1.0" @@ -3042,10 +3160,10 @@ deprecation "^2.0.0" once "^1.4.0" -"@octokit/request-error@^6.0.1", "@octokit/request-error@^6.1.6": - version "6.1.6" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-6.1.6.tgz#5f42c7894e7c3ab47c63aa3241f78cee8a826644" - integrity sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg== +"@octokit/request-error@^6.1.6", "@octokit/request-error@^6.1.7": + version "6.1.7" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-6.1.7.tgz#44fc598f5cdf4593e0e58b5155fe2e77230ff6da" + integrity sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g== dependencies: "@octokit/types" "^13.6.2" @@ -3059,26 +3177,26 @@ "@octokit/types" "^13.1.0" universal-user-agent "^6.0.0" -"@octokit/request@^9.1.4": - version "9.1.4" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-9.1.4.tgz#c1e90bd57c3113253d27337c92609b8fed54d13b" - integrity sha512-tMbOwGm6wDII6vygP3wUVqFTw3Aoo0FnVQyhihh8vVq12uO3P+vQZeo2CKMpWtPSogpACD0yyZAlVlQnjW71DA== +"@octokit/request@^9.1.4", "@octokit/request@^9.2.1": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-9.2.1.tgz#63bd74b2bcc93dde62039a7d6184557523237c80" + integrity sha512-TqHLIdw1KFvx8WvLc7Jv94r3C3+AzKY2FWq7c20zvrxmCIa6MCVkLCE/826NCXnml3LFJjLsidDh1BhMaGEDQw== dependencies: - "@octokit/endpoint" "^10.0.0" - "@octokit/request-error" "^6.0.1" + "@octokit/endpoint" "^10.1.3" + "@octokit/request-error" "^6.1.6" "@octokit/types" "^13.6.2" fast-content-type-parse "^2.0.0" universal-user-agent "^7.0.2" -"@octokit/rest@21.0.2": - version "21.0.2" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-21.0.2.tgz#9b767dbc1098daea8310fd8b76bf7a97215d5972" - integrity sha512-+CiLisCoyWmYicH25y1cDfCrv41kRSvTq6pPWtRroRJzhsCZWZyCqGyI8foJT5LmScADSwRAnr/xo+eewL04wQ== +"@octokit/rest@21.1.1": + version "21.1.1" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-21.1.1.tgz#7a70455ca451b1d253e5b706f35178ceefb74de2" + integrity sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg== dependencies: - "@octokit/core" "^6.1.2" - "@octokit/plugin-paginate-rest" "^11.0.0" + "@octokit/core" "^6.1.4" + "@octokit/plugin-paginate-rest" "^11.4.2" "@octokit/plugin-request-log" "^5.3.1" - "@octokit/plugin-rest-endpoint-methods" "^13.0.0" + "@octokit/plugin-rest-endpoint-methods" "^13.3.0" "@octokit/types@^12.6.0": version "12.6.0" @@ -3087,12 +3205,12 @@ dependencies: "@octokit/openapi-types" "^20.0.0" -"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.6.1", "@octokit/types@^13.6.2": - version "13.6.2" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.6.2.tgz#e10fc4d2bdd65d836d1ced223b03ad4cfdb525bd" - integrity sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA== +"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.6.2", "@octokit/types@^13.7.0", "@octokit/types@^13.8.0": + version "13.8.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.8.0.tgz#3815885e5abd16ed9ffeea3dced31d37ce3f8a0a" + integrity sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A== dependencies: - "@octokit/openapi-types" "^22.2.0" + "@octokit/openapi-types" "^23.0.1" "@opentelemetry/api@^1.9.0", "@opentelemetry/api@~1.9.0": version "1.9.0" @@ -3100,108 +3218,115 @@ integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== "@opentelemetry/context-async-hooks@^1.26.0": - version "1.30.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.0.tgz#5639c8a7d19c6fe04a44b86aa302cb09008f6db9" - integrity sha512-roCetrG/cz0r/gugQm/jFo75UxblVvHaNSRoR0kSSRSzXFAiIBqFCZuH458BHBNRtRe+0yJdIJ21L9t94bw7+g== + version "1.30.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.1.tgz#4f76280691a742597fd0bf682982126857622948" + integrity sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA== -"@opentelemetry/semantic-conventions@^1.25.1": +"@opentelemetry/core@^1.27.0": + version "1.30.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.30.1.tgz#a0b468bb396358df801881709ea38299fc30ab27" + integrity sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ== + dependencies: + "@opentelemetry/semantic-conventions" "1.28.0" + +"@opentelemetry/semantic-conventions@1.28.0", "@opentelemetry/semantic-conventions@~1.28.0": version "1.28.0" resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz#337fb2bca0453d0726696e745f50064411f646d6" integrity sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA== -"@opentelemetry/semantic-conventions@~1.26.0": - version "1.26.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.26.0.tgz#42da14476529ca86d0af4c11f58910f242a0a232" - integrity sha512-U9PJlOswJPSgQVPI+XEuNLElyFWkb0hAiMg+DExD9V0St03X2lPHGMdxMY/LrVmoukuIpXJ12oyrOtEZ4uXFkw== +"@opentelemetry/semantic-conventions@^1.25.1": + version "1.30.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.30.0.tgz#3a42c4c475482f2ec87c12aad98832dc0087dc9a" + integrity sha512-4VlGgo32k2EQ2wcCY3vEU28A0O13aOtHz3Xt2/2U5FAh9EfhD6t6DqL5Z6yAnRCntbTFDU4YfbpyzSlHNWycPw== -"@parcel/watcher-android-arm64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz#e32d3dda6647791ee930556aee206fcd5ea0fb7a" - integrity sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ== +"@parcel/watcher-android-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1" + integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== -"@parcel/watcher-darwin-arm64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz#0d9e680b7e9ec1c8f54944f1b945aa8755afb12f" - integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw== +"@parcel/watcher-darwin-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz#3d26dce38de6590ef79c47ec2c55793c06ad4f67" + integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== -"@parcel/watcher-darwin-x64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz#f9f1d5ce9d5878d344f14ef1856b7a830c59d1bb" - integrity sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA== +"@parcel/watcher-darwin-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8" + integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== -"@parcel/watcher-freebsd-x64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz#2b77f0c82d19e84ff4c21de6da7f7d096b1a7e82" - integrity sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw== +"@parcel/watcher-freebsd-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b" + integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== -"@parcel/watcher-linux-arm-glibc@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz#92ed322c56dbafa3d2545dcf2803334aee131e42" - integrity sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA== +"@parcel/watcher-linux-arm-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1" + integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== -"@parcel/watcher-linux-arm-musl@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz#cd48e9bfde0cdbbd2ecd9accfc52967e22f849a4" - integrity sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA== +"@parcel/watcher-linux-arm-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e" + integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== -"@parcel/watcher-linux-arm64-glibc@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz#7b81f6d5a442bb89fbabaf6c13573e94a46feb03" - integrity sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA== +"@parcel/watcher-linux-arm64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30" + integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== -"@parcel/watcher-linux-arm64-musl@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz#dcb8ff01077cdf59a18d9e0a4dff7a0cfe5fd732" - integrity sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q== +"@parcel/watcher-linux-arm64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2" + integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== -"@parcel/watcher-linux-x64-glibc@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz#2e254600fda4e32d83942384d1106e1eed84494d" - integrity sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw== +"@parcel/watcher-linux-x64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz#4d2ea0f633eb1917d83d483392ce6181b6a92e4e" + integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== -"@parcel/watcher-linux-x64-musl@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz#01fcea60fedbb3225af808d3f0a7b11229792eef" - integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA== +"@parcel/watcher-linux-x64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz#277b346b05db54f55657301dd77bdf99d63606ee" + integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== -"@parcel/watcher-win32-arm64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz#87cdb16e0783e770197e52fb1dc027bb0c847154" - integrity sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig== +"@parcel/watcher-win32-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243" + integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== -"@parcel/watcher-win32-ia32@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz#778c39b56da33e045ba21c678c31a9f9d7c6b220" - integrity sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA== +"@parcel/watcher-win32-ia32@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6" + integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== -"@parcel/watcher-win32-x64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz#33873876d0bbc588aacce38e90d1d7480ce81cb7" - integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw== +"@parcel/watcher-win32-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz#ae52693259664ba6f2228fa61d7ee44b64ea0947" + integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== "@parcel/watcher@^2.4.1": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.0.tgz#5c88818b12b8de4307a9d3e6dc3e28eba0dfbd10" - integrity sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ== + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.1.tgz#342507a9cfaaf172479a882309def1e991fb1200" + integrity sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg== dependencies: detect-libc "^1.0.3" is-glob "^4.0.3" micromatch "^4.0.5" node-addon-api "^7.0.0" optionalDependencies: - "@parcel/watcher-android-arm64" "2.5.0" - "@parcel/watcher-darwin-arm64" "2.5.0" - "@parcel/watcher-darwin-x64" "2.5.0" - "@parcel/watcher-freebsd-x64" "2.5.0" - "@parcel/watcher-linux-arm-glibc" "2.5.0" - "@parcel/watcher-linux-arm-musl" "2.5.0" - "@parcel/watcher-linux-arm64-glibc" "2.5.0" - "@parcel/watcher-linux-arm64-musl" "2.5.0" - "@parcel/watcher-linux-x64-glibc" "2.5.0" - "@parcel/watcher-linux-x64-musl" "2.5.0" - "@parcel/watcher-win32-arm64" "2.5.0" - "@parcel/watcher-win32-ia32" "2.5.0" - "@parcel/watcher-win32-x64" "2.5.0" + "@parcel/watcher-android-arm64" "2.5.1" + "@parcel/watcher-darwin-arm64" "2.5.1" + "@parcel/watcher-darwin-x64" "2.5.1" + "@parcel/watcher-freebsd-x64" "2.5.1" + "@parcel/watcher-linux-arm-glibc" "2.5.1" + "@parcel/watcher-linux-arm-musl" "2.5.1" + "@parcel/watcher-linux-arm64-glibc" "2.5.1" + "@parcel/watcher-linux-arm64-musl" "2.5.1" + "@parcel/watcher-linux-x64-glibc" "2.5.1" + "@parcel/watcher-linux-x64-musl" "2.5.1" + "@parcel/watcher-win32-arm64" "2.5.1" + "@parcel/watcher-win32-ia32" "2.5.1" + "@parcel/watcher-win32-x64" "2.5.1" "@pkgjs/parseargs@^0.11.0": version "0.11.0" @@ -3282,18 +3407,17 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== -"@puppeteer/browsers@2.6.1": - version "2.6.1" - resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.6.1.tgz#d75aec5010cae377c5e4742bf5e4f62a79c21315" - integrity sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg== +"@puppeteer/browsers@2.7.1": + version "2.7.1" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.7.1.tgz#6df07e95d8e22239b77599f3ceaef4041b933e62" + integrity sha512-MK7rtm8JjaxPN7Mf1JdZIZKPD2Z+W7osvrC1vjpvfOX1K0awDIHYbNi89f7eotp7eMUn2shWnt03HwVbriXtKQ== dependencies: debug "^4.4.0" extract-zip "^2.0.1" progress "^2.0.3" proxy-agent "^6.5.0" - semver "^7.6.3" - tar-fs "^3.0.6" - unbzip2-stream "^1.4.3" + semver "^7.7.0" + tar-fs "^3.0.8" yargs "^17.7.2" "@rollup/plugin-babel@^6.0.0": @@ -3347,200 +3471,295 @@ estree-walker "^2.0.2" picomatch "^4.0.2" -"@rollup/rollup-android-arm-eabi@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz#7f4c4d8cd5ccab6e95d6750dbe00321c1f30791e" - integrity sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ== - -"@rollup/rollup-android-arm-eabi@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.0.tgz#f2552f6984cfae52784b2fbf0e47633f38955d66" - integrity sha512-qFcFto9figFLz2g25DxJ1WWL9+c91fTxnGuwhToCl8BaqDsDYMl/kOnBXAyAqkkzAWimYMSWNPWEjt+ADAHuoQ== - -"@rollup/rollup-android-arm64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz#17ea71695fb1518c2c324badbe431a0bd1879f2d" - integrity sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA== - -"@rollup/rollup-android-arm64@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.0.tgz#7e5764268d3049b7341c60f1c650f1d71760a5b2" - integrity sha512-vqrQdusvVl7dthqNjWCL043qelBK+gv9v3ZiqdxgaJvmZyIAAXMjeGVSqZynKq69T7062T5VrVTuikKSAAVP6A== - -"@rollup/rollup-darwin-arm64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz#dac0f0d0cfa73e7d5225ae6d303c13c8979e7999" - integrity sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ== - -"@rollup/rollup-darwin-arm64@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.0.tgz#c9245577f673802f0f6de0d46ee776691d77552e" - integrity sha512-617pd92LhdA9+wpixnzsyhVft3szYiN16aNUMzVkf2N+yAk8UXY226Bfp36LvxYTUt7MO/ycqGFjQgJ0wlMaWQ== - -"@rollup/rollup-darwin-x64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz#8f63baa1d31784904a380d2e293fa1ddf53dd4a2" - integrity sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ== - -"@rollup/rollup-darwin-x64@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.0.tgz#e492705339542f8b54fa66f630c9d820bc708693" - integrity sha512-Y3b4oDoaEhCypg8ajPqigKDcpi5ZZovemQl9Edpem0uNv6UUjXv7iySBpGIUTSs2ovWOzYpfw9EbFJXF/fJHWw== - -"@rollup/rollup-freebsd-arm64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz#30ed247e0df6e8858cdc6ae4090e12dbeb8ce946" - integrity sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA== - -"@rollup/rollup-freebsd-arm64@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.0.tgz#3e13b5d4d44ea87598d5d4db97181db1174fb3c8" - integrity sha512-3REQJ4f90sFIBfa0BUokiCdrV/E4uIjhkWe1bMgCkhFXbf4D8YN6C4zwJL881GM818qVYE9BO3dGwjKhpo2ABA== - -"@rollup/rollup-freebsd-x64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz#57846f382fddbb508412ae07855b8a04c8f56282" - integrity sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ== - -"@rollup/rollup-freebsd-x64@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.0.tgz#138daa08d1b345d605f57b4dedd18a50420488e7" - integrity sha512-ZtY3Y8icbe3Cc+uQicsXG5L+CRGUfLZjW6j2gn5ikpltt3Whqjfo5mkyZ86UiuHF9Q3ZsaQeW7YswlHnN+lAcg== - -"@rollup/rollup-linux-arm-gnueabihf@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz#378ca666c9dae5e6f94d1d351e7497c176e9b6df" - integrity sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA== - -"@rollup/rollup-linux-arm-gnueabihf@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.0.tgz#bdaece34f93c3dfd521e9ab8f5c740121862468e" - integrity sha512-bsPGGzfiHXMhQGuFGpmo2PyTwcrh2otL6ycSZAFTESviUoBOuxF7iBbAL5IJXc/69peXl5rAtbewBFeASZ9O0g== - -"@rollup/rollup-linux-arm-musleabihf@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz#a692eff3bab330d5c33a5d5813a090c15374cddb" - integrity sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg== - -"@rollup/rollup-linux-arm-musleabihf@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.0.tgz#1804c6ec49be21521eac612513e0666cdde2188c" - integrity sha512-kvyIECEhs2DrrdfQf++maCWJIQ974EI4txlz1nNSBaCdtf7i5Xf1AQCEJWOC5rEBisdaMFFnOWNLYt7KpFqy5A== - -"@rollup/rollup-linux-arm64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz#6b1719b76088da5ac1ae1feccf48c5926b9e3db9" - integrity sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA== - -"@rollup/rollup-linux-arm64-gnu@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.0.tgz#2c4bd90f77fcf769502743ec38f184c00a087e08" - integrity sha512-CFE7zDNrokaotXu+shwIrmWrFxllg79vciH4E/zeK7NitVuWEaXRzS0mFfFvyhZfn8WfVOG/1E9u8/DFEgK7WQ== - -"@rollup/rollup-linux-arm64-musl@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz#865baf5b6f5ff67acb32e5a359508828e8dc5788" - integrity sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A== - -"@rollup/rollup-linux-arm64-musl@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.0.tgz#63eadee20f220d28e85cbd10aba671ada8e89c84" - integrity sha512-MctNTBlvMcIBP0t8lV/NXiUwFg9oK5F79CxLU+a3xgrdJjfBLVIEHSAjQ9+ipofN2GKaMLnFFXLltg1HEEPaGQ== - -"@rollup/rollup-linux-loongarch64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz#23c6609ba0f7fa7a7f2038b6b6a08555a5055a87" - integrity sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA== - -"@rollup/rollup-linux-loongarch64-gnu@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.0.tgz#1c2c2bb30f61cbbc0fcf4e6c359777fcdb7108cc" - integrity sha512-fBpoYwLEPivL3q368+gwn4qnYnr7GVwM6NnMo8rJ4wb0p/Y5lg88vQRRP077gf+tc25akuqd+1Sxbn9meODhwA== - -"@rollup/rollup-linux-powerpc64le-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz#652ef0d9334a9f25b9daf85731242801cb0fc41c" - integrity sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A== - -"@rollup/rollup-linux-powerpc64le-gnu@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.0.tgz#cea71e0359f086a01c57cf312bef9ec9cc3ba010" - integrity sha512-1hiHPV6dUaqIMXrIjN+vgJqtfkLpqHS1Xsg0oUfUVD98xGp1wX89PIXgDF2DWra1nxAd8dfE0Dk59MyeKaBVAw== - -"@rollup/rollup-linux-riscv64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz#1eb6651839ee6ebca64d6cc64febbd299e95e6bd" - integrity sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA== - -"@rollup/rollup-linux-riscv64-gnu@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.0.tgz#25ab4a6dbcbd27f4a68382f7963363f886a237aa" - integrity sha512-U0xcC80SMpEbvvLw92emHrNjlS3OXjAM0aVzlWfar6PR0ODWCTQtKeeB+tlAPGfZQXicv1SpWwRz9Hyzq3Jx3g== - -"@rollup/rollup-linux-s390x-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz#015c52293afb3ff2a293cf0936b1d43975c1e9cd" - integrity sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg== - -"@rollup/rollup-linux-s390x-gnu@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.0.tgz#7054b237152d9e36c51194532a6b70ca1a62a487" - integrity sha512-VU/P/IODrNPasgZDLIFJmMiLGez+BN11DQWfTVlViJVabyF3JaeaJkP6teI8760f18BMGCQOW9gOmuzFaI1pUw== - -"@rollup/rollup-linux-x64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz#b83001b5abed2bcb5e2dbeec6a7e69b194235c1e" - integrity sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw== - -"@rollup/rollup-linux-x64-gnu@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.0.tgz#3656a8341a6048f2111f423301aaad8e84a5fe90" - integrity sha512-laQVRvdbKmjXuFA3ZiZj7+U24FcmoPlXEi2OyLfbpY2MW1oxLt9Au8q9eHd0x6Pw/Kw4oe9gwVXWwIf2PVqblg== - -"@rollup/rollup-linux-x64-musl@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz#6cc7c84cd4563737f8593e66f33b57d8e228805b" - integrity sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g== - -"@rollup/rollup-linux-x64-musl@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.0.tgz#cf8ae018ea6ff65eb36722a28beb93a20a6047f0" - integrity sha512-3wzKzduS7jzxqcOvy/ocU/gMR3/QrHEFLge5CD7Si9fyHuoXcidyYZ6jyx8OPYmCcGm3uKTUl+9jUSAY74Ln5A== - -"@rollup/rollup-win32-arm64-msvc@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz#631ffeee094d71279fcd1fe8072bdcf25311bc11" - integrity sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A== - -"@rollup/rollup-win32-arm64-msvc@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.0.tgz#6b968f5b068469db16eac743811ee6c040671042" - integrity sha512-jROwnI1+wPyuv696rAFHp5+6RFhXGGwgmgSfzE8e4xfit6oLRg7GyMArVUoM3ChS045OwWr9aTnU+2c1UdBMyw== - -"@rollup/rollup-win32-ia32-msvc@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz#06d1d60d5b9f718e8a6c4a43f82e3f9e3254587f" - integrity sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA== - -"@rollup/rollup-win32-ia32-msvc@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.0.tgz#0321de1a0540dd402e8e523d90cbd9d16f1b9e96" - integrity sha512-duzweyup5WELhcXx5H1jokpr13i3BV9b48FMiikYAwk/MT1LrMYYk2TzenBd0jj4ivQIt58JWSxc19y4SvLP4g== - -"@rollup/rollup-win32-x64-msvc@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz#4dff5c4259ebe6c5b4a8f2c5bc3829b7a8447ff0" - integrity sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA== - -"@rollup/rollup-win32-x64-msvc@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.0.tgz#7384b359bb45c0c3c76ba2c7aaec1d047305efcb" - integrity sha512-DYvxS0M07PvgvavMIybCOBYheyrqlui6ZQBHJs6GqduVzHSZ06TPPvlfvnYstjODHQ8UUXFwt5YE+h0jFI8kwg== - -"@rushstack/node-core-library@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.10.0.tgz#84173c913761a7d1edef5c818ce03d9e22cab9d7" - integrity sha512-2pPLCuS/3x7DCd7liZkqOewGM0OzLyCacdvOe8j6Yrx9LkETGnxul1t7603bIaB8nUAooORcct9fFDOQMbWAgw== +"@rollup/rollup-android-arm-eabi@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz#14c737dc19603a096568044eadaa60395eefb809" + integrity sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q== + +"@rollup/rollup-android-arm-eabi@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz#9b726b4dcafb9332991e9ca49d54bafc71d9d87f" + integrity sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg== + +"@rollup/rollup-android-arm-eabi@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.7.tgz#e554185b1afa5509a7a4040d15ec0c3b4435ded1" + integrity sha512-l6CtzHYo8D2TQ3J7qJNpp3Q1Iye56ssIAtqbM2H8axxCEEwvN7o8Ze9PuIapbxFL3OHrJU2JBX6FIIVnP/rYyw== + +"@rollup/rollup-android-arm64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz#9d81ea54fc5650eb4ebbc0a7d84cee331bfa30ad" + integrity sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w== + +"@rollup/rollup-android-arm64@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz#88326ff46168a47851077ca0bf0c442689ec088f" + integrity sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA== + +"@rollup/rollup-android-arm64@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.7.tgz#b1ee64bb413b2feba39803b0a1bebf2a9f3d70e1" + integrity sha512-KvyJpFUueUnSp53zhAa293QBYqwm94TgYTIfXyOTtidhm5V0LbLCJQRGkQClYiX3FXDQGSvPxOTD/6rPStMMDg== + +"@rollup/rollup-darwin-arm64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz#29448cb1370cf678b50743d2e392be18470abc23" + integrity sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q== + +"@rollup/rollup-darwin-arm64@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz#b8fbcc9389bc6fad3334a1d16dbeaaa5637c5772" + integrity sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg== + +"@rollup/rollup-darwin-arm64@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.7.tgz#bfdce3e07a345dd1bd628f3b796050f39629d7f0" + integrity sha512-jq87CjmgL9YIKvs8ybtIC98s/M3HdbqXhllcy9EdLV0yMg1DpxES2gr65nNy7ObNo/vZ/MrOTxt0bE5LinL6mA== + +"@rollup/rollup-darwin-x64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz#0ca99741c3ed096700557a43bb03359450c7857d" + integrity sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA== + +"@rollup/rollup-darwin-x64@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz#1aa2bcad84c0fb5902e945d88822e17a4f661d51" + integrity sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg== + +"@rollup/rollup-darwin-x64@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.7.tgz#781a94a537c57bdf0a500e47a25ab5985e5e8dff" + integrity sha512-rSI/m8OxBjsdnMMg0WEetu/w+LhLAcCDEiL66lmMX4R3oaml3eXz3Dxfvrxs1FbzPbJMaItQiksyMfv1hoIxnA== + +"@rollup/rollup-freebsd-arm64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz#233f8e4c2f54ad9b719cd9645887dcbd12b38003" + integrity sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ== + +"@rollup/rollup-freebsd-arm64@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz#29c54617e0929264dcb6416597d6d7481696e49f" + integrity sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ== + +"@rollup/rollup-freebsd-arm64@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.7.tgz#7a028357cbd12c5869c446ad18177c89f3405102" + integrity sha512-oIoJRy3ZrdsXpFuWDtzsOOa/E/RbRWXVokpVrNnkS7npz8GEG++E1gYbzhYxhxHbO2om1T26BZjVmdIoyN2WtA== + +"@rollup/rollup-freebsd-x64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz#dfba762a023063dc901610722995286df4a48360" + integrity sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw== + +"@rollup/rollup-freebsd-x64@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz#a8b58ab7d31882559d93f2d1b5863d9e4b4b2678" + integrity sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ== + +"@rollup/rollup-freebsd-x64@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.7.tgz#f24836a6371cccc4408db74f0fd986dacf098950" + integrity sha512-X++QSLm4NZfZ3VXGVwyHdRf58IBbCu9ammgJxuWZYLX0du6kZvdNqPwrjvDfwmi6wFdvfZ/s6K7ia0E5kI7m8Q== + +"@rollup/rollup-linux-arm-gnueabihf@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz#b9da54171726266c5ef4237f462a85b3c3cf6ac9" + integrity sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg== + +"@rollup/rollup-linux-arm-gnueabihf@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz#a844e1978c8b9766b169ecb1cb5cc0d8a3f05930" + integrity sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg== + +"@rollup/rollup-linux-arm-gnueabihf@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.7.tgz#95f27e96f0eb9b9ae9887739a8b6dffc90c1237f" + integrity sha512-Z0TzhrsNqukTz3ISzrvyshQpFnFRfLunYiXxlCRvcrb3nvC5rVKI+ZXPFG/Aa4jhQa1gHgH3A0exHaRRN4VmdQ== + +"@rollup/rollup-linux-arm-musleabihf@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz#b9db69b3f85f5529eb992936d8f411ee6d04297b" + integrity sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug== + +"@rollup/rollup-linux-arm-musleabihf@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz#6b44c3b7257985d71b087fcb4ef01325e2fff201" + integrity sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg== + +"@rollup/rollup-linux-arm-musleabihf@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.7.tgz#677b34fba9d070877736c3fe8b02aacb5e142d97" + integrity sha512-nkznpyXekFAbvFBKBy4nNppSgneB1wwG1yx/hujN3wRnhnkrYVugMTCBXED4+Ni6thoWfQuHNYbFjgGH0MBXtw== + +"@rollup/rollup-linux-arm64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz#2550cf9bb4d47d917fd1ab4af756d7bbc3ee1528" + integrity sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw== + +"@rollup/rollup-linux-arm64-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz#ebb499cf1720115256d0c9ae7598c90cc2251bc5" + integrity sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA== + +"@rollup/rollup-linux-arm64-gnu@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.7.tgz#32d3d19dedde54e91574a098f22ea43a09cf63dd" + integrity sha512-KCjlUkcKs6PjOcxolqrXglBDcfCuUCTVlX5BgzgoJHw+1rWH1MCkETLkLe5iLLS9dP5gKC7mp3y6x8c1oGBUtA== + +"@rollup/rollup-linux-arm64-musl@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz#9d06b26d286c7dded6336961a2f83e48330e0c80" + integrity sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA== + +"@rollup/rollup-linux-arm64-musl@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz#9658221b59d9e5643348f9a52fa5ef35b4dc07b1" + integrity sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q== + +"@rollup/rollup-linux-arm64-musl@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.7.tgz#a58dff44a18696df65ed8c0ad68a2945cf900484" + integrity sha512-uFLJFz6+utmpbR313TTx+NpPuAXbPz4BhTQzgaP0tozlLnGnQ6rCo6tLwaSa6b7l6gRErjLicXQ1iPiXzYotjw== + +"@rollup/rollup-linux-loongarch64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz#e957bb8fee0c8021329a34ca8dfa825826ee0e2e" + integrity sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ== + +"@rollup/rollup-linux-loongarch64-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz#19418cc57579a5655af2d850a89d74b3f7e9aa92" + integrity sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw== + +"@rollup/rollup-linux-loongarch64-gnu@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.7.tgz#a7488ab078233111e8aeb370d1ecf107ec7e1716" + integrity sha512-ws8pc68UcJJqCpneDFepnwlsMUFoWvPbWXT/XUrJ7rWUL9vLoIN3GAasgG+nCvq8xrE3pIrd+qLX/jotcLy0Qw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz#e8585075ddfb389222c5aada39ea62d6d2511ccc" + integrity sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz#fe0bce7778cb6ce86898c781f3f11369d1a4952c" + integrity sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.7.tgz#e9b9c0d6bd248a92b2d6ec01ebf99c62ae1f2e9a" + integrity sha512-vrDk9JDa/BFkxcS2PbWpr0C/LiiSLxFbNOBgfbW6P8TBe9PPHx9Wqbvx2xgNi1TOAyQHQJ7RZFqBiEohm79r0w== + +"@rollup/rollup-linux-riscv64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz#7d0d40cee7946ccaa5a4e19a35c6925444696a9e" + integrity sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw== + +"@rollup/rollup-linux-riscv64-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz#9c158360abf6e6f7794285642ba0898c580291f6" + integrity sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg== + +"@rollup/rollup-linux-riscv64-gnu@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.7.tgz#0df84ce2bea48ee686fb55060d76ab47aff45c4c" + integrity sha512-rB+ejFyjtmSo+g/a4eovDD1lHWHVqizN8P0Hm0RElkINpS0XOdpaXloqM4FBkF9ZWEzg6bezymbpLmeMldfLTw== + +"@rollup/rollup-linux-s390x-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz#c2dcd8a4b08b2f2778eceb7a5a5dfde6240ebdea" + integrity sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA== + +"@rollup/rollup-linux-s390x-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz#f9113498d22962baacdda008b5587d568b05aa34" + integrity sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw== + +"@rollup/rollup-linux-s390x-gnu@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.7.tgz#73df374c57d036856e33dbd2715138922e91e452" + integrity sha512-nNXNjo4As6dNqRn7OrsnHzwTgtypfRA3u3AKr0B3sOOo+HkedIbn8ZtFnB+4XyKJojIfqDKmbIzO1QydQ8c+Pw== + +"@rollup/rollup-linux-x64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz#183637d91456877cb83d0a0315eb4788573aa588" + integrity sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg== + +"@rollup/rollup-linux-x64-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz#aec8d4cdf911cd869a72b8bd00833cb426664e0c" + integrity sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw== + +"@rollup/rollup-linux-x64-gnu@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.7.tgz#f27af0b55f0cdd84e182e6cd44a6d03da0458149" + integrity sha512-9kPVf9ahnpOMSGlCxXGv980wXD0zRR3wyk8+33/MXQIpQEOpaNe7dEHm5LMfyRZRNt9lMEQuH0jUKj15MkM7QA== + +"@rollup/rollup-linux-x64-musl@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz#036a4c860662519f1f9453807547fd2a11d5bb01" + integrity sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow== + +"@rollup/rollup-linux-x64-musl@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz#61c0a146bdd1b5e0dcda33690dd909b321d8f20f" + integrity sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A== + +"@rollup/rollup-linux-x64-musl@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.7.tgz#c7981ad5cfb8c3cd5d643d33ca54e4d2802b9201" + integrity sha512-7wJPXRWTTPtTFDFezA8sle/1sdgxDjuMoRXEKtx97ViRxGGkVQYovem+Q8Pr/2HxiHp74SSRG+o6R0Yq0shPwQ== + +"@rollup/rollup-win32-arm64-msvc@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz#51cad812456e616bfe4db5238fb9c7497e042a52" + integrity sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw== + +"@rollup/rollup-win32-arm64-msvc@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz#c6c5bf290a3a459c18871110bc2e7009ce35b15a" + integrity sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA== + +"@rollup/rollup-win32-arm64-msvc@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.7.tgz#06cedc0ef3cbf1cbd8abcf587090712e40ae6941" + integrity sha512-MN7aaBC7mAjsiMEZcsJvwNsQVNZShgES/9SzWp1HC9Yjqb5OpexYnRjF7RmE4itbeesHMYYQiAtUAQaSKs2Rfw== + +"@rollup/rollup-win32-ia32-msvc@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz#661c8b3e4cd60f51deaa39d153aac4566e748e5e" + integrity sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw== + +"@rollup/rollup-win32-ia32-msvc@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz#16ca6bdadc9e054818b9c51f8dac82f6b8afab81" + integrity sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA== + +"@rollup/rollup-win32-ia32-msvc@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.7.tgz#90b39b977b14961a769be6ea61238e7fc668dd4d" + integrity sha512-aeawEKYswsFu1LhDM9RIgToobquzdtSc4jSVqHV8uApz4FVvhFl/mKh92wc8WpFc6aYCothV/03UjY6y7yLgbg== + +"@rollup/rollup-win32-x64-msvc@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz#73bf1885ff052b82fbb0f82f8671f73c36e9137c" + integrity sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og== + +"@rollup/rollup-win32-x64-msvc@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz#f3d03ce2d82723eb089188ea1494a719b09e1561" + integrity sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w== + +"@rollup/rollup-win32-x64-msvc@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.7.tgz#6531d61e7141091eaab0461ee8e0380c10e4ca57" + integrity sha512-4ZedScpxxIrVO7otcZ8kCX1mZArtH2Wfj3uFCxRJ9NO80gg1XV0U/b2f/MKaGwj2X3QopHfoWiDQ917FRpwY3w== + +"@rushstack/node-core-library@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.10.2.tgz#8d12bc5bd9244ea57f441877246efb0a1b7b7df6" + integrity sha512-xOF/2gVJZTfjTxbo4BDj9RtQq/HFnrrKdtem4JkyRLnwsRz2UDTg8gA1/et10fBx5RxmZD9bYVGST69W8ME5OQ== dependencies: ajv "~8.13.0" ajv-draft-04 "~1.0.0" @@ -3551,15 +3770,15 @@ resolve "~1.22.1" semver "~7.5.4" -"@rushstack/node-core-library@5.10.1": - version "5.10.1" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.10.1.tgz#14c10c918ed12da003c21af9d5bf0e76633215d2" - integrity sha512-BSb/KcyBHmUQwINrgtzo6jiH0HlGFmrUy33vO6unmceuVKTEyL2q+P0fQq2oB5hvXVWOEUhxB2QvlkZluvUEmg== +"@rushstack/node-core-library@5.11.0": + version "5.11.0" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.11.0.tgz#8ceb980f3a591e1254167bb5ffdc200d1893b783" + integrity sha512-I8+VzG9A0F3nH2rLpPd7hF8F7l5Xb7D+ldrWVZYegXM6CsKkvWc670RlgK3WX8/AseZfXA/vVrh0bpXe2Y2UDQ== dependencies: ajv "~8.13.0" ajv-draft-04 "~1.0.0" ajv-formats "~3.0.1" - fs-extra "~7.0.1" + fs-extra "~11.3.0" import-lazy "~4.0.0" jju "~1.4.0" resolve "~1.22.1" @@ -3573,152 +3792,150 @@ resolve "~1.22.1" strip-json-comments "~3.1.1" -"@rushstack/terminal@0.14.3": - version "0.14.3" - resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.14.3.tgz#eae0198e73eac56c901f6e00d0d4254c50a3f655" - integrity sha512-csXbZsAdab/v8DbU1sz7WC2aNaKArcdS/FPmXMOXEj/JBBZMvDK0+1b4Qao0kkG0ciB1Qe86/Mb68GjH6/TnMw== +"@rushstack/terminal@0.14.5": + version "0.14.5" + resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.14.5.tgz#4b0e79b139b4372901956f920b5a4a405a1d09d8" + integrity sha512-TEOpNwwmsZVrkp0omnuTUTGZRJKTr6n6m4OITiNjkqzLAkcazVpwR1SOtBg6uzpkIBLgrcNHETqI8rbw3uiUfw== dependencies: - "@rushstack/node-core-library" "5.10.0" + "@rushstack/node-core-library" "5.10.2" supports-color "~8.1.1" -"@rushstack/terminal@0.14.4": - version "0.14.4" - resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.14.4.tgz#37e160b0878a324cf3e0fecab25fe48a030e29ed" - integrity sha512-NxACqERW0PHq8Rpq1V6v5iTHEwkRGxenjEW+VWqRYQ8T9puUzgmGHmEZUaUEDHAe9Qyvp0/Ew04sAiQw9XjhJg== +"@rushstack/terminal@0.15.0": + version "0.15.0" + resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.15.0.tgz#9599c6684ed2adc9e74b767a2d45159975bcddb8" + integrity sha512-vXQPRQ+vJJn4GVqxkwRe+UGgzNxdV8xuJZY2zem46Y0p3tlahucH9/hPmLGj2i9dQnUBFiRnoM9/KW7PYw8F4Q== dependencies: - "@rushstack/node-core-library" "5.10.1" + "@rushstack/node-core-library" "5.11.0" supports-color "~8.1.1" -"@rushstack/ts-command-line@4.23.1": - version "4.23.1" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.1.tgz#d5e33dbb1a016d9440b3a20010b82ccfe9abd34a" - integrity sha512-40jTmYoiu/xlIpkkRsVfENtBq4CW3R4azbL0Vmda+fMwHWqss6wwf/Cy/UJmMqIzpfYc2OTnjYP1ZLD3CmyeCA== +"@rushstack/ts-command-line@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.3.tgz#a42fe413159c0f3f2c57afdceedf91a5b75c2d67" + integrity sha512-HazKL8fv4HMQMzrKJCrOrhyBPPdzk7iajUXgsASwjQ8ROo1cmgyqxt/k9+SdmrNLGE1zATgRqMUH3s/6smbRMA== dependencies: - "@rushstack/terminal" "0.14.3" + "@rushstack/terminal" "0.14.5" "@types/argparse" "1.0.38" argparse "~1.0.9" string-argv "~0.3.1" -"@rushstack/ts-command-line@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.2.tgz#37b28a418db84d04f6a1c787390dd02ad8dfadf0" - integrity sha512-JJ7XZX5K3ThBBva38aomgsPv1L7FV6XmSOcR6HtM7HDFZJkepqT65imw26h9ggGqMjsY0R9jcl30tzKcVj9aOQ== +"@rushstack/ts-command-line@4.23.5": + version "4.23.5" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.5.tgz#523e0db8906d831a730f15acc15fbcf7906c650a" + integrity sha512-jg70HfoK44KfSP3MTiL5rxsZH7X1ktX3cZs9Sl8eDu1/LxJSbPsh0MOFRC710lIuYYSgxWjI5AjbCBAl7u3RxA== dependencies: - "@rushstack/terminal" "0.14.4" + "@rushstack/terminal" "0.15.0" "@types/argparse" "1.0.38" argparse "~1.0.9" string-argv "~0.3.1" -"@schematics/angular@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-19.1.0-next.2.tgz#b63708db004009988a1e35b5cfc4312b1346ef15" - integrity sha512-AqpJD8Jx21aUzClvEC5YrLgF6Cbfy8BikdUzIHTa16KY9SVptKVGa2UQGgod5FWX2N7OBaGpD6v3tn+dStDjDg== +"@schematics/angular@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-19.2.0-next.2.tgz#092cbc9608acb933f61bee66beb834d17e648473" + integrity sha512-WzM0Ipyy8vgnouyJ8snYpk4pxMrx6BItxjLkorAROY0saLkm0pkGKuWq0oM2qP9Yh00q1xnS7Jg+CnRw6NlyRQ== dependencies: - "@angular-devkit/core" "19.1.0-next.2" - "@angular-devkit/schematics" "19.1.0-next.2" + "@angular-devkit/core" "19.2.0-next.2" + "@angular-devkit/schematics" "19.2.0-next.2" jsonc-parser "3.3.1" -"@shikijs/core@1.26.1": - version "1.26.1" - resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.26.1.tgz#ba7399bee73148575277780c9fe4df656d582a65" - integrity sha512-yeo7sG+WZQblKPclUOKRPwkv1PyoHYkJ4gP9DzhFJbTdueKR7wYTI1vfF/bFi1NTgc545yG/DzvVhZgueVOXMA== +"@shikijs/core@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-3.0.0.tgz#b962c9b9b75371308218eaf9a9f426c696cc2c6e" + integrity sha512-gSm3JQf2J2psiUn5bWokmZwnu5N0jfBtRps4CQ1B+qrFvmZCRAkMVoaxgl9qZgAFK5KisLAS3//XaMFVytYHKw== dependencies: - "@shikijs/engine-javascript" "1.26.1" - "@shikijs/engine-oniguruma" "1.26.1" - "@shikijs/types" "1.26.1" - "@shikijs/vscode-textmate" "^10.0.1" + "@shikijs/types" "3.0.0" + "@shikijs/vscode-textmate" "^10.0.2" "@types/hast" "^3.0.4" hast-util-to-html "^9.0.4" -"@shikijs/engine-javascript@1.26.1": - version "1.26.1" - resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-1.26.1.tgz#0881250e4a39a52b49cb50600f41bb19e429dcdb" - integrity sha512-CRhA0b8CaSLxS0E9A4Bzcb3LKBNpykfo9F85ozlNyArxjo2NkijtiwrJZ6eHa+NT5I9Kox2IXVdjUsP4dilsmw== +"@shikijs/engine-javascript@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-3.0.0.tgz#e55423e09e27d1a33365f3ea7742609e81e25333" + integrity sha512-zoB10hTfvk1iZk1ldt6VaF+0iucQL+4TtSvTdTu5MhOeLPLEf5nZ8Wz6uxlp99y627OLalYa2z4W0iTTwb6oyA== dependencies: - "@shikijs/types" "1.26.1" - "@shikijs/vscode-textmate" "^10.0.1" - oniguruma-to-es "0.10.0" + "@shikijs/types" "3.0.0" + "@shikijs/vscode-textmate" "^10.0.2" + oniguruma-to-es "^3.1.0" -"@shikijs/engine-oniguruma@1.26.1": - version "1.26.1" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.26.1.tgz#f9de733e2473e693b3d10bff32bb9761746c1d71" - integrity sha512-F5XuxN1HljLuvfXv7d+mlTkV7XukC1cawdtOo+7pKgPD83CAB1Sf8uHqP3PK0u7njFH0ZhoXE1r+0JzEgAQ+kg== +"@shikijs/engine-oniguruma@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-3.0.0.tgz#fcdae70f4a3e8539f8970f40bb63d0b93c1e7f4d" + integrity sha512-uM9lqwMrlPHPVcdpAN/4pAzTJah1pY7mi9f1MxG887SDkjF/tdiQK+5200Y8N5Hg125sewdMQ1K2agoAo8hDiA== dependencies: - "@shikijs/types" "1.26.1" - "@shikijs/vscode-textmate" "^10.0.1" + "@shikijs/types" "3.0.0" + "@shikijs/vscode-textmate" "^10.0.2" -"@shikijs/langs@1.26.1": - version "1.26.1" - resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-1.26.1.tgz#5365530e04715b21e40242eb331291712bdf7306" - integrity sha512-oz/TQiIqZejEIZbGtn68hbJijAOTtYH4TMMSWkWYozwqdpKR3EXgILneQy26WItmJjp3xVspHdiUxUCws4gtuw== +"@shikijs/langs@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-3.0.0.tgz#77b57131c36c99e0f31b4dd63aa613df33c8bc37" + integrity sha512-HBsZAukiYz7k3hzttPWa0en3PABEwK3cpxcAcERRwvwuKc5pn0Y+yPxAIYZtN9cFdtNqrbFJNhfcEu/xbG1u/A== dependencies: - "@shikijs/types" "1.26.1" + "@shikijs/types" "3.0.0" -"@shikijs/themes@1.26.1": - version "1.26.1" - resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-1.26.1.tgz#6f6ee538dc1383b8a971464c5cecda06b1a6db0d" - integrity sha512-JDxVn+z+wgLCiUhBGx2OQrLCkKZQGzNH3nAxFir4PjUcYiyD8Jdms9izyxIogYmSwmoPTatFTdzyrRKbKlSfPA== +"@shikijs/themes@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-3.0.0.tgz#678203802fc4ca763d4f46619c70f4f3f18636a5" + integrity sha512-mz63nyVB5nXWsv5H2hifDFIThZEJ/cJhMq1/+0JjMdOuuBq2H2D1Fn8UM5yzUtEvap/ipRltv381+hsHZFs4ug== dependencies: - "@shikijs/types" "1.26.1" + "@shikijs/types" "3.0.0" -"@shikijs/types@1.26.1": - version "1.26.1" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.26.1.tgz#b5ece69e21000f53d65d15ddae33d9ad9c3763ad" - integrity sha512-d4B00TKKAMaHuFYgRf3L0gwtvqpW4hVdVwKcZYbBfAAQXspgkbWqnFfuFl3MDH6gLbsubOcr+prcnsqah3ny7Q== +"@shikijs/types@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-3.0.0.tgz#8ab7ed0510a2d2184db846811a37d617728913eb" + integrity sha512-kh/xgZHxI6m9trVvPw+C47jyVHx190r0F5gkF+VO5vYB54UtcoPJe66dzZmK7GbJbzmtGEGbOwct/jsoPjjUqg== dependencies: - "@shikijs/vscode-textmate" "^10.0.1" + "@shikijs/vscode-textmate" "^10.0.2" "@types/hast" "^3.0.4" -"@shikijs/vscode-textmate@^10.0.1": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz#d06d45b67ac5e9b0088e3f67ebd3f25c6c3d711a" - integrity sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg== +"@shikijs/vscode-textmate@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz#a90ab31d0cc1dfb54c66a69e515bf624fa7b2224" + integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== -"@sigstore/bundle@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-3.0.0.tgz#ffffc750436c6eb8330ead1ca65bc892f893a7c5" - integrity sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg== +"@sigstore/bundle@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-3.1.0.tgz#74f8f3787148400ddd364be8a9a9212174c66646" + integrity sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag== dependencies: - "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/protobuf-specs" "^0.4.0" "@sigstore/core@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@sigstore/core/-/core-2.0.0.tgz#f888a8e4c8fdaa27848514a281920b6fd8eca955" integrity sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg== -"@sigstore/protobuf-specs@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz#5becf88e494a920f548d0163e2978f81b44b7d6f" - integrity sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw== +"@sigstore/protobuf-specs@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz#7524509d93efcb14e77d0bc34c43a1ae85f851c5" + integrity sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A== -"@sigstore/sign@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-3.0.0.tgz#70752aaa54dfeafa0b0fbe1f58ebe9fe3d621f8f" - integrity sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw== +"@sigstore/sign@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-3.1.0.tgz#5d098d4d2b59a279e9ac9b51c794104cda0c649e" + integrity sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw== dependencies: - "@sigstore/bundle" "^3.0.0" + "@sigstore/bundle" "^3.1.0" "@sigstore/core" "^2.0.0" - "@sigstore/protobuf-specs" "^0.3.2" - make-fetch-happen "^14.0.1" + "@sigstore/protobuf-specs" "^0.4.0" + make-fetch-happen "^14.0.2" proc-log "^5.0.0" promise-retry "^2.0.1" -"@sigstore/tuf@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-3.0.0.tgz#5f657e3052e93cb09e1735ee7f52b7938351278d" - integrity sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw== +"@sigstore/tuf@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-3.1.0.tgz#f533ac8ac572c9f7e36f5e08f1effa6b2244f55a" + integrity sha512-suVMQEA+sKdOz5hwP9qNcEjX6B45R+hFFr4LAWzbRc5O+U2IInwvay/bpG5a4s+qR35P/JK/PiKiRGjfuLy1IA== dependencies: - "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/protobuf-specs" "^0.4.0" tuf-js "^3.0.1" -"@sigstore/verify@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sigstore/verify/-/verify-2.0.0.tgz#4ad96e9234b71b57622c3c446b63bad805351030" - integrity sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg== +"@sigstore/verify@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/verify/-/verify-2.1.0.tgz#63e31dd69b678ed6d98cbfdc6d6c104b82d0905c" + integrity sha512-kAAM06ca4CzhvjIZdONAL9+MLppW3K48wOFy1TbuaWFW/OMfl8JuTgW0Bm02JB1WJGT/ET2eqav0KTEKmxqkIA== dependencies: - "@sigstore/bundle" "^3.0.0" + "@sigstore/bundle" "^3.1.0" "@sigstore/core" "^2.0.0" - "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/protobuf-specs" "^0.4.0" "@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": version "4.6.0" @@ -3764,10 +3981,10 @@ dependencies: "@ts-graphviz/common" "^2.1.5" -"@ts-graphviz/ast@^2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@ts-graphviz/ast/-/ast-2.0.6.tgz#d027b011934f9b933f7f9ba4f3ec712447cc14c2" - integrity sha512-JbOnw6+Pm+C9jRQlNV+qJG0/VTan4oCeZ0sClm++SjaaMBJ0q86O13i6wbcWKY2x8kKt9GP2hVCgM/p/BXtXWQ== +"@ts-graphviz/ast@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@ts-graphviz/ast/-/ast-2.0.7.tgz#4ec33492e4b4e998d4632030e97a9f7e149afb86" + integrity sha512-e6+2qtNV99UT6DJSoLbHfkzfyqY84aIuoV8Xlb9+hZAjgpum8iVHprGeAMQ4rF6sKUAxrmY8rfF/vgAwoPc3gw== dependencies: "@ts-graphviz/common" "^2.1.5" @@ -3776,12 +3993,12 @@ resolved "https://registry.yarnpkg.com/@ts-graphviz/common/-/common-2.1.5.tgz#a256dfaea009a5b147d8f73f25e57fb44f6462a2" integrity sha512-S6/9+T6x8j6cr/gNhp+U2olwo1n0jKj/682QVqsh7yXWV6ednHYqxFw0ZsY3LyzT0N8jaZ6jQY9YD99le3cmvg== -"@ts-graphviz/core@^2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@ts-graphviz/core/-/core-2.0.6.tgz#a9728dacd2e78c873079956bf46a23e2edcde50c" - integrity sha512-0hvrluFirC0ph3Dn2o1B0O1fI2n7Hre1HlScfmRcO6DDDq/05Vizg5UMI0LfvkJulLuz80RPjUHluh+QfBUBKw== +"@ts-graphviz/core@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@ts-graphviz/core/-/core-2.0.7.tgz#2185e390990038b267a2341c3db1cef3680bbee8" + integrity sha512-w071DSzP94YfN6XiWhOxnLpYT3uqtxJBDYdh6Jdjzt+Ce6DNspJsPQgpC7rbts/B8tEkq0LHoYuIF/O5Jh5rPg== dependencies: - "@ts-graphviz/ast" "^2.0.6" + "@ts-graphviz/ast" "^2.0.7" "@ts-graphviz/common" "^2.1.5" "@tsconfig/node10@^1.0.7": @@ -3917,10 +4134,10 @@ resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.5.tgz#db9468cb1b1b5a925b8f34822f1669df0c5472f5" integrity sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg== -"@types/chrome@^0.0.290": - version "0.0.290" - resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.290.tgz#570e511360d1b92cf24773af0c3b23b6e1f13152" - integrity sha512-N92vsAdlwoWameDQ8D4K0EZXXvxsJ1+gJg+4TWjUUsZ6gpontVmwl1XVtysA3mso45Fcn5UPiX/yqiT8GcBV3A== +"@types/chrome@^0.0.306": + version "0.0.306" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.306.tgz#67523831656fb46ce0f9e27c0ece3c911c2ff2d7" + integrity sha512-95kgcqvTNcaZCXmx/kIKY6uo83IaRNT3cuPxYqlB2Iu+HzKDCP4t7TUe7KhJijTdibcvn+SzziIcfSLIlgRnhQ== dependencies: "@types/filesystem" "*" "@types/har-format" "*" @@ -3950,11 +4167,6 @@ resolved "https://registry.yarnpkg.com/@types/convert-source-map/-/convert-source-map-2.0.3.tgz#e586c22ca4af2d670d47d32d7fe365d5c5558695" integrity sha512-ag0BfJLZf6CQz8VIuRIEYQ5Ggwk/82uvTQf27RcpyDNbY0Vw49LIPqAxk5tqYfrCs9xDaIMvl4aj7ZopnYL8bA== -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - "@types/cors@^2.8.12": version "2.8.17" resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" @@ -4063,9 +4275,9 @@ "@types/d3-color" "*" "@types/d3-path@*": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.0.tgz#2b907adce762a78e98828f0b438eaca339ae410a" - integrity sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.1.tgz#f632b380c3aca1dba8e34aa049bcd6a4af23df8a" + integrity sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg== "@types/d3-polygon@*": version "3.0.2" @@ -4088,9 +4300,9 @@ integrity sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ== "@types/d3-scale@*": - version "4.0.8" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb" - integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ== + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.9.tgz#57a2f707242e6fe1de81ad7bfcccaaf606179afb" + integrity sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw== dependencies: "@types/d3-time" "*" @@ -4173,9 +4385,9 @@ "@types/d3-zoom" "*" "@types/diff@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@types/diff/-/diff-7.0.0.tgz#e9f6a33a72164b3a80b983114a1cef9a6f0c2165" - integrity sha512-sVpkpbnTJL9CYoDf4U+tHaQLe5HiTaHWY7m9FuYA7oMCHwC9ie0Vh9eIGapyzYrU3+pILlSY2fAc4elfw5m4dg== + version "7.0.1" + resolved "https://registry.yarnpkg.com/@types/diff/-/diff-7.0.1.tgz#acc505eb2e8337ca400503283a6ab44a59906d9f" + integrity sha512-R/BHQFripuhW6XPXy05hIvXJQdQ4540KnTvEFHSLjXfHYM41liOLKgIJEyYYiQe796xpaMHfe4Uj/p7Uvng2vA== "@types/dom-view-transitions@^1.0.1": version "1.0.5" @@ -4216,9 +4428,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.3.tgz#04174d3f0836863467b7fbcbbbcd69441d205715" - integrity sha512-JEhMNwUJt7bw728CydvYzntD0XJeTmDnvwLlbfbAhE7Tbslm/ax6bdIiUwTgeVlZTsJQPwZwKpAkyDtIjsvx3g== + version "5.0.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" + integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== dependencies: "@types/node" "*" "@types/qs" "*" @@ -4267,10 +4479,15 @@ resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.33.tgz#d9d611db9d9cd99ae4e458de420eeb64ad604ea8" integrity sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g== +"@types/gensync@^1.0.0": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/gensync/-/gensync-1.0.4.tgz#7122d8f0cd3bf437f9725cc95b180197190cf50b" + integrity sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA== + "@types/geojson@*": - version "7946.0.15" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.15.tgz#f9d55fd5a0aa2de9dc80b1b04e437538b7298868" - integrity sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA== + version "7946.0.16" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.16.tgz#8ebe53d69efada7044454e3305c19017d97ced2a" + integrity sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg== "@types/glob@~7.2.0": version "7.2.0" @@ -4308,9 +4525,9 @@ integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/http-proxy@^1.17.15", "@types/http-proxy@^1.17.8": - version "1.17.15" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.15.tgz#12118141ce9775a6499ecb4c01d02f90fc839d36" - integrity sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ== + version "1.17.16" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.16.tgz#dee360707b35b3cc85afcde89ffeebff7d7f9240" + integrity sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w== dependencies: "@types/node" "*" @@ -4330,9 +4547,9 @@ integrity sha512-kq6u6TuwcyxAMN8f9GHKmMFhDC3D7aLIMR6Va1KgTji9g64KUsAE6Xw+/flPtuU/o2EQpYpdlQjg6chdBOdVzQ== "@types/jasmine@*", "@types/jasmine@^5.0.0": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-5.1.5.tgz#bba343c504f48e596837415f0558e10b8a0e5f7d" - integrity sha512-SaCZ3kM5NjOiJqMRYwHpLbTfUC2Dyk1KS3QanNFsUYPGTk70CWVK/J9ueun6zNhw/UkgV7xl8V4ZLQZNRbfnNw== + version "5.1.6" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-5.1.6.tgz#43400819398c1c13cbfa9716419128bd0b18fc52" + integrity sha512-JDwKwipGFDwf021BtRTuluYe1aMDNimtO72ygPrVXnZSC8Df2V22AHeIgGa84tbF4SLkRvN+dJnlV8aMwQjkVw== "@types/jasminewd2@^2.0.8": version "2.0.13" @@ -4404,9 +4621,9 @@ "@types/node" "*" "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=13.7.0": - version "22.10.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.5.tgz#95af89a3fb74a2bb41ef9927f206e6472026e48b" - integrity sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ== + version "22.13.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.4.tgz#3fe454d77cd4a2d73c214008b3e331bfaaf5038a" + integrity sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg== dependencies: undici-types "~6.20.0" @@ -4421,9 +4638,9 @@ integrity sha512-1RWYiq+5UfozGsU6MwJyFX6BtktcT10XRjvcAQmskCtMcW3tPske88lM/nHv7BQG1w9KBXI1zPGuu5PnNCX14g== "@types/node@^18.11.18", "@types/node@^18.19.21": - version "18.19.70" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.70.tgz#5a77508f5568d16fcd3b711c8102d7a430a04df7" - integrity sha512-RE+K0+KZoEpDUbGGctnGdkrLFwi1eYKTlIHNl2Um98mUkGsm1u2Ff6Ltd0e8DktTtC98uy7rSj+hO8t/QuLoVQ== + version "18.19.76" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.76.tgz#7991658e0ba41ad30cc8be01c9bbe580d58f2112" + integrity sha512-yvR7Q9LdPz2vGpmpJX5LolrgRdWvB67MJKDPSgIIzpFbaf9a1j/f5DnLp5VDyHGMR0QZHlTr1afsD87QCXFHKw== dependencies: undici-types "~5.26.4" @@ -4465,9 +4682,9 @@ integrity sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug== "@types/qs@*": - version "6.9.17" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a" - integrity sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ== + version "6.9.18" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" + integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== "@types/range-parser@*": version "1.2.7" @@ -4529,9 +4746,9 @@ integrity sha512-dyIGFKXfUFiwkMfNGn1+F6b80ZjR3uSYv1j6xVJSDlft5waZ2cwkHW4e7zNzvq7hiEackcgvBpmnXZrI1GltPg== "@types/selenium-webdriver@^4.1.21": - version "4.1.27" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.27.tgz#e08000d649df6f099b4099432bd2fece9f50ea7b" - integrity sha512-ALqsj8D7Swb6MnBQuAQ58J3KC3yh6fLGtAmpBmnZX8j+0kmP7NaLt56CuzBw2W2bXPrvHFTgn8iekOQFUKXEQA== + version "4.1.28" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.28.tgz#7b4f3c50a67494f8fd6d396a2eaab7d9df1f9f34" + integrity sha512-Au7CXegiS7oapbB16zxPToY4Cjzi9UQQMf3W2ZZM8PigMLTGR3iUAHjPUTddyE5g1SBjT/qpmvlsAQLBfNAdKg== dependencies: "@types/node" "*" "@types/ws" "*" @@ -4585,10 +4802,12 @@ resolved "https://registry.yarnpkg.com/@types/stack-trace/-/stack-trace-0.0.33.tgz#979a3fde9e721e78603b781e468ef30f0df0f049" integrity sha512-O7in6531Bbvlb2KEsJ0dq0CHZvc3iWSR5ZYMtvGgnHA56VgriAN/AU2LorfmcvAl2xc9N5fbCTRyMRRl8nd74g== -"@types/supports-color@^8.1.1": - version "8.1.3" - resolved "https://registry.yarnpkg.com/@types/supports-color/-/supports-color-8.1.3.tgz#b769cdce1d1bb1a3fa794e35b62c62acdf93c139" - integrity sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg== +"@types/supports-color@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/supports-color/-/supports-color-10.0.0.tgz#dc1f3aa42646db9663f446184082d4da8ee28672" + integrity sha512-Kpp/hhA8/pcxqBBKmOCIgvwCOJAI5y6TWTHhhqnB6KmuYlKtixKgN/Z7VzhShdgONe2jYREnTQbsrb3E0nt/OQ== + dependencies: + supports-color "*" "@types/systemjs@6.15.1": version "6.15.1" @@ -4625,7 +4844,14 @@ resolved "https://registry.yarnpkg.com/@types/which/-/which-1.3.2.tgz#9c246fc0c93ded311c8512df2891fb41f6227fdf" integrity sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA== -"@types/ws@*", "@types/ws@8.5.13", "@types/ws@^8.5.10": +"@types/ws@*", "@types/ws@^8.5.10": + version "8.5.14" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.14.tgz#93d44b268c9127d96026cf44353725dd9b6c3c21" + integrity sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw== + dependencies: + "@types/node" "*" + +"@types/ws@8.5.13": version "8.5.13" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20" integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA== @@ -4651,44 +4877,44 @@ dependencies: "@types/node" "*" -"@typescript-eslint/types@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" - integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== +"@typescript-eslint/types@8.24.0": + version "8.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.24.0.tgz#694e7fb18d70506c317b816de9521300b0f72c8e" + integrity sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw== -"@typescript-eslint/typescript-estree@^7.6.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" - integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== +"@typescript-eslint/typescript-estree@^8.23.0": + version "8.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.0.tgz#0487349be174097bb329a58273100a9629e03c6c" + integrity sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ== dependencies: - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" + "@typescript-eslint/types" "8.24.0" + "@typescript-eslint/visitor-keys" "8.24.0" debug "^4.3.4" - globby "^11.1.0" + fast-glob "^3.3.2" is-glob "^4.0.3" minimatch "^9.0.4" semver "^7.6.0" - ts-api-utils "^1.3.0" + ts-api-utils "^2.0.1" -"@typescript-eslint/visitor-keys@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" - integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== +"@typescript-eslint/visitor-keys@8.24.0": + version "8.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.0.tgz#36ecf0b9b1d819ad88a3bd4157ab7d594cb797c9" + integrity sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg== dependencies: - "@typescript-eslint/types" "7.18.0" - eslint-visitor-keys "^3.4.3" + "@typescript-eslint/types" "8.24.0" + eslint-visitor-keys "^4.2.0" "@typescript/vfs@^1.5.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@typescript/vfs/-/vfs-1.6.0.tgz#9c90d8c43f7ac53cc77d5959e5c4c9b639f0959e" - integrity sha512-hvJUjNVeBMp77qPINuUvYXj4FyWeeMMKZkxEATEU3hqBAQ7qdTBCUFT7Sp0Zu0faeEtFf+ldXxMEDr/bk73ISg== + version "1.6.1" + resolved "https://registry.yarnpkg.com/@typescript/vfs/-/vfs-1.6.1.tgz#fe7087d5a43715754f7ea9bf6e0b905176c9eebd" + integrity sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA== dependencies: debug "^4.1.1" "@ungap/structured-clone@^1.0.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd" - integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== "@vitejs/plugin-basic-ssl@1.2.0": version "1.2.0" @@ -4714,7 +4940,7 @@ "@vue/compiler-core" "3.5.13" "@vue/shared" "3.5.13" -"@vue/compiler-sfc@^3.5.12": +"@vue/compiler-sfc@^3.5.13": version "3.5.13" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz#461f8bd343b5c06fac4189c4fef8af32dea82b46" integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ== @@ -4906,7 +5132,7 @@ resolved "https://registry.yarnpkg.com/@webcontainer/api/-/api-1.5.1.tgz#e6d9be74d9becc5afdeefcb422fa595c2b4a4b34" integrity sha512-+ELk+TbTOUx0LawAUdB+nnxaofg/FxUXo/Ac/+CzHSP3SOc3ebBAW3fLo4UZfvJdUW+ygWZOiQMthPLQXvKZEg== -"@xmldom/xmldom@^0.8.0", "@xmldom/xmldom@^0.8.5": +"@xmldom/xmldom@^0.8.3", "@xmldom/xmldom@^0.8.5": version "0.8.10" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== @@ -4941,6 +5167,11 @@ abbrev@^2.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== +abbrev@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-3.0.0.tgz#c29a6337e167ac61a84b41b80461b29c5c271a27" + integrity sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -5042,7 +5273,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@8.17.1, ajv@^8.0.0, ajv@^8.3.0, ajv@^8.9.0: +ajv@8.17.1, ajv@^8.0.0, ajv@^8.17.1, ajv@^8.3.0, ajv@^8.9.0: version "8.17.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== @@ -5052,7 +5283,7 @@ ajv@8.17.1, ajv@^8.0.0, ajv@^8.3.0, ajv@^8.9.0: json-schema-traverse "^1.0.0" require-from-string "^2.0.2" -ajv@^6.12.3, ajv@^6.12.5, ajv@^6.12.6: +ajv@^6.12.3, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -5083,23 +5314,23 @@ ajv@~8.13.0: uri-js "^4.4.1" algoliasearch@^5.0.0: - version "5.18.0" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.18.0.tgz#2023232151f2ee9a580ea84d4a36676871979ce4" - integrity sha512-/tfpK2A4FpS0o+S78o3YSdlqXr0MavJIDlFK3XZrlXLy7vaRXJvW5jYg3v5e/wCaF8y0IpMjkYLhoV6QqfpOgw== - dependencies: - "@algolia/client-abtesting" "5.18.0" - "@algolia/client-analytics" "5.18.0" - "@algolia/client-common" "5.18.0" - "@algolia/client-insights" "5.18.0" - "@algolia/client-personalization" "5.18.0" - "@algolia/client-query-suggestions" "5.18.0" - "@algolia/client-search" "5.18.0" - "@algolia/ingestion" "1.18.0" - "@algolia/monitoring" "1.18.0" - "@algolia/recommend" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" + version "5.20.2" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.20.2.tgz#e1df37b02a4cf0f7031ff729ee9b35a7b43eeea6" + integrity sha512-8evxG++iWyWnhng3g5RP+kwn6j+2vKLfew8pVoekn87FcfsDm92zJXKwSrU6pl+m5eAbGFhFF/gCYEQiRdbPlA== + dependencies: + "@algolia/client-abtesting" "5.20.2" + "@algolia/client-analytics" "5.20.2" + "@algolia/client-common" "5.20.2" + "@algolia/client-insights" "5.20.2" + "@algolia/client-personalization" "5.20.2" + "@algolia/client-query-suggestions" "5.20.2" + "@algolia/client-search" "5.20.2" + "@algolia/ingestion" "1.20.2" + "@algolia/monitoring" "1.20.2" + "@algolia/recommend" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" "angular-1.5@npm:angular@1.5": version "1.5.11" @@ -5141,10 +5372,10 @@ algoliasearch@^5.0.0: resolved "https://registry.yarnpkg.com/angular-mocks/-/angular-mocks-1.8.3.tgz#c0dd05e5c3fc014e07af6289b23f0e817d7a4724" integrity sha512-vqsT6zwu80cZ8RY7qRQBZuy6Fq5X7/N5hkV9LzNT0c8b546rw4ErGK6muW1u2JnDKYa7+jJuaGM702bWir4HGw== -angular-split@^18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/angular-split/-/angular-split-18.0.0.tgz#0c79db52df4a7662fd685d09a972fb17d77b0663" - integrity sha512-vreR7dhwg6ubC3ZZn0vJG9Fb+8Xacf77FRQ/3IdChzsRFya1LxJh/Wk7uBk8q9Xi0pOKBKruZ3OWGjhqvHmETg== +angular-split@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/angular-split/-/angular-split-19.0.0.tgz#7ff3db6f0fb8da106c01201e153eed12e3029c7d" + integrity sha512-vQqXWLcCimFmInu2lpGKIfS9FtYBgKmoWenPjeYkHSRdWmb7HLGlQoNPj1oALrwdhIWFPdySgp0BIXDe2IAepQ== dependencies: tslib "^2.0.0" @@ -5389,11 +5620,6 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-flatten@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-3.0.0.tgz#6428ca2ee52c7b823192ec600fa3ed2f157cd541" - integrity sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA== - array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" @@ -5411,11 +5637,6 @@ array-union@^1.0.1: dependencies: array-uniq "^1.0.1" -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -5471,10 +5692,10 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== -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-module-types@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-6.0.1.tgz#4b4ca0251c57b815bab62604dcb22f8c903e2523" + integrity sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA== ast-types@^0.13.4: version "0.13.4" @@ -5502,6 +5723,11 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77" integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + async-lock@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.4.1.tgz#56b8718915a9b68b10fce2f2a9a3dddf765ef53f" @@ -5600,6 +5826,14 @@ babel-plugin-polyfill-corejs3@^0.10.6: "@babel/helper-define-polyfill-provider" "^0.6.2" core-js-compat "^3.38.0" +babel-plugin-polyfill-corejs3@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz#4e4e182f1bb37c7ba62e2af81d8dd09df31344f6" + integrity sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.3" + core-js-compat "^3.40.0" + babel-plugin-polyfill-regenerator@^0.6.1: version "0.6.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz#abeb1f3f1c762eace37587f42548b08b57789bc8" @@ -5622,35 +5856,35 @@ balanced-match@^1.0.0: integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== bare-events@^2.0.0, bare-events@^2.2.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.2.tgz#b161b0f4931038fff0a234d18d897851cc8e3554" - integrity sha512-KSdMqLj1ZERZMP1PTmnLK7SqJu9z9/SbwUUPZly2puMtfVcytC+jl6mb/9XYiqq0PXcx1rNDS+Qvl1g54Lho6A== + version "2.5.4" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.4.tgz#16143d435e1ed9eafd1ab85f12b89b3357a41745" + integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== -bare-fs@^2.1.1: - version "2.3.5" - resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.3.5.tgz#05daa8e8206aeb46d13c2fe25a2cd3797b0d284a" - integrity sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw== +bare-fs@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.0.1.tgz#85844f34da819c76754d545323a8b23ed3617c76" + integrity sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg== dependencies: bare-events "^2.0.0" - bare-path "^2.0.0" + bare-path "^3.0.0" bare-stream "^2.0.0" -bare-os@^2.1.0: - version "2.4.4" - resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.4.4.tgz#01243392eb0a6e947177bb7c8a45123d45c9b1a9" - integrity sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ== +bare-os@^3.0.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-3.4.0.tgz#97be31503f3095beb232a6871f0118859832eb0c" + integrity sha512-9Ous7UlnKbe3fMi7Y+qh0DwAup6A1JkYgPnjvMDNOlmnxNRQvQ/7Nst+OnUQKzk0iAT0m9BisbDVp9gCv8+ETA== -bare-path@^2.0.0, bare-path@^2.1.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-2.1.3.tgz#594104c829ef660e43b5589ec8daef7df6cedb3e" - integrity sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA== +bare-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.0.0.tgz#b59d18130ba52a6af9276db3e96a2e3d3ea52178" + integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw== dependencies: - bare-os "^2.1.0" + bare-os "^3.0.1" bare-stream@^2.0.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.1.tgz#b3b9874fab05b662c9aea2706a12fb0698c46836" - integrity sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g== + version "2.6.5" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.5.tgz#bba8e879674c4c27f7e27805df005c15d7a2ca07" + integrity sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA== dependencies: streamx "^2.21.0" @@ -5677,7 +5911,7 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -basic-auth-connect@^1.0.0: +basic-auth-connect@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.1.0.tgz#b44af37d5b3bd7561b56491e58cf26ae1578f0c7" integrity sha512-rKcWjfiRZ3p5WS9e5q6msXa07s6DaFAMXoyowV+mb2xQG+oYdw2QEUyKi0Xp95JvXzShlM+oGy5QuqSK6TfC1Q== @@ -5951,10 +6185,10 @@ browser-sync@^3.0.0: ua-parser-js "^1.0.33" yargs "^17.3.1" -browserslist@^4.21.5, browserslist@^4.23.0, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.2: - version "4.24.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.3.tgz#5fc2725ca8fb3c1432e13dac278c7cc103e026d2" - integrity sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA== +browserslist@^4.21.5, browserslist@^4.23.0, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.3: + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== dependencies: caniuse-lite "^1.0.30001688" electron-to-chromium "^1.5.73" @@ -6138,9 +6372,9 @@ cacheable-request@^7.0.2: responselike "^2.0.0" call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" - integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: es-errors "^1.3.0" function-bind "^1.1.2" @@ -6192,9 +6426,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688: - version "1.0.30001690" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" - integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== + version "1.0.30001699" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz#a102cf330d153bf8c92bfb5be3cd44c0a89c8c12" + integrity sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w== canonical-path@1.0.0: version "1.0.0" @@ -6255,7 +6489,7 @@ chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^5.0.1, chalk@^5.3.0: +chalk@^5.0.1, chalk@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== @@ -6413,13 +6647,13 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== -chromium-bidi@0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.11.0.tgz#9c3c42ee7b42d8448e9fce8d649dc8bfbcc31153" - integrity sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA== +chromium-bidi@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-1.3.0.tgz#59051cae1532444f2642e612f917100ce720a90f" + integrity sha512-G3x1bkST13kmbL7+dT/oRkNH/7C4UqG+0YQpmySrzXspyOhYgDNc6lhSGpj3cuexvH25WTENhTYq2Tt9JRXtbw== dependencies: - mitt "3.0.1" - zod "3.23.8" + mitt "^3.0.1" + zod "^3.24.1" ci-info@^2.0.0: version "2.0.0" @@ -6448,12 +6682,12 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -cldr@7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/cldr/-/cldr-7.6.0.tgz#d60e2bf653d92250a8ee282ad717a53b9d0e706f" - integrity sha512-x1fXSd+5qacodW7Er+LnNmduSEeR59c3lJY2XhXtiuB+Fxv3BOgiIs7zxggEMOPXYjSJHxMNEBlgUopJXZezGQ== +cldr@7.7.0: + version "7.7.0" + resolved "https://registry.yarnpkg.com/cldr/-/cldr-7.7.0.tgz#ae63fe3ad8af60a7f32ec361434033809845e1b8" + integrity sha512-msq6/WPgHphmZwuxrjr4oAsVUSYc572/5EFn5LBf6waDsMWGg8Fx1PbGHgN8OoWN2NdNXluoL4VkmU2/oIyuSw== dependencies: - "@xmldom/xmldom" "^0.8.0" + "@xmldom/xmldom" "^0.8.3" escodegen "^2.0.0" esprima "^4.0.1" memoizeasync "^1.1.0" @@ -6509,7 +6743,7 @@ cli-spinners@^2.5.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== -cli-table3@^0.6.5: +cli-table3@0.6.5, cli-table3@^0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== @@ -6518,13 +6752,6 @@ cli-table3@^0.6.5: optionalDependencies: "@colors/colors" "1.5.0" -cli-table@0.3.11: - version "0.3.11" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.11.tgz#ac69cdecbe81dccdba4889b9a18b7da312a9d3ee" - integrity sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ== - dependencies: - colors "1.0.3" - cli-truncate@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" @@ -6659,11 +6886,6 @@ colorette@^2.0.10, colorette@^2.0.19, colorette@^2.0.20: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -colors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== - colors@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -6699,7 +6921,7 @@ commander@^10.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== -commander@^12.0.0, commander@^12.1.0: +commander@^12.1.0: version "12.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== @@ -6791,9 +7013,9 @@ compressing@^1.10.0: yazl "^2.4.2" compression@^1.7.0, compression@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.5.tgz#fdd256c0a642e39e314c478f6c2cd654edd74c93" - integrity sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q== + version "1.8.0" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.0.tgz#09420efc96e11a0f44f3a558de59e321364180f7" + integrity sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA== dependencies: bytes "3.1.2" compressible "~2.0.18" @@ -7063,17 +7285,17 @@ copy-webpack-plugin@12.0.2: schema-utils "^4.2.0" serialize-javascript "^6.0.2" -core-js-compat@^3.38.0, core-js-compat@^3.38.1: - version "3.39.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.39.0.tgz#b12dccb495f2601dc860bdbe7b4e3ffa8ba63f61" - integrity sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw== +core-js-compat@^3.38.0, core-js-compat@^3.40.0: + version "3.40.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.40.0.tgz#7485912a5a4a4315c2fdb2cbdc623e6881c88b38" + integrity sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ== dependencies: - browserslist "^4.24.2" + browserslist "^4.24.3" core-js@^3.6.5: - version "3.39.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.39.0.tgz#57f7647f4d2d030c32a72ea23a0555b2eaa30f83" - integrity sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g== + version "3.40.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.40.0.tgz#2773f6b06877d8eda102fc42f828176437062476" + integrity sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ== core-util-is@1.0.2: version "1.0.2" @@ -7153,25 +7375,14 @@ crelt@^1.0.5: resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== -cross-env@^5.1.3: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.1.tgz#b2c76c1ca7add66dc874d11798466094f551b34d" - integrity sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ== - dependencies: - cross-spawn "^6.0.5" - -cross-spawn@^6.0.5: - version "6.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" - integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" + cross-spawn "^7.0.1" -cross-spawn@^7.0.0, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3, cross-spawn@^7.0.5: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -7230,12 +7441,13 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssstyle@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.1.0.tgz#161faee382af1bafadb6d3867a92a19bcb4aea70" - integrity sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA== +cssstyle@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.2.1.tgz#5142782410fea95db66fb68147714a652a7c2381" + integrity sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw== dependencies: - rrweb-cssom "^0.7.1" + "@asamuzakjp/css-color" "^2.8.2" + rrweb-cssom "^0.8.0" csv-parse@^5.0.4: version "5.6.0" @@ -7262,9 +7474,9 @@ cytoscape-fcose@^2.2.0: cose-base "^2.2.0" cytoscape@^3.29.2: - version "3.30.4" - resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.30.4.tgz#3404da0a159c00a1a3df2c85b2b43fdc66a0e28e" - integrity sha512-OxtlZwQl1WbwMmLiyPSEBuzeTIQnwZhJYYWFzZ2PhEHVFwpeaqNIkUzSiso00D98qk60l8Gwon2RP304d3BJ1A== + version "3.31.0" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.31.0.tgz#cffbbb8ca51db01cbf360e0cf59088db6d429837" + integrity sha512-zDGn1K/tfZwEnoGOcHc0H4XazqAAXAuDpcYw9mUnUjATjqljyCNGJv8uEvbvxGaGHaVshxMecyl6oc6uKzRfbw== "d3-array@1 - 2": version "2.12.1" @@ -7643,9 +7855,9 @@ decamelize@^1.2.0: integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.4.3: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + version "10.5.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.5.0.tgz#0f371c7cf6c4898ce0afb09836db73cd82010f22" + integrity sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw== decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: version "0.2.2" @@ -7802,14 +8014,14 @@ depd@~1.1.2: integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== dependency-tree@^11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/dependency-tree/-/dependency-tree-11.0.1.tgz#319c27652655f0ff63dc90809322156e90aa2a55" - integrity sha512-eCt7HSKIC9NxgIykG2DRq3Aewn9UhVS14MB3rEn6l/AsEI1FBg6ZGSlCU0SZ6Tjm2kkhj6/8c2pViinuyKELhg== + version "11.1.1" + resolved "https://registry.yarnpkg.com/dependency-tree/-/dependency-tree-11.1.1.tgz#5ab5fbb223fb32a9b03ed40952eb04bf09929ad6" + integrity sha512-pnkCd8VGOq70EVaEQxDC9mZCjCwYj4yG4j8h+PEJswuWp+rdE6p8zbtVvWk+yPwaVimOjlhNi782U9K5KOU9MQ== dependencies: - commander "^12.0.0" - filing-cabinet "^5.0.1" - precinct "^12.0.2" - typescript "^5.4.5" + commander "^12.1.0" + filing-cabinet "^5.0.3" + precinct "^12.2.0" + typescript "^5.7.3" deprecation@^2.0.0: version "2.3.1" @@ -7846,81 +8058,81 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -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== +detective-amd@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/detective-amd/-/detective-amd-6.0.1.tgz#71eb13b5d9b17222d7b4de3fb89a8e684d8b9a23" + integrity sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g== dependencies: - ast-module-types "^6.0.0" + ast-module-types "^6.0.1" escodegen "^2.1.0" - get-amd-module-type "^6.0.0" - node-source-walk "^7.0.0" + get-amd-module-type "^6.0.1" + node-source-walk "^7.0.1" -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== +detective-cjs@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/detective-cjs/-/detective-cjs-6.0.1.tgz#4fb81a67337630811409abb2148b2b622cacbdcd" + integrity sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw== dependencies: - ast-module-types "^6.0.0" - node-source-walk "^7.0.0" + ast-module-types "^6.0.1" + node-source-walk "^7.0.1" -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== +detective-es6@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/detective-es6/-/detective-es6-5.0.1.tgz#f0c026bc9b767a243e57ef282f4343fcf3b8ec4e" + integrity sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew== dependencies: - node-source-walk "^7.0.0" + node-source-walk "^7.0.1" -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== +detective-postcss@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/detective-postcss/-/detective-postcss-7.0.1.tgz#f5822d8988339fb56851fcdb079d51fbcff114db" + integrity sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ== 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== +detective-sass@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/detective-sass/-/detective-sass-6.0.1.tgz#fcf5aa51bebf7b721807be418418470ee2409f8a" + integrity sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw== dependencies: gonzales-pe "^4.3.0" - node-source-walk "^7.0.0" + node-source-walk "^7.0.1" -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== +detective-scss@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/detective-scss/-/detective-scss-5.0.1.tgz#6a7f792dc9c0e8cfc0d252a50ba26a6df12596a7" + integrity sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg== dependencies: gonzales-pe "^4.3.0" - node-source-walk "^7.0.0" + node-source-walk "^7.0.1" -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-stylus@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/detective-stylus/-/detective-stylus-5.0.1.tgz#57d54a0b405305ee16655e42008b38a827a9f179" + integrity sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA== -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== +detective-typescript@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/detective-typescript/-/detective-typescript-14.0.0.tgz#3cf429652eb7d7d2be2c050ac47af957a559527d" + integrity sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw== dependencies: - "@typescript-eslint/typescript-estree" "^7.6.0" - ast-module-types "^6.0.0" - node-source-walk "^7.0.0" + "@typescript-eslint/typescript-estree" "^8.23.0" + ast-module-types "^6.0.1" + node-source-walk "^7.0.1" -detective-vue2@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detective-vue2/-/detective-vue2-2.1.0.tgz#d8744e1d19aa4dcabc2ff9dcce4fbd8adfe3d12b" - integrity sha512-IHQVhwk7dKaJ+GHBsL27mS9NRO1/vLZJPSODqtJgKquij0/UL8NvrbXbADbYeTkwyh1ReW/v9u9IRyEO5dvGZg== +detective-vue2@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/detective-vue2/-/detective-vue2-2.2.0.tgz#35fd1d39e261b064aca9fcaf20e136c76877482a" + integrity sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA== dependencies: - "@dependents/detective-less" "^5.0.0" - "@vue/compiler-sfc" "^3.5.12" - 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" + "@dependents/detective-less" "^5.0.1" + "@vue/compiler-sfc" "^3.5.13" + detective-es6 "^5.0.1" + detective-sass "^6.0.1" + detective-scss "^5.0.1" + detective-stylus "^5.0.1" + detective-typescript "^14.0.0" dev-ip@^1.0.1: version "1.0.1" @@ -7934,10 +8146,10 @@ devlop@^1.0.0: dependencies: dequal "^2.0.0" -devtools-protocol@0.0.1367902: - version "0.0.1367902" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz#7333bfc4466c5a54a4c6de48a9dfbcb4b811660c" - integrity sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg== +devtools-protocol@0.0.1402036: + version "0.0.1402036" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1402036.tgz#6f55044daed0ae5f0ec5c80c834b7b8edc822441" + integrity sha512-JwAYQgEvm3yD45CHB+RmF5kMbWtXBaOGwuxa87sZogHcLCv8c/IqnThaoQ1y60d7pXWjSKWQphPEc+1rAScVdg== devtools-protocol@0.0.818844: version "0.0.818844" @@ -7974,13 +8186,6 @@ diff@^7.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - discontinuous-range@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" @@ -8033,21 +8238,20 @@ domhandler@^5.0.2, domhandler@^5.0.3: domelementtype "^2.3.0" "domino@https://github.com/angular/domino.git#8f228f8862540c6ccd14f76b5a1d9bb5458618af": - version "2.1.6+git" - uid "8f228f8862540c6ccd14f76b5a1d9bb5458618af" + version "2.1.6" resolved "https://github.com/angular/domino.git#8f228f8862540c6ccd14f76b5a1d9bb5458618af" dompurify@^3.2.1: - version "3.2.3" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.3.tgz#05dd2175225324daabfca6603055a09b2382a4cd" - integrity sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA== + version "3.2.4" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.4.tgz#af5a5a11407524431456cf18836c55d13441cd8e" + integrity sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg== optionalDependencies: "@types/trusted-types" "^2.0.7" domutils@^3.0.1, domutils@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.1.tgz#b39f4c390a1ae6f6a2c56a5f5a16d6438b6bce28" - integrity sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw== + version "3.2.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== dependencies: dom-serializer "^2.0.0" domelementtype "^2.3.0" @@ -8158,9 +8362,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.5.73: - version "1.5.76" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz#db20295c5061b68f07c8ea4dfcbd701485d94a3d" - integrity sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ== + version "1.5.100" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.100.tgz#c99b7cfe49ec72c5e22237f036bb8b1d8b7f0621" + integrity sha512-u1z9VuzDXV86X2r3vAns0/5ojfXBue9o0+JDUDBKYqGLjxLkSqsSUoPU/6kW0gx76V44frHaf6Zo+QF74TQCMg== emoji-regex-xs@^1.0.0: version "1.0.0" @@ -8227,9 +8431,9 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1, end-of-stream@ once "^1.4.0" engine.io-client@~6.6.1: - version "6.6.2" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.6.2.tgz#e0a09e1c90effe5d6264da1c56d7281998f1e50b" - integrity sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw== + version "6.6.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.6.3.tgz#815393fa24f30b8e6afa8f77ccca2f28146be6de" + integrity sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" @@ -8243,11 +8447,10 @@ engine.io-parser@~5.2.1: integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== engine.io@~6.6.0: - version "6.6.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.2.tgz#32bd845b4db708f8c774a4edef4e5c8a98b3da72" - integrity sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw== + version "6.6.4" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.4.tgz#0a89a3e6b6c1d4b0c2a2a637495e7c149ec8d8ee" + integrity sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g== dependencies: - "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" "@types/node" ">=10.0.0" accepts "~1.3.4" @@ -8258,10 +8461,10 @@ engine.io@~6.6.0: engine.io-parser "~5.2.1" ws "~8.17.1" -enhanced-resolve@^5.16.0, enhanced-resolve@^5.17.1: - version "5.18.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz#91eb1db193896b9801251eeff1c6980278b1e404" - integrity sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ== +enhanced-resolve@^5.17.1, enhanced-resolve@^5.18.0: + version "5.18.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz#728ab082f8b7b6836de51f1637aab5d3b9568faf" + integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -8383,9 +8586,9 @@ es-module-lexer@^1.2.1: integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" @@ -8420,42 +8623,12 @@ es6-module-loader@^0.17.4: dependencies: when "^3.7.2" -esbuild-wasm@0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.24.0.tgz#99f44feb1dfccd25dbe7de1a26326ea1c7aca0d8" - integrity sha512-xhNn5tL1AhkPg4ft59yXT6FkwKXiPSYyz1IeinJHUJpjvOHOIPvdmFQc0pGdjxlKSbzZc2mNmtVOWAR1EF/JAg== +esbuild-wasm@0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.25.0.tgz#56bbcc29d9eb5052ff1598248dc37dd958876e82" + integrity sha512-60iuWr6jdTVylmGXjpnqk3pCktUi5Rmjiv6EMza3h4X20BLtfL2BjUGs1+UCt2G9UK7jVGrJdUr5i1k0sL3wBg== -esbuild@0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.0.tgz#f2d470596885fcb2e91c21eb3da3b3c89c0b55e7" - integrity sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ== - optionalDependencies: - "@esbuild/aix-ppc64" "0.24.0" - "@esbuild/android-arm" "0.24.0" - "@esbuild/android-arm64" "0.24.0" - "@esbuild/android-x64" "0.24.0" - "@esbuild/darwin-arm64" "0.24.0" - "@esbuild/darwin-x64" "0.24.0" - "@esbuild/freebsd-arm64" "0.24.0" - "@esbuild/freebsd-x64" "0.24.0" - "@esbuild/linux-arm" "0.24.0" - "@esbuild/linux-arm64" "0.24.0" - "@esbuild/linux-ia32" "0.24.0" - "@esbuild/linux-loong64" "0.24.0" - "@esbuild/linux-mips64el" "0.24.0" - "@esbuild/linux-ppc64" "0.24.0" - "@esbuild/linux-riscv64" "0.24.0" - "@esbuild/linux-s390x" "0.24.0" - "@esbuild/linux-x64" "0.24.0" - "@esbuild/netbsd-x64" "0.24.0" - "@esbuild/openbsd-arm64" "0.24.0" - "@esbuild/openbsd-x64" "0.24.0" - "@esbuild/sunos-x64" "0.24.0" - "@esbuild/win32-arm64" "0.24.0" - "@esbuild/win32-ia32" "0.24.0" - "@esbuild/win32-x64" "0.24.0" - -esbuild@^0.24.0: +esbuild@0.24.2, esbuild@^0.24.2: version "0.24.2" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d" integrity sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA== @@ -8486,6 +8659,37 @@ esbuild@^0.24.0: "@esbuild/win32-ia32" "0.24.2" "@esbuild/win32-x64" "0.24.2" +esbuild@0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.0.tgz#0de1787a77206c5a79eeb634a623d39b5006ce92" + integrity sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.0" + "@esbuild/android-arm" "0.25.0" + "@esbuild/android-arm64" "0.25.0" + "@esbuild/android-x64" "0.25.0" + "@esbuild/darwin-arm64" "0.25.0" + "@esbuild/darwin-x64" "0.25.0" + "@esbuild/freebsd-arm64" "0.25.0" + "@esbuild/freebsd-x64" "0.25.0" + "@esbuild/linux-arm" "0.25.0" + "@esbuild/linux-arm64" "0.25.0" + "@esbuild/linux-ia32" "0.25.0" + "@esbuild/linux-loong64" "0.25.0" + "@esbuild/linux-mips64el" "0.25.0" + "@esbuild/linux-ppc64" "0.25.0" + "@esbuild/linux-riscv64" "0.25.0" + "@esbuild/linux-s390x" "0.25.0" + "@esbuild/linux-x64" "0.25.0" + "@esbuild/netbsd-arm64" "0.25.0" + "@esbuild/netbsd-x64" "0.25.0" + "@esbuild/openbsd-arm64" "0.25.0" + "@esbuild/openbsd-x64" "0.25.0" + "@esbuild/sunos-x64" "0.25.0" + "@esbuild/win32-arm64" "0.25.0" + "@esbuild/win32-ia32" "0.25.0" + "@esbuild/win32-x64" "0.25.0" + esbuild@~0.23.0: version "0.23.1" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.1.tgz#40fdc3f9265ec0beae6f59824ade1bd3d3d2dab8" @@ -8560,10 +8764,10 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -8663,9 +8867,9 @@ exegesis-express@^4.0.0: exegesis "^4.1.0" exegesis@^4.1.0, exegesis@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/exegesis/-/exegesis-4.2.0.tgz#2d248542b3c58a3c51f33fe9f05be1da1d908b4a" - integrity sha512-MOzRyqhvl+hTA4+W4p0saWRIPlu0grIx4ykjMEYgGLiqr/z9NCIlwSq2jF0gyxNjPZD3xyHgmkW6BSaLVUdctg== + version "4.3.0" + resolved "https://registry.yarnpkg.com/exegesis/-/exegesis-4.3.0.tgz#3b5c45222f543f70ab89fa49eea3a564111a7324" + integrity sha512-V90IJQ4XYO1SfH5qdJTOijXkQTF3hSpSHHqlf7MstUMDKP22iAvi63gweFLtPZ4Gj3Wnh8RgJX5TGu0WiwTyDQ== dependencies: "@apidevtools/json-schema-ref-parser" "^9.0.3" ajv "^8.3.0" @@ -8680,7 +8884,6 @@ exegesis@^4.1.0, exegesis@^4.2.0: lodash "^4.17.11" openapi3-ts "^3.1.1" promise-breaker "^6.0.0" - pump "^3.0.0" qs "^6.6.0" raw-body "^2.3.3" semver "^7.0.0" @@ -8711,9 +8914,9 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: homedir-polyfill "^1.0.1" exponential-backoff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" - integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.2.tgz#a8f26adb96bf78e8cd8ad1037928d5e5c0679d91" + integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA== express@^4.16.4, express@^4.21.2: version "4.21.2" @@ -8843,18 +9046,7 @@ fast-fifo@^1.2.0, fast-fifo@^1.3.2: resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== -fast-glob@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-glob@3.3.3, fast-glob@^3.2.9, fast-glob@^3.3.2: +fast-glob@3.3.3, fast-glob@^3.3.2, fast-glob@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== @@ -8878,16 +9070,9 @@ fast-levenshtein@^3.0.0: fastest-levenshtein "^1.0.7" fast-uri@^3.0.1: - version "3.0.5" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.5.tgz#19f5f9691d0dab9b85861a7bb5d98fca961da9cd" - integrity sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q== - -fast-url-parser@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" + version "3.0.6" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== fastest-levenshtein@^1.0.7: version "1.0.16" @@ -8895,9 +9080,9 @@ fastest-levenshtein@^1.0.7: integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.13.0, fastq@^1.6.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0" - integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw== + version "1.19.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.0.tgz#a82c6b7c2bb4e44766d865f07997785fecfdcb89" + integrity sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA== dependencies: reusify "^1.0.4" @@ -8923,9 +9108,9 @@ fd-slicer@~1.1.0: pend "~1.2.0" fdir@^6.2.0: - version "6.4.2" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689" - integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== + version "6.4.3" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.3.tgz#011cdacf837eca9b811c89dbb902df714273db72" + integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== fecha@^4.2.0: version "4.2.3" @@ -8954,22 +9139,22 @@ filesize@^6.1.0: resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd" integrity sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ== -filing-cabinet@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/filing-cabinet/-/filing-cabinet-5.0.2.tgz#5d35bce3216af258a7ce7d3561d68ed86fb37d6f" - integrity sha512-RZlFj8lzyu6jqtFBeXNqUjjNG6xm+gwXue3T70pRxw1W40kJwlgq0PSWAmh0nAnn5DHuBIecLXk9+1VKS9ICXA== +filing-cabinet@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/filing-cabinet/-/filing-cabinet-5.0.3.tgz#e5ab960958653ee7fe70d5d99b3b88c342ce7907" + integrity sha512-PlPcMwVWg60NQkhvfoxZs4wEHjhlOO/y7OAm4sKM60o1Z9nttRY4mcdQxp/iZ+kg/Vv6Hw1OAaTbYVM9DA9pYg== dependencies: app-module-path "^2.2.0" - commander "^12.0.0" - enhanced-resolve "^5.16.0" - module-definition "^6.0.0" - module-lookup-amd "^9.0.1" - resolve "^1.22.8" - resolve-dependency-path "^4.0.0" - sass-lookup "^6.0.1" - stylus-lookup "^6.0.0" + commander "^12.1.0" + enhanced-resolve "^5.18.0" + module-definition "^6.0.1" + module-lookup-amd "^9.0.3" + resolve "^1.22.10" + resolve-dependency-path "^4.0.1" + sass-lookup "^6.1.0" + stylus-lookup "^6.1.0" tsconfig-paths "^4.2.0" - typescript "^5.4.4" + typescript "^5.7.3" fill-range@^4.0.0: version "4.0.0" @@ -9098,34 +9283,35 @@ fined@^2.0.0: parse-filepath "^1.0.2" firebase-tools@^13.0.0: - version "13.29.1" - resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-13.29.1.tgz#fc373ad624c1cb48d053ec22a1b38ed7ea89eb08" - integrity sha512-fFiUF9KNdVPzcQKHqtewTzQNsjm6GrvCyVyXiIDiiUFO9zIEmM6m4sI/Y9cKg8dknCTsqr0D4cNv2d6AoUaeWg== + version "13.31.1" + resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-13.31.1.tgz#5bfabb3ea0417c61a23059e058d93a595d240bf2" + integrity sha512-CzQsIwa7sh/0/bNhmg0lYxf4xltMA8nRX665ATpFSuzSyb3j7m5iQjI1og/gjBSTgGfXU7e/ULWkr8wDdbFqoQ== dependencies: - "@electric-sql/pglite" "^0.2.0" + "@electric-sql/pglite" "^0.2.16" "@google-cloud/cloud-sql-connector" "^1.3.3" "@google-cloud/pubsub" "^4.5.0" abort-controller "^3.0.0" - ajv "^6.12.6" + ajv "^8.17.1" + ajv-formats "3.0.1" archiver "^7.0.0" async-lock "1.4.1" body-parser "^1.19.0" chokidar "^3.6.0" cjson "^0.3.1" - cli-table "0.3.11" + cli-table3 "0.6.5" colorette "^2.0.19" commander "^5.1.0" configstore "^5.0.1" cors "^2.8.5" - cross-env "^5.1.3" - cross-spawn "^7.0.3" + cross-env "^7.0.3" + cross-spawn "^7.0.5" csv-parse "^5.0.4" deep-equal-in-any-order "^2.0.6" exegesis "^4.2.0" exegesis-express "^4.0.0" express "^4.16.4" filesize "^6.1.0" - form-data "^4.0.0" + form-data "^4.0.1" fs-extra "^10.1.0" fuzzy "^0.1.3" gaxios "^6.7.0" @@ -9157,7 +9343,7 @@ firebase-tools@^13.0.0: sql-formatter "^15.3.0" stream-chain "^2.2.4" stream-json "^1.7.3" - superstatic "^9.1.0" + superstatic "^9.2.0" tar "^6.1.11" tcp-port-used "^1.0.2" tmp "^0.2.3" @@ -9201,11 +9387,11 @@ follow-redirects@^1.0.0: integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: - is-callable "^1.1.3" + is-callable "^1.2.7" for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" @@ -9241,16 +9427,17 @@ forever-agent@~0.6.1: integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== form-data@^2.5.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.2.tgz#dc653743d1de2fcc340ceea38079daf6e9069fd2" - integrity sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q== + version "2.5.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.3.tgz#f9bcf87418ce748513c0c3494bb48ec270c97acc" + integrity sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + mime-types "^2.1.35" safe-buffer "^5.2.1" -form-data@^4.0.0: +form-data@^4.0.0, form-data@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== @@ -9337,6 +9524,15 @@ fs-extra@^9.0.0, fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@~11.3.0: + version "11.3.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" + integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@~7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -9438,11 +9634,12 @@ gaxios@^6.0.0, gaxios@^6.0.3, gaxios@^6.1.1, gaxios@^6.7.0: uuid "^9.0.1" gcp-metadata@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.1.0.tgz#9b0dd2b2445258e7597f2024332d20611cbd6b8c" - integrity sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg== + version "6.1.1" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.1.1.tgz#f65aa69f546bc56e116061d137d3f5f90bdec494" + integrity sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A== dependencies: - gaxios "^6.0.0" + gaxios "^6.1.1" + google-logging-utils "^0.0.2" json-bigint "^1.0.0" gensync@^1.0.0-beta.2: @@ -9450,13 +9647,13 @@ 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== +get-amd-module-type@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-amd-module-type/-/get-amd-module-type-6.0.1.tgz#191f479ae8706c246b52bf402fbe1bb0965d9f1e" + integrity sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ== dependencies: - ast-module-types "^6.0.0" - node-source-walk "^7.0.0" + ast-module-types "^6.0.1" + node-source-walk "^7.0.1" get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" @@ -9529,9 +9726,9 @@ get-symbol-description@^1.1.0: get-intrinsic "^1.2.6" get-tsconfig@^4.7.5: - version "4.8.1" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471" - integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== + version "4.10.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.0.tgz#403a682b373a823612475a4c2928c7326fc0f6bb" + integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A== dependencies: resolve-pkg-maps "^1.0.0" @@ -9704,10 +9901,10 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^15.13.0: - version "15.14.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-15.14.0.tgz#b8fd3a8941ff3b4d38f3319d433b61bbb482e73f" - integrity sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig== +globals@^15.14.0: + version "15.15.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8" + integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== globalthis@^1.0.1, globalthis@^1.0.4: version "1.0.4" @@ -9717,29 +9914,17 @@ globalthis@^1.0.1, globalthis@^1.0.4: define-properties "^1.2.1" gopd "^1.0.1" -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - globby@^14.0.0: - version "14.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-14.0.2.tgz#06554a54ccfe9264e5a9ff8eded46aa1e306482f" - integrity sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw== + version "14.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-14.1.0.tgz#138b78e77cf5a8d794e327b15dce80bf1fb0a73e" + integrity sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA== dependencies: "@sindresorhus/merge-streams" "^2.1.0" - fast-glob "^3.3.2" - ignore "^5.2.4" - path-type "^5.0.0" + fast-glob "^3.3.3" + ignore "^7.0.3" + path-type "^6.0.0" slash "^5.1.0" - unicorn-magic "^0.1.0" + unicorn-magic "^0.3.0" globby@^5.0.0: version "5.0.0" @@ -9768,9 +9953,9 @@ gonzales-pe@^4.3.0: minimist "^1.2.5" google-auth-library@^9.0.0, google-auth-library@^9.11.0, google-auth-library@^9.2.0, google-auth-library@^9.3.0, google-auth-library@^9.7.0: - version "9.15.0" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.15.0.tgz#1b009c08557929c881d72f953f17e839e91b009b" - integrity sha512-7ccSEJFDFO7exFbO6NRyC+xH8/mZ1GZGG2xxx9iHxZWcjUjJpjWxIMw3cofAKcueZ6DATiukmmprD7yavQHOyQ== + version "9.15.1" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.15.1.tgz#0c5d84ed1890b2375f1cd74f03ac7b806b392928" + integrity sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng== dependencies: base64-js "^1.3.0" ecdsa-sig-formatter "^1.0.11" @@ -9797,6 +9982,11 @@ google-gax@4.4.1, google-gax@^4.3.3: retry-request "^7.0.0" uuid "^9.0.1" +google-logging-utils@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/google-logging-utils/-/google-logging-utils-0.0.2.tgz#5fd837e06fa334da450433b9e3e1870c1594466a" + integrity sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ== + google-protobuf@^3.6.1: version "3.21.4" resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.4.tgz#2f933e8b6e5e9f8edde66b7be0024b68f77da6c9" @@ -9858,11 +10048,6 @@ grpc-gcp@^1.0.0: dependencies: "@grpc/grpc-js" "^1.7.0" -gsap@^3.12.3: - version "3.12.5" - resolved "https://registry.yarnpkg.com/gsap/-/gsap-3.12.5.tgz#136c02dad4c673b441bdb1ca00104bfcb4eae7f4" - integrity sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ== - gtoken@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-7.1.0.tgz#d61b4ebd10132222817f7222b1e6064bd463fc26" @@ -10222,9 +10407,9 @@ http-errors@~1.6.2: statuses ">= 1.4.0 < 2" http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + version "0.5.9" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.9.tgz#b817b3ca0edea6236225000d795378707c169cec" + integrity sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw== http-proxy-agent@^5.0.0: version "5.0.0" @@ -10311,7 +10496,7 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@7.0.6, https-proxy-agent@^2.2.1, https-proxy-agent@^4.0.0, https-proxy-agent@^5.0.0, https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.5, https-proxy-agent@^7.0.6: +https-proxy-agent@7.0.6, https-proxy-agent@^2.2.1, https-proxy-agent@^4.0.0, https-proxy-agent@^5.0.0, https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== @@ -10367,10 +10552,10 @@ ignore-walk@^7.0.0: dependencies: minimatch "^9.0.0" -ignore@^5.2.0, ignore@^5.2.4: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== +ignore@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.3.tgz#397ef9315dfe0595671eefe8b633fec6943ab733" + integrity sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA== image-size@~0.5.0: version "0.5.5" @@ -10393,9 +10578,9 @@ immutable@^5.0.2: integrity sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw== import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -10582,10 +10767,11 @@ is-arrayish@^0.3.1: integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-async-function@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.0.tgz#1d1080612c493608e93168fc4458c245074c06a6" - integrity sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== dependencies: + async-function "^1.0.0" call-bound "^1.0.3" get-proto "^1.0.1" has-tostringtag "^1.0.2" @@ -10613,11 +10799,11 @@ is-binary-path@~2.1.0: binary-extensions "^2.0.0" is-boolean-object@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.1.tgz#c20d0c654be05da4fbc23c562635c019e93daf89" - integrity sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng== + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== dependencies: - call-bound "^1.0.2" + call-bound "^1.0.3" has-tostringtag "^1.0.2" is-buffer@^1.1.5: @@ -10632,7 +10818,7 @@ is-builtin-module@^3.1.0: dependencies: builtin-modules "^3.3.0" -is-callable@^1.1.3, is-callable@^1.2.7: +is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -10644,7 +10830,7 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.13.0, is-core-module@^2.16.0: +is-core-module@^2.16.0: version "2.16.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== @@ -10906,7 +11092,7 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-promise@4.0.0: +is-promise@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== @@ -11024,11 +11210,11 @@ is-weakmap@^2.0.2: integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2, is-weakref@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.0.tgz#47e3472ae95a63fa9cf25660bcf0c181c39770ef" - integrity sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q== + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== dependencies: - call-bound "^1.0.2" + call-bound "^1.0.3" is-weakset@^2.0.3: version "2.0.4" @@ -11213,10 +11399,10 @@ jasmine-core@^4.1.0: resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-4.6.1.tgz#5ebb8afa07282078f8d7b15871737a83b74e58f2" integrity sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ== -jasmine-core@^5.0.0, jasmine-core@~5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-5.5.0.tgz#43564e4b41f73a37cff3aeb262e23bbd073576d8" - integrity sha512-NHOvoPO6o9gVR6pwqEACTEpbgcH+JJ6QDypyymGbSUIFIFsMMbBJ/xsFNud8MSClfnWclXd7RQlAZBz7yVo5TQ== +jasmine-core@^5.0.0, jasmine-core@~5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-5.6.0.tgz#4b979c254e7d9b1fe8e767ab00c5d2901c00bd4f" + integrity sha512-niVlkeYVRwKFpmfWg6suo6H9CrNnydfBLEqefM5UjibYS+UoTjZdmvPJSiuyrRLGnFj1eYRhFd/ch+5hSlsFVA== jasmine-core@~2.8.0: version "2.8.0" @@ -11240,13 +11426,13 @@ jasmine@2.8.0: glob "^7.0.6" jasmine-core "~2.8.0" -jasmine@~5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-5.5.0.tgz#dbcb7a59a3ce88d475cc6e9341db92b8a8bb7974" - integrity sha512-JKlEVCVD5QBPYLsg/VE+IUtjyseDCrW8rMBu8la+9ysYashDgavMLM9Kotls1FhI6dCJLJ40dBCIfQjGLPZI1Q== +jasmine@~5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-5.6.0.tgz#83be3acf8dd44ad365d15f01c13c019a5e9c01cc" + integrity sha512-6frlW22jhgRjtlp68QY/DDVCUfrYqmSxDBWM13mrBzYQGx1XITfVcJltnY15bk8B5cRfN5IpKvemkDiDTSRCsA== dependencies: glob "^10.2.2" - jasmine-core "~5.5.0" + jasmine-core "~5.6.0" jasminewd2@^2.1.0: version "2.2.0" @@ -11320,22 +11506,22 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsdom@^25.0.0: - version "25.0.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-25.0.1.tgz#536ec685c288fc8a5773a65f82d8b44badcc73ef" - integrity sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw== +jsdom@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-26.0.0.tgz#446dd1ad8cfc50df7e714e58f1f972c1763b354c" + integrity sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw== dependencies: - cssstyle "^4.1.0" + cssstyle "^4.2.1" data-urls "^5.0.0" decimal.js "^10.4.3" - form-data "^4.0.0" + form-data "^4.0.1" html-encoding-sniffer "^4.0.0" http-proxy-agent "^7.0.2" - https-proxy-agent "^7.0.5" + https-proxy-agent "^7.0.6" is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.12" - parse5 "^7.1.2" - rrweb-cssom "^0.7.1" + nwsapi "^2.2.16" + parse5 "^7.2.1" + rrweb-cssom "^0.8.0" saxes "^6.0.0" symbol-tree "^3.2.4" tough-cookie "^5.0.0" @@ -11343,7 +11529,7 @@ jsdom@^25.0.0: webidl-conversions "^7.0.0" whatwg-encoding "^3.1.1" whatwg-mimetype "^4.0.0" - whatwg-url "^14.0.0" + whatwg-url "^14.1.0" ws "^8.18.0" xml-name-validator "^5.0.0" @@ -11624,9 +11810,9 @@ karma@~6.4.0: yargs "^16.1.1" katex@^0.16.9: - version "0.16.19" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.19.tgz#698e026188876f9c8c93d3ecb27b212aaa056d0a" - integrity sha512-3IA6DYVhxhBabjSLTNO9S4+OliA3Qvb8pBQXMfC4WxXJgLwZgnfDl0BmB4z6nBMdznBsZ+CGM8DrGZ5hcguDZg== + version "0.16.21" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.21.tgz#8f63c659e931b210139691f2cc7bb35166b792a3" + integrity sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A== dependencies: commander "^8.3.0" @@ -11729,10 +11915,10 @@ less-loader@12.2.0: resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-12.2.0.tgz#e1e94522f6abe9e064ef396c29a3151bc6c1b6cc" integrity sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg== -less@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/less/-/less-4.2.1.tgz#fe4c9848525ab44614c0cf2c00abd8d031bb619a" - integrity sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg== +less@4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/less/-/less-4.2.2.tgz#4b59ede113933b58ab152190edf9180fc36846d8" + integrity sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg== dependencies: copy-anything "^2.0.1" parse-node-version "^1.0.1" @@ -11839,10 +12025,28 @@ live-server@^1.2.2: send latest serve-index "^1.9.1" -lmdb@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lmdb/-/lmdb-3.2.0.tgz#b951233e9e8fcf8d1671bec5103250887f3abd87" - integrity sha512-cDeZAM4mXOwN1IdH93a91qXppn4jXV4NHphg53bqQDRFjJnpYZTgGcjrqpsmm209DtXTvmKMcYJd+XrHybwFZg== +lmdb@3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/lmdb/-/lmdb-3.2.2.tgz#1b3c50a0184847c88e02f038a598d6a229a8765e" + integrity sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g== + dependencies: + msgpackr "^1.11.2" + node-addon-api "^6.1.0" + node-gyp-build-optional-packages "5.2.2" + ordered-binary "^1.5.3" + weak-lru-cache "^1.2.2" + optionalDependencies: + "@lmdb/lmdb-darwin-arm64" "3.2.2" + "@lmdb/lmdb-darwin-x64" "3.2.2" + "@lmdb/lmdb-linux-arm" "3.2.2" + "@lmdb/lmdb-linux-arm64" "3.2.2" + "@lmdb/lmdb-linux-x64" "3.2.2" + "@lmdb/lmdb-win32-x64" "3.2.2" + +lmdb@3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/lmdb/-/lmdb-3.2.6.tgz#dd18bae6323679f99bc3cb57df81dc507f50f505" + integrity sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ== dependencies: msgpackr "^1.11.2" node-addon-api "^6.1.0" @@ -11850,12 +12054,12 @@ lmdb@3.2.0: ordered-binary "^1.5.3" weak-lru-cache "^1.2.2" optionalDependencies: - "@lmdb/lmdb-darwin-arm64" "3.2.0" - "@lmdb/lmdb-darwin-x64" "3.2.0" - "@lmdb/lmdb-linux-arm" "3.2.0" - "@lmdb/lmdb-linux-arm64" "3.2.0" - "@lmdb/lmdb-linux-x64" "3.2.0" - "@lmdb/lmdb-win32-x64" "3.2.0" + "@lmdb/lmdb-darwin-arm64" "3.2.6" + "@lmdb/lmdb-darwin-x64" "3.2.6" + "@lmdb/lmdb-linux-arm" "3.2.6" + "@lmdb/lmdb-linux-arm64" "3.2.6" + "@lmdb/lmdb-linux-x64" "3.2.6" + "@lmdb/lmdb-win32-x64" "3.2.6" loader-runner@^4.2.0: version "4.3.0" @@ -11885,13 +12089,13 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -local-pkg@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.1.tgz#69658638d2a95287534d4c2fff757980100dbb6d" - integrity sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ== +local-pkg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-1.0.0.tgz#a8d14dd41e78884f199ecd8b3eedaf0d376e2167" + integrity sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg== dependencies: mlly "^1.7.3" - pkg-types "^1.2.1" + pkg-types "^1.3.0" locate-path@^5.0.0: version "5.0.0" @@ -12094,9 +12298,9 @@ long@^4.0.0: integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== long@^5.0.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" - integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + version "5.3.0" + resolved "https://registry.yarnpkg.com/long/-/long-5.3.0.tgz#3bab70330c40c2c1b5cb73c4254723c81f00e15c" + integrity sha512-5vvY5yF1zF/kXk+L94FRiTDa1Znom46UjPCH6/XbSvS8zBKMFBHTJk8KDMqJ+2J6QezQFi7k1k8v21ClJYHPaw== lower-case@^2.0.2: version "2.0.2" @@ -12115,7 +12319,7 @@ lru-cache@2.5.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.5.0.tgz#d82388ae9c960becbea0c73bb9eb79b6c6ce9aeb" integrity sha512-dVmQmXPBlTgFw77hm60ud//l2bCuDKkqC2on1EBoM7s9Urm9IQDrnujwZ93NFnAq0dVZ0HBXTS7PwEG+YE7+EQ== -lru-cache@^10.0.1, lru-cache@^10.2.0: +lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.4.3: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== @@ -12165,10 +12369,10 @@ madge@^8.0.0: ts-graphviz "^2.1.2" walkdir "^0.4.1" -magic-string@0.30.15: - version "0.30.15" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.15.tgz#d5474a2c4c5f35f041349edaba8a5cb02733ed3c" - integrity sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw== +magic-string@0.30.17, magic-string@^0.30.11, magic-string@^0.30.3, magic-string@^0.30.8: + version "0.30.17" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" @@ -12179,13 +12383,6 @@ magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" -magic-string@^0.30.11, magic-string@^0.30.3, magic-string@^0.30.8: - version "0.30.17" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" - integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -12231,7 +12428,7 @@ make-fetch-happen@^13.0.0: promise-retry "^2.0.1" ssri "^10.0.0" -make-fetch-happen@^14.0.0, make-fetch-happen@^14.0.1, make-fetch-happen@^14.0.3: +make-fetch-happen@^14.0.0, make-fetch-happen@^14.0.1, make-fetch-happen@^14.0.2, make-fetch-happen@^14.0.3: version "14.0.3" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz#d74c3ecb0028f08ab604011e0bc6baed483fcdcd" integrity sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ== @@ -12266,16 +12463,16 @@ map-visit@^1.0.0: object-visit "^1.0.0" marked-terminal@^7.0.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-7.2.1.tgz#9c1ae073a245a03c6a13e3eeac6f586f29856068" - integrity sha512-rQ1MoMFXZICWNsKMiiHwP/Z+92PLKskTPXj+e7uwXmuMPkNn7iTqC+IvDekVm1MPeC9wYQeLxeFaOvudRR/XbQ== + version "7.3.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-7.3.0.tgz#7a86236565f3dd530f465ffce9c3f8b62ef270e8" + integrity sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw== dependencies: ansi-escapes "^7.0.0" ansi-regex "^6.1.0" - chalk "^5.3.0" + chalk "^5.4.1" cli-highlight "^2.1.11" cli-table3 "^0.6.5" - node-emoji "^2.1.3" + node-emoji "^2.2.0" supports-hyperlinks "^3.1.0" marked@^13.0.2: @@ -12284,9 +12481,9 @@ marked@^13.0.2: integrity sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA== marked@^15.0.0: - version "15.0.6" - resolved "https://registry.yarnpkg.com/marked/-/marked-15.0.6.tgz#8165f16afb6f4b30a35bdcee657c3b8415820a8f" - integrity sha512-Y07CUOE+HQXbVDCGl3LXggqJDbXDP2pArc2C1N1RRMN0ONiShoSsIInMd5Gsxupe7fKLpgimTV+HOJ9r7bA+pg== + version "15.0.7" + resolved "https://registry.yarnpkg.com/marked/-/marked-15.0.7.tgz#f67d7e34d202ce087e6b879107b5efb04e743314" + integrity sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg== marky@^1.2.2: version "1.2.5" @@ -12326,9 +12523,9 @@ media-typer@0.3.0: integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^4.6.0: - version "4.15.3" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.15.3.tgz#c4f9a5027dc0ac0b006f8d5a63aee128c829a37d" - integrity sha512-vR/g1SgqvKJgAyYla+06G4p/EOcEmwhYuVb1yc1ixcKf8o/sh7Zngv63957ZSNd1xrZJoinmNyDf2LzuP8WJXw== + version "4.17.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.17.0.tgz#a3c4b5490b9b1e7df5d433adc163e08208ce7ca2" + integrity sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg== dependencies: "@jsonjoy.com/json-pack" "^1.0.3" "@jsonjoy.com/util" "^1.3.0" @@ -12363,7 +12560,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -12641,16 +12838,16 @@ minizlib@^3.0.1: minipass "^7.0.4" rimraf "^5.0.5" -mitt@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" - integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== - mitt@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== +mitt@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== + mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -12681,28 +12878,28 @@ mkdirp@^3.0.1: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== -mlly@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.3.tgz#d86c0fcd8ad8e16395eb764a5f4b831590cee48c" - integrity sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A== +mlly@^1.7.3, mlly@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.4.tgz#3d7295ea2358ec7a271eaa5d000a0f84febe100f" + integrity sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw== dependencies: acorn "^8.14.0" - pathe "^1.1.2" - pkg-types "^1.2.1" + pathe "^2.0.1" + pkg-types "^1.3.0" ufo "^1.5.4" -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== +module-definition@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/module-definition/-/module-definition-6.0.1.tgz#47e73144cc5a9aa31f3380166fddf8e962ccb2e4" + integrity sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g== dependencies: - ast-module-types "^6.0.0" - node-source-walk "^7.0.0" + ast-module-types "^6.0.1" + node-source-walk "^7.0.1" -module-lookup-amd@^9.0.1: - version "9.0.2" - resolved "https://registry.yarnpkg.com/module-lookup-amd/-/module-lookup-amd-9.0.2.tgz#e132b11356a3690ed46ab0164dde2c1ddcd3a8a5" - integrity sha512-p7PzSVEWiW9fHRX9oM+V4aV5B2nCVddVNv4DZ/JB6t9GsXY4E+ZVhPpnwUX7bbJyGeeVZqhS8q/JZ/H77IqPFA== +module-lookup-amd@^9.0.3: + version "9.0.4" + resolved "https://registry.yarnpkg.com/module-lookup-amd/-/module-lookup-amd-9.0.4.tgz#328aff0913a47b25f02dd03c40efc9640d60f38c" + integrity sha512-DWJEuLVvjxh5b8wrvJC5wr2a7qo7pOWXIgdCBNazU416kcIyzO4drxvlqKhsHzYwxcC4cWuhoK+MiWCKCGnv7A== dependencies: commander "^12.1.0" glob "^7.2.3" @@ -12808,7 +13005,7 @@ nan@^2.12.1, nan@^2.20.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== -nanoid@^3.3.7: +nanoid@^3.3.8: version "3.3.8" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== @@ -12887,11 +13084,6 @@ ngx-progressbar@^14.0.0: dependencies: tslib "^2.3.0" -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -12910,7 +13102,7 @@ node-addon-api@^7.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== -node-emoji@^2.1.3: +node-emoji@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.2.0.tgz#1d000e3c76e462577895be1b436f4aa2d6760eb0" integrity sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw== @@ -12956,9 +13148,9 @@ node-gyp@^10.2.0: which "^4.0.0" node-gyp@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-11.0.0.tgz#1e029056e8c040424ba380e1d5be54ad1757ae3c" - integrity sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw== + version "11.1.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-11.1.0.tgz#212a1d9c167c50d727d42659410780b40e07bbd3" + integrity sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ== dependencies: env-paths "^2.2.0" exponential-backoff "^3.1.1" @@ -12976,12 +13168,12 @@ node-releases@^2.0.19: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== -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== +node-source-walk@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-7.0.1.tgz#3e4ab8d065377228fd038af7b2d4fb58f61defd3" + integrity sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg== dependencies: - "@babel/parser" "^7.24.4" + "@babel/parser" "^7.26.7" nopt@^7.0.0: version "7.2.1" @@ -12991,11 +13183,11 @@ nopt@^7.0.0: abbrev "^2.0.0" nopt@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-8.0.0.tgz#644f1e78da564b70e3606ab8db4836b0e32e198a" - integrity sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw== + version "8.1.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-8.1.0.tgz#b11d38caf0f8643ce885818518064127f602eae3" + integrity sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A== dependencies: - abbrev "^2.0.0" + abbrev "^3.0.0" normalize-package-data@^6.0.0: version "6.0.2" @@ -13006,15 +13198,6 @@ normalize-package-data@^6.0.0: semver "^7.3.5" validate-npm-package-license "^3.0.4" -normalize-package-data@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-7.0.0.tgz#ab4f49d02f2e25108d3f4326f3c13f0de6fa6a0a" - integrity sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA== - dependencies: - hosted-git-info "^8.0.0" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - normalize-path@3.0.0, normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -13063,10 +13246,10 @@ npm-normalize-package-bin@^4.0.0: resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz#df79e70cd0a113b77c02d1fe243c96b8e618acb1" integrity sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w== -npm-package-arg@12.0.1, npm-package-arg@^12.0.0: - version "12.0.1" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-12.0.1.tgz#eb05e797b2fbdf8acf7f1d15344e1e05904202d5" - integrity sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ== +npm-package-arg@12.0.2, npm-package-arg@^12.0.0: + version "12.0.2" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-12.0.2.tgz#3b1e04ebe651cc45028e298664e8c15ce9c0ca40" + integrity sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA== dependencies: hosted-git-info "^8.0.0" proc-log "^5.0.0" @@ -13111,7 +13294,7 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -nwsapi@^2.2.12: +nwsapi@^2.2.16: version "2.2.16" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.16.tgz#177760bba02c351df1d2644e220c31dfec8cdb43" integrity sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ== @@ -13141,9 +13324,9 @@ object-hash@^3.0.0: integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== object-inspect@^1.13.3: - version "1.13.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" - integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== object-keys@^1.1.1: version "1.1.1" @@ -13191,11 +13374,6 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -ogl@^1.0.3: - version "1.0.9" - resolved "https://registry.yarnpkg.com/ogl/-/ogl-1.0.9.tgz#92798375651f2b4df63031a3c884bee4e85076e2" - integrity sha512-nvalTfOqyxXKcSCOwxrJ/hFX/UjAj6mH5sFL7V7LZCNhkBd6j+hTiBzEa8etX1WH2oUmnZKi0e/748D9Dag+SA== - on-finished@2.4.1, on-finished@^2.2.0, on-finished@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -13243,14 +13421,14 @@ onetime@^7.0.0: dependencies: mimic-function "^5.0.0" -oniguruma-to-es@0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-0.10.0.tgz#a696b95e6c523f5521d8ee7af5f4a54f1582febd" - integrity sha512-zapyOUOCJxt+xhiNRPPMtfJkHGsZ98HHB9qJEkdT8BGytO/+kpe4m1Ngf0MzbzTmhacn11w9yGeDP6tzDhnCdg== +oniguruma-to-es@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-3.1.0.tgz#6e74d9ef4e8e33a61ad28c1f564b7d0ce1d0b0d9" + integrity sha512-BJ3Jy22YlgejHSO7Fvmz1kKazlaPmRSUH+4adTDUS/dKQ4wLxI+gALZ8updbaux7/m7fIlpgOZ5fp/Inq5jUAw== dependencies: emoji-regex-xs "^1.0.0" - regex "^5.1.1" - regex-recursion "^5.1.1" + regex "^6.0.1" + regex-recursion "^6.0.2" open-in-idx@^0.1.1: version "0.1.1" @@ -13472,10 +13650,10 @@ package-json-from-dist@^1.0.0: resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== -package-manager-detector@^0.2.0: - version "0.2.8" - resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-0.2.8.tgz#f5ace2dbd37666af54e5acec11bc37c8450f72d0" - integrity sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA== +package-manager-detector@^0.2.8: + version "0.2.9" + resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-0.2.9.tgz#20990785afa69d38b4520ccc83b34e9f69cb970f" + integrity sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q== pacote@20.0.0: version "20.0.0" @@ -13596,14 +13774,14 @@ parse5@^6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parse5@^7.0.0, parse5@^7.1.2: +parse5@^7.0.0, parse5@^7.1.2, parse5@^7.2.1: version "7.2.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a" integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== dependencies: entities "^4.5.0" -parseurl@~1.3.2, parseurl@~1.3.3: +parseurl@^1.3.3, parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -13684,11 +13862,6 @@ path-is-inside@^1.0.1: resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -13724,7 +13897,7 @@ path-to-regexp@0.1.12: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== -path-to-regexp@^1.8.0: +path-to-regexp@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.9.0.tgz#5dc0753acbf8521ca2e0f137b4578b917b10cf24" integrity sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g== @@ -13736,20 +13909,15 @@ path-to-regexp@^8.0.0: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -path-type@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-5.0.0.tgz#14b01ed7aea7ddf9c7c3f46181d4d04f9c785bb8" - integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg== +path-type@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-6.0.0.tgz#2f1bb6791a91ce99194caede5d6c5920ed81eb51" + integrity sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ== -pathe@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" - integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== +pathe@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== pause-stream@0.0.11: version "0.0.11" @@ -13788,15 +13956,15 @@ pg-int8@1.0.1: resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-pool@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.7.0.tgz#d4d3c7ad640f8c6a2245adc369bafde4ebb8cbec" - integrity sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g== +pg-pool@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.7.1.tgz#d1aaf618618d8f878acf185e86084928b8cd5b3c" + integrity sha512-xIOsFoh7Vdhojas6q3596mXFsR8nwBQBXX5JiV7p9buEVAGqYL4yFzclON5P9vFrpu1u7Zwl2oriyDa89n0wbw== -pg-protocol@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.7.0.tgz#ec037c87c20515372692edac8b63cf4405448a93" - integrity sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ== +pg-protocol@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.7.1.tgz#aad61a6f927b51e89dcf721408b76c0e536d43dc" + integrity sha512-gjTHWGYWsEgy9MsY0Gp6ZJxV24IjDqdpTW7Eh0x+WfJLFsm/TJx1MzL6T0D88mBvkpxotCQ6TwW6N+Kko7lhgQ== pg-types@^2.1.0: version "2.2.0" @@ -13810,13 +13978,13 @@ pg-types@^2.1.0: postgres-interval "^1.1.0" pg@^8.11.3: - version "8.13.1" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.13.1.tgz#6498d8b0a87ff76c2df7a32160309d3168c0c080" - integrity sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ== + version "8.13.3" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.13.3.tgz#19cd021d1f9e9d26d860b80cd450f109a8652738" + integrity sha512-P6tPt9jXbL9HVu/SSRERNYaYG++MjnscnegFh9pPHihfoBSujsrka0hyuymMzeJKFWrcG8wvCKy8rCe8e5nDUQ== dependencies: pg-connection-string "^2.7.0" - pg-pool "^3.7.0" - pg-protocol "^1.7.0" + pg-pool "^3.7.1" + pg-protocol "^1.7.1" pg-types "^2.1.0" pgpass "1.x" optionalDependencies: @@ -13829,7 +13997,7 @@ pgpass@1.x: dependencies: split2 "^4.1.0" -picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0, picocolors@^1.1.1: +picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== @@ -13887,19 +14055,19 @@ pkg-dir@^7.0.0: dependencies: find-up "^6.3.0" -pkg-types@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.0.tgz#53d915eb99485798c554ad8eb2dc2af7c03006eb" - integrity sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg== +pkg-types@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" + integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== dependencies: confbox "^0.1.8" - mlly "^1.7.3" - pathe "^1.1.2" + mlly "^1.7.4" + pathe "^2.0.1" playwright-core@^1.41.2: - version "1.49.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.49.1.tgz#32c62f046e950f586ff9e35ed490a424f2248015" - integrity sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg== + version "1.50.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.50.1.tgz#6a0484f1f1c939168f40f0ab3828c4a1592c4504" + integrity sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ== plugin-error@^2.0.0: version "2.0.1" @@ -13949,9 +14117,9 @@ posix-character-classes@^0.1.0: integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== postcss-loader@8.1.1: version "8.1.1" @@ -13996,9 +14164,9 @@ postcss-modules-values@^4.0.0: icss-utils "^5.0.0" postcss-selector-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz#41bd8b56f177c093ca49435f65731befe25d6b9c" - integrity sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" + integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -14017,12 +14185,12 @@ postcss-values-parser@^6.0.2: is-url-superb "^4.0.0" quote-unquote "^1.0.0" -postcss@8.4.49, postcss@^8.2.14, postcss@^8.4.33, postcss@^8.4.40, postcss@^8.4.48, postcss@^8.4.49: - version "8.4.49" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" - integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== +postcss@8.5.2, postcss@^8.2.14, postcss@^8.4.33, postcss@^8.4.48, postcss@^8.4.49, postcss@^8.5.1: + version "8.5.2" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.2.tgz#e7b99cb9d2ec3e8dd424002e7c16517cb2b846bd" + integrity sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA== dependencies: - nanoid "^3.3.7" + nanoid "^3.3.8" picocolors "^1.1.1" source-map-js "^1.2.1" @@ -14049,41 +14217,46 @@ postgres-interval@^1.1.0: xtend "^4.0.0" preact-render-to-string@^6.2.1: - version "6.5.12" - resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-6.5.12.tgz#57578b652d50294ae8084650e144e83a2bdb2217" - integrity sha512-FpU7/cRipZo4diSWQq7gZWVp+Px76CtVduJZNvQwVzynDsAIxKteMrjCCGPbM2oEasReoDffaeMCMlaur9ohIg== + version "6.5.13" + resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-6.5.13.tgz#cb9eb4a0df3576e7bfd78ef5f3d3bd57480e79ee" + integrity sha512-iGPd+hKPMFKsfpR2vL4kJ6ZPcFIoWZEcBf0Dpm3zOpdVvj77aY8RlLiQji5OMrngEyaxGogeakTb54uS2FvA6w== preact@^10.17.1: version "10.25.4" resolved "https://registry.yarnpkg.com/preact/-/preact-10.25.4.tgz#c1d00bee9d7b9dcd06a2311d9951973b506ae8ac" integrity sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA== -precinct@^12.0.2: - version "12.1.2" - resolved "https://registry.yarnpkg.com/precinct/-/precinct-12.1.2.tgz#e6982e5fc90a0f1b6696f3a96acbd91cd6b3c841" - integrity sha512-x2qVN3oSOp3D05ihCd8XdkIPuEQsyte7PSxzLqiRgktu79S5Dr1I75/S+zAup8/0cwjoiJTQztE9h0/sWp9bJQ== +precinct@^12.2.0: + version "12.2.0" + resolved "https://registry.yarnpkg.com/precinct/-/precinct-12.2.0.tgz#6ab18f48034cc534f2c8fedb318f19a11bcd171b" + integrity sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w== dependencies: - "@dependents/detective-less" "^5.0.0" + "@dependents/detective-less" "^5.0.1" commander "^12.1.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.3" - module-definition "^6.0.0" - node-source-walk "^7.0.0" - postcss "^8.4.40" - typescript "^5.5.4" - -prettier@3.4.2, prettier@^3.0.0: + detective-amd "^6.0.1" + detective-cjs "^6.0.1" + detective-es6 "^5.0.1" + detective-postcss "^7.0.1" + detective-sass "^6.0.1" + detective-scss "^5.0.1" + detective-stylus "^5.0.1" + detective-typescript "^14.0.0" + detective-vue2 "^2.2.0" + module-definition "^6.0.1" + node-source-walk "^7.0.1" + postcss "^8.5.1" + typescript "^5.7.3" + +prettier@3.4.2: version "3.4.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== +prettier@^3.0.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.1.tgz#22fac9d0b18c0b92055ac8fb619ac1c7bef02fb7" + integrity sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw== + pretty-ms@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" @@ -14278,7 +14451,7 @@ pumpify@^1.3.5: inherits "^2.0.3" pump "^2.0.0" -punycode@^1.3.2, punycode@^1.4.1: +punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== @@ -14295,15 +14468,15 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" -puppeteer-core@23.11.1: - version "23.11.1" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-23.11.1.tgz#3e064de11b3cb3a2df1a8060ff2d05b41be583db" - integrity sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg== +puppeteer-core@24.2.1: + version "24.2.1" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-24.2.1.tgz#a7a3a82902452094d746e483404767f0e16fed98" + integrity sha512-bCypUh3WXzETafv1TCFAjIUnI8BiQ/d+XvEfEXDLcIMm9CAvROqnBmbt79yBjwasoDZsgfXnUmIJU7Y27AalVQ== dependencies: - "@puppeteer/browsers" "2.6.1" - chromium-bidi "0.11.0" + "@puppeteer/browsers" "2.7.1" + chromium-bidi "1.3.0" debug "^4.4.0" - devtools-protocol "0.0.1367902" + devtools-protocol "0.0.1402036" typed-query-selector "^2.12.0" ws "^8.18.0" @@ -14326,15 +14499,15 @@ puppeteer-core@^5.1.0: ws "^7.2.3" puppeteer@*: - version "23.11.1" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-23.11.1.tgz#98fd9040786b1219b1a4f639c270377586e8899c" - integrity sha512-53uIX3KR5en8l7Vd8n5DUv90Ae9QDQsyIthaUFVzwV6yU750RjqRznEtNMBT20VthqAdemnJN+hxVdmMHKt7Zw== + version "24.2.1" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-24.2.1.tgz#e2e0370d84b788a12dcfc1cff6a970ce37ecc2e8" + integrity sha512-Euno62ou0cd0dTkOYTNioSOsFF4VpSnz4ldD38hi9ov9xCNtr8DbhmoJRUx+V9OuPgecueZbKOohRrnrhkbg3Q== dependencies: - "@puppeteer/browsers" "2.6.1" - chromium-bidi "0.11.0" + "@puppeteer/browsers" "2.7.1" + chromium-bidi "1.3.0" cosmiconfig "^9.0.0" - devtools-protocol "0.0.1367902" - puppeteer-core "23.11.1" + devtools-protocol "0.0.1402036" + puppeteer-core "24.2.1" typed-query-selector "^2.12.0" q@1.4.1: @@ -14360,11 +14533,11 @@ qs@6.13.0: side-channel "^1.0.6" qs@^6.4.0, qs@^6.6.0, qs@^6.7.0: - version "6.13.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.1.tgz#3ce5fc72bd3a8171b85c99b93c65dd20b7d1b16e" - integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg== + version "6.14.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== dependencies: - side-channel "^1.0.6" + side-channel "^1.1.0" qs@~6.5.2: version "6.5.3" @@ -14386,11 +14559,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -queue-tick@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" - integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== - quick-lru@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" @@ -14498,9 +14666,9 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable util-deprecate "~1.0.1" readable-stream@^4.0.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.6.0.tgz#ce412dfb19c04efde1c5936d99c27f37a1ff94c9" - integrity sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw== + version "4.7.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.7.0.tgz#cedbd8a1146c13dfff8dab14068028d58c15ac91" + integrity sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg== dependencies: abort-controller "^3.0.0" buffer "^6.0.3" @@ -14525,9 +14693,9 @@ readdirp@^2.2.1: readable-stream "^2.0.2" readdirp@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" - integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== readdirp@~3.6.0: version "3.6.0" @@ -14607,16 +14775,15 @@ regex-not@^1.0.0, regex-not@^1.0.2: safe-regex "^1.1.0" regex-parser@^2.2.11: - version "2.3.0" - resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.0.tgz#4bb61461b1a19b8b913f3960364bb57887f920ee" - integrity sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg== + version "2.3.1" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.1.tgz#ee3f70e50bdd81a221d505242cb9a9c275a2ad91" + integrity sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ== -regex-recursion@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/regex-recursion/-/regex-recursion-5.1.1.tgz#5a73772d18adbf00f57ad097bf54171b39d78f8b" - integrity sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w== +regex-recursion@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/regex-recursion/-/regex-recursion-6.0.2.tgz#a0b1977a74c87f073377b938dbedfab2ea582b33" + integrity sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg== dependencies: - regex "^5.1.1" regex-utilities "^2.3.0" regex-utilities@^2.3.0: @@ -14624,10 +14791,10 @@ regex-utilities@^2.3.0: resolved "https://registry.yarnpkg.com/regex-utilities/-/regex-utilities-2.3.0.tgz#87163512a15dce2908cf079c8960d5158ff43280" integrity sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng== -regex@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/regex/-/regex-5.1.1.tgz#cf798903f24d6fe6e531050a36686e082b29bd03" - integrity sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw== +regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/regex/-/regex-6.0.1.tgz#282fa4435d0c700b09c0eb0982b602e05ab6a34f" + integrity sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA== dependencies: regex-utilities "^2.3.0" @@ -14656,9 +14823,9 @@ regexpu-core@^6.2.0: unicode-match-property-value-ecmascript "^2.1.0" registry-auth-token@^5.0.1: - version "5.0.3" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.3.tgz#417d758c8164569de8cf5cabff16cc937902dcc6" - integrity sha512-1bpc9IyC+e+CNFRaWyn77tk4xGG4PPUyfakSmA6F6cvUDjrm58dfyJ3II+9yb10EDkHoy1LaPSmHaWLOH3m6HA== + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.1.0.tgz#3c659047ecd4caebd25bc1570a3aa979ae490eca" + integrity sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw== dependencies: "@pnpm/npm-conf" "^2.1.0" @@ -14770,10 +14937,10 @@ resolve-alpn@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== -resolve-dependency-path@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-dependency-path/-/resolve-dependency-path-4.0.0.tgz#ec0b2aa83ce8cd125c7db734a40b4809959bf688" - integrity sha512-hlY1SybBGm5aYN3PC4rp15MzsJLM1w+MEA/4KU3UBPfz4S0lL3FL6mgv7JgaA8a+ZTeEQAiF1a1BuN2nkqiIlg== +resolve-dependency-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/resolve-dependency-path/-/resolve-dependency-path-4.0.1.tgz#1b9d43e5b62384301e26d040b9fce61ee5db60bd" + integrity sha512-YQftIIC4vzO9UMhO/sCgXukNyiwVRCVaxiWskCBy7Zpqkplm8kTAISZ8O1MoKW1ca6xzgLUBjZTcDgypXvXxiQ== resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" @@ -14816,16 +14983,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== -resolve@1.22.8: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.8, resolve@^1.3.2, resolve@~1.22.1, resolve@~1.22.2: +resolve@1.22.10, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.10, resolve@^1.3.2, resolve@~1.22.1, resolve@~1.22.2: version "1.22.10" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== @@ -14984,60 +15142,88 @@ rollup-plugin-terser@^7.0.1: serialize-javascript "^4.0.0" terser "^5.0.0" -rollup@4.28.1: - version "4.28.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.28.1.tgz#7718ba34d62b449dfc49adbfd2f312b4fe0df4de" - integrity sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg== +rollup@4.30.1: + version "4.30.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.30.1.tgz#d5c3d066055259366cdc3eb6f1d051c5d6afaf74" + integrity sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w== + dependencies: + "@types/estree" "1.0.6" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.30.1" + "@rollup/rollup-android-arm64" "4.30.1" + "@rollup/rollup-darwin-arm64" "4.30.1" + "@rollup/rollup-darwin-x64" "4.30.1" + "@rollup/rollup-freebsd-arm64" "4.30.1" + "@rollup/rollup-freebsd-x64" "4.30.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.30.1" + "@rollup/rollup-linux-arm-musleabihf" "4.30.1" + "@rollup/rollup-linux-arm64-gnu" "4.30.1" + "@rollup/rollup-linux-arm64-musl" "4.30.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.30.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.30.1" + "@rollup/rollup-linux-riscv64-gnu" "4.30.1" + "@rollup/rollup-linux-s390x-gnu" "4.30.1" + "@rollup/rollup-linux-x64-gnu" "4.30.1" + "@rollup/rollup-linux-x64-musl" "4.30.1" + "@rollup/rollup-win32-arm64-msvc" "4.30.1" + "@rollup/rollup-win32-ia32-msvc" "4.30.1" + "@rollup/rollup-win32-x64-msvc" "4.30.1" + fsevents "~2.3.2" + +rollup@4.34.6: + version "4.34.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.34.6.tgz#a07e4d2621759e29034d909655e7a32eee9195c9" + integrity sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ== dependencies: "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.28.1" - "@rollup/rollup-android-arm64" "4.28.1" - "@rollup/rollup-darwin-arm64" "4.28.1" - "@rollup/rollup-darwin-x64" "4.28.1" - "@rollup/rollup-freebsd-arm64" "4.28.1" - "@rollup/rollup-freebsd-x64" "4.28.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.28.1" - "@rollup/rollup-linux-arm-musleabihf" "4.28.1" - "@rollup/rollup-linux-arm64-gnu" "4.28.1" - "@rollup/rollup-linux-arm64-musl" "4.28.1" - "@rollup/rollup-linux-loongarch64-gnu" "4.28.1" - "@rollup/rollup-linux-powerpc64le-gnu" "4.28.1" - "@rollup/rollup-linux-riscv64-gnu" "4.28.1" - "@rollup/rollup-linux-s390x-gnu" "4.28.1" - "@rollup/rollup-linux-x64-gnu" "4.28.1" - "@rollup/rollup-linux-x64-musl" "4.28.1" - "@rollup/rollup-win32-arm64-msvc" "4.28.1" - "@rollup/rollup-win32-ia32-msvc" "4.28.1" - "@rollup/rollup-win32-x64-msvc" "4.28.1" + "@rollup/rollup-android-arm-eabi" "4.34.6" + "@rollup/rollup-android-arm64" "4.34.6" + "@rollup/rollup-darwin-arm64" "4.34.6" + "@rollup/rollup-darwin-x64" "4.34.6" + "@rollup/rollup-freebsd-arm64" "4.34.6" + "@rollup/rollup-freebsd-x64" "4.34.6" + "@rollup/rollup-linux-arm-gnueabihf" "4.34.6" + "@rollup/rollup-linux-arm-musleabihf" "4.34.6" + "@rollup/rollup-linux-arm64-gnu" "4.34.6" + "@rollup/rollup-linux-arm64-musl" "4.34.6" + "@rollup/rollup-linux-loongarch64-gnu" "4.34.6" + "@rollup/rollup-linux-powerpc64le-gnu" "4.34.6" + "@rollup/rollup-linux-riscv64-gnu" "4.34.6" + "@rollup/rollup-linux-s390x-gnu" "4.34.6" + "@rollup/rollup-linux-x64-gnu" "4.34.6" + "@rollup/rollup-linux-x64-musl" "4.34.6" + "@rollup/rollup-win32-arm64-msvc" "4.34.6" + "@rollup/rollup-win32-ia32-msvc" "4.34.6" + "@rollup/rollup-win32-x64-msvc" "4.34.6" fsevents "~2.3.2" -rollup@^4.23.0: - version "4.30.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.30.0.tgz#44ae4260029a8362113ef2a0cee7e02f3f740274" - integrity sha512-sDnr1pcjTgUT69qBksNF1N1anwfbyYG6TBQ22b03bII8EdiUQ7J0TlozVaTMjT/eEJAO49e1ndV7t+UZfL1+vA== +rollup@^4.23.0, rollup@^4.30.1: + version "4.34.7" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.34.7.tgz#e00d8550688a616a3481c6446bb688d4c753ba8f" + integrity sha512-8qhyN0oZ4x0H6wmBgfKxJtxM7qS98YJ0k0kNh5ECVtuchIJ7z9IVVvzpmtQyT10PXKMtBxYr1wQ5Apg8RS8kXQ== dependencies: "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.30.0" - "@rollup/rollup-android-arm64" "4.30.0" - "@rollup/rollup-darwin-arm64" "4.30.0" - "@rollup/rollup-darwin-x64" "4.30.0" - "@rollup/rollup-freebsd-arm64" "4.30.0" - "@rollup/rollup-freebsd-x64" "4.30.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.30.0" - "@rollup/rollup-linux-arm-musleabihf" "4.30.0" - "@rollup/rollup-linux-arm64-gnu" "4.30.0" - "@rollup/rollup-linux-arm64-musl" "4.30.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.30.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.30.0" - "@rollup/rollup-linux-riscv64-gnu" "4.30.0" - "@rollup/rollup-linux-s390x-gnu" "4.30.0" - "@rollup/rollup-linux-x64-gnu" "4.30.0" - "@rollup/rollup-linux-x64-musl" "4.30.0" - "@rollup/rollup-win32-arm64-msvc" "4.30.0" - "@rollup/rollup-win32-ia32-msvc" "4.30.0" - "@rollup/rollup-win32-x64-msvc" "4.30.0" + "@rollup/rollup-android-arm-eabi" "4.34.7" + "@rollup/rollup-android-arm64" "4.34.7" + "@rollup/rollup-darwin-arm64" "4.34.7" + "@rollup/rollup-darwin-x64" "4.34.7" + "@rollup/rollup-freebsd-arm64" "4.34.7" + "@rollup/rollup-freebsd-x64" "4.34.7" + "@rollup/rollup-linux-arm-gnueabihf" "4.34.7" + "@rollup/rollup-linux-arm-musleabihf" "4.34.7" + "@rollup/rollup-linux-arm64-gnu" "4.34.7" + "@rollup/rollup-linux-arm64-musl" "4.34.7" + "@rollup/rollup-linux-loongarch64-gnu" "4.34.7" + "@rollup/rollup-linux-powerpc64le-gnu" "4.34.7" + "@rollup/rollup-linux-riscv64-gnu" "4.34.7" + "@rollup/rollup-linux-s390x-gnu" "4.34.7" + "@rollup/rollup-linux-x64-gnu" "4.34.7" + "@rollup/rollup-linux-x64-musl" "4.34.7" + "@rollup/rollup-win32-arm64-msvc" "4.34.7" + "@rollup/rollup-win32-ia32-msvc" "4.34.7" + "@rollup/rollup-win32-x64-msvc" "4.34.7" fsevents "~2.3.2" rollup@~1.11.3: @@ -15067,22 +15253,18 @@ roughjs@^4.6.6: points-on-path "^0.2.1" router@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/router/-/router-2.0.0.tgz#8692720b95de83876870d7bc638dd3c7e1ae8a27" - integrity sha512-dIM5zVoG8xhC6rnSN8uoAgFARwTE7BQs8YwHEvK0VCmfxQXMaOuA1uiR1IPwsW7JyK5iTt7Od/TC9StasS2NPQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/router/-/router-2.1.0.tgz#f256ca2365afb4d386ba4f7a9ee0aa0827c962fa" + integrity sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA== dependencies: - array-flatten "3.0.0" - is-promise "4.0.0" - methods "~1.1.2" - parseurl "~1.3.3" + is-promise "^4.0.0" + parseurl "^1.3.3" path-to-regexp "^8.0.0" - setprototypeof "1.2.0" - utils-merge "1.0.1" -rrweb-cssom@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz#c73451a484b86dd7cfb1e0b2898df4b703183e4b" - integrity sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg== +rrweb-cssom@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz#3021d1b4352fbf3b614aaeed0bc0d5739abe0bc2" + integrity sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw== run-applescript@^7.0.0: version "7.0.0" @@ -15180,17 +15362,18 @@ sass-loader@16.0.4: dependencies: neo-async "^2.6.2" -sass-lookup@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/sass-lookup/-/sass-lookup-6.0.1.tgz#6f80a06d86b1d9590c49df425f542fdbb9f119cb" - integrity sha512-nl9Wxbj9RjEJA5SSV0hSDoU2zYGtE+ANaDS4OFUR7nYrquvBFvPKZZtQHe3lvnxCcylEDV00KUijjdMTUElcVQ== +sass-lookup@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/sass-lookup/-/sass-lookup-6.1.0.tgz#a13b1f31dd44d2b4bcd55ba8f72763db4d95bd7c" + integrity sha512-Zx+lVyoWqXZxHuYWlTA17Z5sczJ6braNT2C7rmClw+c4E7r/n911Zwss3h1uHI9reR5AgHZyNHF7c2+VIp5AUA== dependencies: - commander "^12.0.0" + commander "^12.1.0" + enhanced-resolve "^5.18.0" -sass@1.82.0: - version "1.82.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.82.0.tgz#30da277af3d0fa6042e9ceabd0d984ed6d07df70" - integrity sha512-j4GMCTa8elGyN9A7x7bEglx0VgSpNUG4W4wNedQ33wSMdnkqQCT8HTwOaVSV4e6yQovcu/3Oc4coJP/l0xhL2Q== +sass@1.83.1: + version "1.83.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.1.tgz#dee1ab94b47a6f9993d3195d36f556bcbda64846" + integrity sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA== dependencies: chokidar "^4.0.0" immutable "^5.0.2" @@ -15198,10 +15381,10 @@ sass@1.82.0: optionalDependencies: "@parcel/watcher" "^2.4.1" -sass@1.83.0: - version "1.83.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.0.tgz#e36842c0b88a94ed336fd16249b878a0541d536f" - integrity sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw== +sass@1.84.0: + version "1.84.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.84.0.tgz#da9154cbccb2d2eac7a9486091b6d9ba93ef5bad" + integrity sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg== dependencies: chokidar "^4.0.0" immutable "^5.0.2" @@ -15209,10 +15392,10 @@ sass@1.83.0: optionalDependencies: "@parcel/watcher" "^2.4.1" -saucelabs@8.0.0, saucelabs@^1.5.0, saucelabs@^4.6.3: - version "8.0.0" - resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-8.0.0.tgz#63084768ce5950107db988797e4db8d52297d725" - integrity sha512-Rj9m4OCniYk+c4MFuZGqvz64RPX6oRzMqt0bTr9T27IXGnA7Ic7Ms/VHgPtRcJFP6H3sQ169WOzazPZcW4BIAg== +saucelabs@9.0.2, saucelabs@^1.5.0, saucelabs@^4.6.3: + version "9.0.2" + resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-9.0.2.tgz#99f6170f3d789fcb0be2f270f7d37a9d7cdf5187" + integrity sha512-37QGEOgp9BP1re6S06qpNcBZ0Hw+ZSkZkDepbXHT9VjYoRQwRzUoLtKqE4yyVeK7dzcQXQapmTGF1kp1jO2VDw== dependencies: change-case "^4.1.2" compressing "^1.10.0" @@ -15264,10 +15447,10 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== -"selenium-webdriver4@npm:selenium-webdriver@4.27.0": - version "4.27.0" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.27.0.tgz#f0f26ce453805e7dc77151040442c67e441dbe7a" - integrity sha512-LkTJrNz5socxpPnWPODQ2bQ65eYx9JK+DQMYNihpTjMCqHwgWGYQnQTCAAche2W3ZP87alA+1zYPvgS8tHNzMQ== +"selenium-webdriver4@npm:selenium-webdriver@4.29.0": + version "4.29.0" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.29.0.tgz#32d32fb60df488bbc399b9dd58728a5cd570210e" + integrity sha512-8XPGtDoji5xk7ZUCzFT1rqHmCp67DCzESsttId7DzmrJmlTRmRLF6X918rbwclcH89amcBNM4zB3lVPj404I0g== dependencies: "@bazel/runfiles" "^6.3.1" jszip "^3.10.1" @@ -15295,9 +15478,9 @@ selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: xml2js "^0.4.17" selenium-webdriver@^4.18.1: - version "4.27.0" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.27.0.tgz#f0f26ce453805e7dc77151040442c67e441dbe7a" - integrity sha512-LkTJrNz5socxpPnWPODQ2bQ65eYx9JK+DQMYNihpTjMCqHwgWGYQnQTCAAche2W3ZP87alA+1zYPvgS8tHNzMQ== + version "4.28.1" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.28.1.tgz#0f6cc4fbc83cee3fdf8b116257656892957b72da" + integrity sha512-TwbTpu/NUQkorBODGAkGowJ8sar63bvqi66/tjqhS05rBl34HkVp8DoRg1cOv2iSnNonVSbkxazS3wjbc+NRtg== dependencies: "@bazel/runfiles" "^6.3.1" jszip "^3.10.1" @@ -15343,12 +15526,17 @@ semver@5.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== -semver@7.6.3, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: +semver@7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: +semver@7.7.1, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.7.0: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + +semver@^5.3.0, semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -15562,13 +15750,6 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -15576,11 +15757,6 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" @@ -15600,18 +15776,18 @@ shelljs@^0.8.5: interpret "^1.0.0" rechoir "^0.6.2" -shiki@^1.11.1: - version "1.26.1" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.26.1.tgz#eedb5f192a4d980a3e8bdd850ee390eef05cc386" - integrity sha512-Gqg6DSTk3wYqaZ5OaYtzjcdxcBvX5kCy24yvRJEgjT5U+WHlmqCThLuBUx0juyxQBi+6ug53IGeuQS07DWwpcw== - dependencies: - "@shikijs/core" "1.26.1" - "@shikijs/engine-javascript" "1.26.1" - "@shikijs/engine-oniguruma" "1.26.1" - "@shikijs/langs" "1.26.1" - "@shikijs/themes" "1.26.1" - "@shikijs/types" "1.26.1" - "@shikijs/vscode-textmate" "^10.0.1" +shiki@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-3.0.0.tgz#3f9007a475da0aa92820c4f32ec59a7b8f0673a9" + integrity sha512-x6MMdYN9auPGx7kMFtyKbaj65eCdetfrfkvQZwqisZLnGMnAZsZxOpcWD0ElvLPFWHOSMukVyN9Opm7TxQjnZA== + dependencies: + "@shikijs/core" "3.0.0" + "@shikijs/engine-javascript" "3.0.0" + "@shikijs/engine-oniguruma" "3.0.0" + "@shikijs/langs" "3.0.0" + "@shikijs/themes" "3.0.0" + "@shikijs/types" "3.0.0" + "@shikijs/vscode-textmate" "^10.0.2" "@types/hast" "^3.0.4" side-channel-list@^1.0.0: @@ -15665,16 +15841,16 @@ signal-exit@^4.0.1, signal-exit@^4.1.0: integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sigstore@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-3.0.0.tgz#d6eadcc6590185a7f1c16184078ce8a9ef6db937" - integrity sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-3.1.0.tgz#08dc6c0c425263e9fdab85ffdb6477550e2c511d" + integrity sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q== dependencies: - "@sigstore/bundle" "^3.0.0" + "@sigstore/bundle" "^3.1.0" "@sigstore/core" "^2.0.0" - "@sigstore/protobuf-specs" "^0.3.2" - "@sigstore/sign" "^3.0.0" - "@sigstore/tuf" "^3.0.0" - "@sigstore/verify" "^2.0.0" + "@sigstore/protobuf-specs" "^0.4.0" + "@sigstore/sign" "^3.1.0" + "@sigstore/tuf" "^3.1.0" + "@sigstore/verify" "^2.1.0" simple-swizzle@^0.2.2: version "0.2.2" @@ -15695,11 +15871,6 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - slash@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" @@ -15822,9 +15993,9 @@ socks-proxy-agent@^8.0.3, socks-proxy-agent@^8.0.5: socks "^2.8.3" socks@^2.8.3: - version "2.8.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" - integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== + version "2.8.4" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.4.tgz#07109755cdd4da03269bda4725baa061ab56d5cc" + integrity sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ== dependencies: ip-address "^9.0.5" smart-buffer "^4.2.0" @@ -15958,9 +16129,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.20" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" - integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== + version "3.0.21" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz#6d6e980c9df2b6fc905343a3b2d702a6239536c3" + integrity sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg== spdy-transport@^3.0.0: version "3.0.0" @@ -16035,9 +16206,9 @@ sprintf-js@~1.0.2: integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sql-formatter@^15.3.0: - version "15.4.9" - resolved "https://registry.yarnpkg.com/sql-formatter/-/sql-formatter-15.4.9.tgz#75722b497d39fd05d6d17d5e03c5f44658126c25" - integrity sha512-5vmt2HlCAVozxsBZuXWkAki/KGawaK+b5GG5x+BtXOFVpN/8cqppblFUxHl4jxdA0cvo14lABhM+KBnrUapOlw== + version "15.4.10" + resolved "https://registry.yarnpkg.com/sql-formatter/-/sql-formatter-15.4.10.tgz#f7f4745aa1b9fc3c8ce493bf882610ca6200dedf" + integrity sha512-zQfiuxU1F/C7TNu+880BdL+fuvJTd1Kj8R0wv48dfZ27NR3z1PWvQFkH8ai/HrIy+NyvXCaZBkJHp/EeZFXSOA== dependencies: argparse "^2.0.1" get-stdin "=8.0.0" @@ -16173,12 +16344,11 @@ streamroller@^3.1.5: fs-extra "^8.1.0" streamx@^2.12.0, streamx@^2.12.5, streamx@^2.13.2, streamx@^2.14.0, streamx@^2.15.0, streamx@^2.21.0: - version "2.21.1" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.21.1.tgz#f02979d8395b6b637d08a589fb514498bed55845" - integrity sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw== + version "2.22.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.22.0.tgz#cd7b5e57c95aaef0ff9b2aef7905afa62ec6e4a7" + integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw== dependencies: fast-fifo "^1.3.2" - queue-tick "^1.0.1" text-decoder "^1.1.0" optionalDependencies: bare-events "^2.2.0" @@ -16346,28 +16516,27 @@ style-mod@^4.0.0, style-mod@^4.1.0: integrity sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw== stylis@^4.3.1: - version "4.3.4" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.4.tgz#ca5c6c4a35c4784e4e93a2a24dc4e9fa075250a4" - integrity sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now== + version "4.3.6" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.6.tgz#7c7b97191cb4f195f03ecab7d52f7902ed378320" + integrity sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ== -stylus-lookup@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/stylus-lookup/-/stylus-lookup-6.0.0.tgz#a15ea3abc399a0b72127e95422b2e7bb4fee86bb" - integrity sha512-RaWKxAvPnIXrdby+UWCr1WRfa+lrPMSJPySte4Q6a+rWyjeJyFOLJxr5GrAVfcMCsfVlCuzTAJ/ysYT8p8do7Q== +stylus-lookup@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/stylus-lookup/-/stylus-lookup-6.1.0.tgz#f0fe88a885b830dc7520f51dd0a7e59e5d3307b4" + integrity sha512-5QSwgxAzXPMN+yugy61C60PhoANdItfdjSEZR8siFwz7yL9jTmV0UBKDCfn3K8GkGB4g0Y9py7vTCX8rFu4/pQ== dependencies: - commander "^12.0.0" + commander "^12.1.0" -superstatic@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/superstatic/-/superstatic-9.1.0.tgz#ef046c3bd4e8756e004168428a0c72f420491aba" - integrity sha512-1PcxGREb5My6iX/DL9x+3+XFY5lM2nOiPBQV45RwbpM5bHGsStz+Lduts7y8W+xo68pHa7F8atTF52+dwfwxcw== +superstatic@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/superstatic/-/superstatic-9.2.0.tgz#c3d338e87fb1b695670c79db5affb18288441c32" + integrity sha512-QrJAJIpAij0jJT1nEwYTB0SzDi4k0wYygu6GxK0ko8twiQgfgaOAZ7Hu99p02MTAsGho753zhzSvsw8We4PBEQ== dependencies: - basic-auth-connect "^1.0.0" + basic-auth-connect "^1.1.0" commander "^10.0.0" compression "^1.7.0" connect "^3.7.0" destroy "^1.0.4" - fast-url-parser "^1.1.3" glob-slasher "^1.0.1" is-url "^1.2.2" join-path "^1.1.1" @@ -16377,16 +16546,16 @@ superstatic@^9.1.0: morgan "^1.8.2" on-finished "^2.2.0" on-headers "^1.0.0" - path-to-regexp "^1.8.0" + path-to-regexp "^1.9.0" router "^2.0.0" update-notifier-cjs "^5.1.6" optionalDependencies: re2 "^1.17.7" -supports-color@9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" - integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== +supports-color@*, supports-color@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-10.0.0.tgz#32000d5e49f1ae70b2645d47701004644a1d7b90" + integrity sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ== supports-color@^2.0.0: version "2.0.0" @@ -16415,9 +16584,9 @@ supports-color@^8.0.0, supports-color@~8.1.1: has-flag "^4.0.0" supports-hyperlinks@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz#b56150ff0173baacc15f21956450b61f2b18d3ac" - integrity sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A== + version "3.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz#b8e485b179681dea496a1e7abdf8985bd3145461" + integrity sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig== dependencies: has-flag "^4.0.0" supports-color "^7.0.0" @@ -16458,25 +16627,25 @@ tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar-fs@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + version "2.1.2" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" + integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== dependencies: chownr "^1.1.1" mkdirp-classic "^0.5.2" pump "^3.0.0" tar-stream "^2.1.4" -tar-fs@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217" - integrity sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w== +tar-fs@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.8.tgz#8f62012537d5ff89252d01e48690dc4ebed33ab7" + integrity sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg== dependencies: pump "^3.0.0" tar-stream "^3.1.5" optionalDependencies: - bare-fs "^2.1.1" - bare-path "^2.1.0" + bare-fs "^4.0.1" + bare-path "^3.0.0" tar-stream@^1.5.2: version "1.6.2" @@ -16572,10 +16741,20 @@ terser-webpack-plugin@^5.3.10: serialize-javascript "^6.0.2" terser "^5.31.1" -terser@5.37.0, terser@^5.0.0, terser@^5.31.1, terser@^5.8.0: - version "5.37.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3" - integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== +terser@5.38.2: + version "5.38.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.38.2.tgz#24aef4ea48c900d46a4b13f6a53789980d59967f" + integrity sha512-w8CXxxbFA5zfNsR/i8HZq5bvn18AK0O9jj7hyo1YqkovLxEFa0uP0LCVGZRqiRaKRFxXhELBp8SteeAjEnfeJg== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +terser@^5.0.0, terser@^5.31.1, terser@^5.8.0: + version "5.39.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.39.0.tgz#0e82033ed57b3ddf1f96708d123cca717d86ca3a" + integrity sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -16647,22 +16826,22 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== -tinyexec@^0.3.0: +tinyexec@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== -tldts-core@^6.1.71: - version "6.1.71" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.71.tgz#04069cbdcf75b7fcb68fb4c1e00591cd3a2d4a5c" - integrity sha512-LRbChn2YRpic1KxY+ldL1pGXN/oVvKfCVufwfVzEQdFYNo39uF7AJa/WXdo+gYO7PTvdfkCPCed6Hkvz/kR7jg== +tldts-core@^6.1.77: + version "6.1.77" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.77.tgz#0fa4563163a7a61d72c4b05650fb66fc7e815500" + integrity sha512-bCaqm24FPk8OgBkM0u/SrEWJgHnhBWYqeBo6yUmcZJDCHt/IfyWBb+14CXdGi4RInMv4v7eUAin15W0DoA+Ytg== tldts@^6.1.32: - version "6.1.71" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.71.tgz#e0db0853dd533628729d6a97a211450205fa21e4" - integrity sha512-LQIHmHnuzfZgZWAf2HzL83TIIrD8NhhI0DVxqo9/FdOd4ilec+NTNZOlDZf7EwrTNoutccbsHjvWHYXLAtvxjw== + version "6.1.77" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.77.tgz#714e3d1989e562886f2ed97b65e95a8e9f9e92d9" + integrity sha512-lBpoWgy+kYmuXWQ83+R7LlJCnsd9YW8DGpZSHhrMl4b8Ly/1vzOie3OdtmUJDkKxcgRGOehDu5btKkty+JEe+g== dependencies: - tldts-core "^6.1.71" + tldts-core "^6.1.77" tmp@0.0.30: version "0.0.30" @@ -16743,9 +16922,9 @@ toidentifier@1.0.1: integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.0.0.tgz#6b6518e2b5c070cf742d872ee0f4f92d69eac1af" - integrity sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q== + version "5.1.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.1.1.tgz#4641c1fdbf024927e29c5532edb7b6e5377ea1f2" + integrity sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA== dependencies: tldts "^6.1.32" @@ -16777,13 +16956,13 @@ tr46@~0.0.3: integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== traverse@>=0.2.4: - version "0.6.10" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.10.tgz#4c93482381d794dee046882c036f3c4eee481324" - integrity sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA== + version "0.6.11" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.11.tgz#e8daa071b101ae66767fffa6f177aa6f7110068e" + integrity sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w== dependencies: - gopd "^1.0.1" - typedarray.prototype.slice "^1.0.3" - which-typed-array "^1.1.15" + gopd "^1.2.0" + typedarray.prototype.slice "^1.0.5" + which-typed-array "^1.1.18" "traverse@>=0.3.0 <0.4": version "0.3.9" @@ -16815,10 +16994,10 @@ triple-beam@^1.3.0: resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== -ts-api-utils@^1.3.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" - integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== +ts-api-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.1.tgz#660729385b625b939aaa58054f45c058f33f10cd" + integrity sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w== ts-dedent@^2.2.0: version "2.2.0" @@ -16826,14 +17005,14 @@ ts-dedent@^2.2.0: integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== ts-graphviz@^2.1.2: - version "2.1.5" - resolved "https://registry.yarnpkg.com/ts-graphviz/-/ts-graphviz-2.1.5.tgz#8b050f5b0632e91eee4225dfece6e4df21c375f4" - integrity sha512-IigMCo40QZvyyURRdYFh0DV6DGDt7OqkPM/TBGXSJKfNKnYmOfRg0tzSlnJS1TQCWFSTEtpBQsqmAZcziXJrWg== + version "2.1.6" + resolved "https://registry.yarnpkg.com/ts-graphviz/-/ts-graphviz-2.1.6.tgz#007fcb42b4e8c55d26543ece9e86395bd3c3cfd6" + integrity sha512-XyLVuhBVvdJTJr2FJJV2L1pc4MwSjMhcunRVgDE9k4wbb2ee7ORYnPewxMWUav12vxyfUM686MSGsqnVRIInuw== dependencies: "@ts-graphviz/adapter" "^2.0.6" - "@ts-graphviz/ast" "^2.0.6" + "@ts-graphviz/ast" "^2.0.7" "@ts-graphviz/common" "^2.1.5" - "@ts-graphviz/core" "^2.0.6" + "@ts-graphviz/core" "^2.0.7" ts-node@^10.9.1: version "10.9.2" @@ -16990,9 +17169,9 @@ type-fest@^0.21.3: integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^4.6.0, type-fest@^4.7.1: - version "4.31.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.31.0.tgz#a3de630c96eb77c281b6ba2affa5dae5fb3c326c" - integrity sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ== + version "4.34.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.34.1.tgz#406a9c573cc51c3fbfee3c85742cf85c52860076" + integrity sha512-6kSc32kT0rbwxD6QL1CYe8IqdzN/J/ILMrNK+HMQCKH3insCDRY/3ITb0vcBss0a3t72fzh2YSzj8ko1HgwT3g== type-is@~1.6.18: version "1.6.18" @@ -17069,7 +17248,7 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typedarray.prototype.slice@^1.0.3: +typedarray.prototype.slice@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz#a40f896968573b33cbb466a61622d3ee615a0728" integrity sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg== @@ -17093,16 +17272,21 @@ typescript@3.2.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.4.tgz#c585cb952912263d915b462726ce244ba510ef3d" integrity sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg== -typescript@5.4.2: - version "5.4.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372" - integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== - -typescript@5.7.2, typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4: +typescript@5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== +typescript@5.7.3, typescript@^5.7.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" + integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== + +typescript@5.8.1-rc: + version "5.8.1-rc" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.1-rc.tgz#678b7586bf1d7fdec0dbf35708ab7bb39ce13c3d" + integrity sha512-D8IlSOUk1E08jpFdK81reYkA1a/4XtEdV6MElOGdbu/uOy1RpEDqNO/onWmqUaLkTyeHmmU/QlWvjcM9cqF85g== + typescript@~4.9.0: version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" @@ -17138,7 +17322,7 @@ unbox-primitive@^1.1.0: has-symbols "^1.1.0" which-boxed-primitive "^1.1.1" -unbzip2-stream@^1.3.3, unbzip2-stream@^1.4.3: +unbzip2-stream@^1.3.3: version "1.4.3" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== @@ -17177,16 +17361,16 @@ undici-types@~6.20.0: integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== undici@^5.25.4: - version "5.28.4" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" - integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + version "5.28.5" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.5.tgz#b2b94b6bf8f1d919bc5a6f31f2c01deb02e54d4b" + integrity sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA== dependencies: "@fastify/busboy" "^2.0.0" undici@^6.15.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.0.tgz#4b3d3afaef984e07b48e7620c34ed8a285ed4cd4" - integrity sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw== + version "6.21.1" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.1.tgz#336025a14162e6837e44ad7b819b35b6c6af0e05" + integrity sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.1" @@ -17226,6 +17410,11 @@ unicorn-magic@^0.1.0: resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== +unicorn-magic@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz#4efd45c85a69e0dd576d25532fbfa22aa5c8a104" + integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA== + union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -17368,17 +17557,17 @@ upath@^1.1.1: integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== update-browserslist-db@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" - integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" + integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== dependencies: escalade "^3.2.0" - picocolors "^1.1.0" + picocolors "^1.1.1" update-notifier-cjs@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/update-notifier-cjs/-/update-notifier-cjs-5.1.6.tgz#6e3aff745d1551b55bb0a0a5939b7e636d95877d" - integrity sha512-wgxdSBWv3x/YpMzsWz5G4p4ec7JWD0HCl8W6bmNB6E5Gwo+1ym5oN4hiXpLf0mPySVEJEIsYlkshnplkg2OP9A== + version "5.1.7" + resolved "https://registry.yarnpkg.com/update-notifier-cjs/-/update-notifier-cjs-5.1.7.tgz#995733b43bdaeb136b999d55061fc385ef787a7f" + integrity sha512-eZWTh8F+VCEoC4UIh0pKmh8h4izj65VvLhCpJpVefUxdYe0fU3GBrC4Sbh1AoWA/miNPAb6UVlp2fUQNsfp+3g== dependencies: boxen "^5.0.0" chalk "^4.1.0" @@ -17454,9 +17643,9 @@ utils-merge@1.0.1: integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^11.0.0: - version "11.0.4" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.0.4.tgz#37943977894ef806d2919a7ca3f89d6e23c60bac" - integrity sha512-IzL6VtTTYcAhA/oghbFJ1Dkmqev+FpQWnCBaKq/gUluLxliWvO8DPFWfIviRmYbtaavtSQe4WBL++rFjdcGWEg== + version "11.0.5" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.0.5.tgz#07b46bdfa6310c92c3fb3953a8720f170427fc62" + integrity sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA== uuid@^3.0.0, uuid@^3.3.2: version "3.4.0" @@ -17596,17 +17785,28 @@ vinyl@^3.0.0: replace-ext "^2.0.0" teex "^1.0.1" -vite@6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.3.tgz#cc01f403e326a9fc1e064235df8a6de084c8a491" - integrity sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw== +vite@6.0.7: + version "6.0.7" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.7.tgz#f0f8c120733b04af52b4a1e3e7cb54eb851a799b" + integrity sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ== dependencies: - esbuild "^0.24.0" + esbuild "^0.24.2" postcss "^8.4.49" rollup "^4.23.0" optionalDependencies: fsevents "~2.3.3" +vite@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.1.0.tgz#00a4e99a23751af98a2e4701c65ba89ce23858a6" + integrity sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ== + dependencies: + esbuild "^0.24.2" + postcss "^8.5.1" + rollup "^4.30.1" + optionalDependencies: + fsevents "~2.3.3" + void-elements@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" @@ -17920,10 +18120,10 @@ whatwg-mimetype@^4.0.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== -whatwg-url@^14.0.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.1.0.tgz#fffebec86cc8e6c2a657e50dc606207b870f0ab3" - integrity sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w== +whatwg-url@^14.0.0, whatwg-url@^14.1.0: + version "14.1.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.1.1.tgz#ce71e240c61541315833b5cdafd139a479e47058" + integrity sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ== dependencies: tr46 "^5.0.0" webidl-conversions "^7.0.0" @@ -17986,7 +18186,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.15, which-typed-array@^1.1.16, which-typed-array@^1.1.18: +which-typed-array@^1.1.16, which-typed-array@^1.1.18: version "1.1.18" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.18.tgz#df2389ebf3fbb246a71390e90730a9edb6ce17ad" integrity sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA== @@ -17998,7 +18198,7 @@ which-typed-array@^1.1.15, which-typed-array@^1.1.16, which-typed-array@^1.1.18: gopd "^1.2.0" has-tostringtag "^1.0.2" -which@^1.2.1, which@^1.2.14, which@^1.2.9: +which@^1.2.1, which@^1.2.14: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -18224,12 +18424,7 @@ yallist@^5.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533" integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== -yaml@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773" - integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg== - -yaml@^2.2.1, yaml@^2.2.2, yaml@^2.4.1: +yaml@2.7.0, yaml@^2.2.1, yaml@^2.2.2, yaml@^2.4.1: version "2.7.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== @@ -18348,10 +18543,10 @@ zip-stream@^6.0.1: compress-commons "^6.0.2" readable-stream "^4.0.0" -zod@3.23.8: - version "3.23.8" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" - integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== +zod@^3.24.1: + version "3.24.2" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.2.tgz#8efa74126287c675e92f46871cfc8d15c34372b3" + integrity sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ== zwitch@^2.0.4: version "2.0.4"