diff --git a/.gitattributes b/.gitattributes index 63ca2fc710ef..85a9c64aa951 100644 --- a/.gitattributes +++ b/.gitattributes @@ -39,4 +39,4 @@ # Yarn # https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored -/war/.yarn/plugins/** binary +/.yarn/plugins/** binary diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 7634f375c150..f7032327b8df 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -67,4 +67,8 @@ jobs: GIT_COMMITTER_EMAIL: <86592549+jenkins-infra-changelog-generator[bot]@users.noreply.github.com> run: | wget --quiet https://raw.githubusercontent.com/jenkinsci/core-changelog-generator/master/generate-weekly-changelog.sh + # Create a Python virtual environment for pip install + # See https://github.com/jenkinsci/core-changelog-generator/issues/37 + python3 -m venv venv + source venv/bin/activate bash generate-weekly-changelog.sh diff --git a/.github/workflows/publish-release-artifact.yml b/.github/workflows/publish-release-artifact.yml index 8b7242136ce9..e0268a61af0b 100644 --- a/.github/workflows/publish-release-artifact.yml +++ b/.github/workflows/publish-release-artifact.yml @@ -73,7 +73,7 @@ jobs: wget -q https://get.jenkins.io/${REPO}/${PROJECT_VERSION}/${FILE_NAME} - name: Upload Release Asset id: upload-war - uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191 # v2.0.8 + uses: softprops/action-gh-release@e7a8f85e1c67a31e6ed99a94b41bd0b71bbee6b8 # v2.0.9 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -108,7 +108,7 @@ jobs: - name: Upload Release Asset id: upload-deb if: always() - uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191 # v2.0.8 + uses: softprops/action-gh-release@e7a8f85e1c67a31e6ed99a94b41bd0b71bbee6b8 # v2.0.9 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -144,7 +144,7 @@ jobs: - name: Upload Release Asset id: upload-rpm if: always() - uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191 # v2.0.8 + uses: softprops/action-gh-release@e7a8f85e1c67a31e6ed99a94b41bd0b71bbee6b8 # v2.0.9 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -180,7 +180,7 @@ jobs: - name: Upload Release Asset id: upload-msi if: always() - uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191 # v2.0.8 + uses: softprops/action-gh-release@e7a8f85e1c67a31e6ed99a94b41bd0b71bbee6b8 # v2.0.9 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -216,7 +216,7 @@ jobs: - name: Upload Release Asset id: upload-suse-rpm if: always() - uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191 # v2.0.8 + uses: softprops/action-gh-release@e7a8f85e1c67a31e6ed99a94b41bd0b71bbee6b8 # v2.0.9 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.gitignore b/.gitignore index f7314d0646ec..41747ca0cd23 100644 --- a/.gitignore +++ b/.gitignore @@ -65,9 +65,7 @@ junit.xml # Yarn # https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored -.pnp.* .yarn/* -.yarnrc.yml !.yarn/patches !.yarn/plugins !.yarn/sdks @@ -78,7 +76,4 @@ node/ node_modules/ # Generated JavaScript Bundles -jsbundles - -# In case someone accidentally runs npm install instead of yarn install -package-lock.json +war/src/main/webapp/jsbundles/ diff --git a/.prettierignore b/.prettierignore index 042e5d268c0c..72610f04b419 100644 --- a/.prettierignore +++ b/.prettierignore @@ -7,13 +7,11 @@ node/ .git -.yarnrc.yml - # libraries / external deps / generated files -war/src/main/js/plugin-setup-wizard/bootstrap-detached.js +src/main/js/plugin-setup-wizard/bootstrap-detached.js war/src/main/webapp/scripts/yui war/src/main/webapp/jsbundles/ -war/src/main/scss/_bootstrap.scss +src/main/scss/_bootstrap.scss # test files that we don't need formatted test/src/test/resources diff --git a/.stylelintrc.js b/.stylelintrc.js index 711c7c77f83a..cfea225e3035 100644 --- a/.stylelintrc.js +++ b/.stylelintrc.js @@ -1,7 +1,7 @@ module.exports = { extends: "stylelint-config-standard", customSyntax: "postcss-scss", - ignoreFiles: ["war/src/main/scss/_bootstrap.scss"], + ignoreFiles: ["src/main/scss/_bootstrap.scss"], rules: { "no-descending-specificity": null, "selector-class-pattern": "[a-z]", diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 000000000000..5004f58b1bfd --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1,2 @@ +enableGlobalCache: false +nodeLinker: node-modules diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1be9d4f3f9cf..98650aa99de6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,7 +11,7 @@ This page provides information about contributing code to the Jenkins core codeb 3. Install the necessary development tools. In order to develop Jenkins, you need the following: - Java Development Kit (JDK) 17 or 21. In the Jenkins project we usually use [Eclipse Temurin](https://adoptium.net/) or [OpenJDK](https://openjdk.java.net/), but you can use other JDKs as well. - - Apache Maven 3.8.1 or above. You can [download Maven here](https://maven.apache.org/download.cgi). + - Apache Maven 3.9.6 or above. You can [download Maven here](https://maven.apache.org/download.cgi). In the Jenkins project we usually use the most recent Maven release. - Any IDE which supports importing Maven projects. 4. Set up your development environment as described in [Preparing for Plugin Development](https://www.jenkins.io/doc/developer/tutorial/prepare/) @@ -53,12 +53,12 @@ MAVEN_OPTS='--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/ja ### Running the Yarn frontend build > [!TIP] -> If you already have Node.js installed, you do not need to change your path. Start using `yarn` by enabling [Corepack](https://yarnpkg.com/corepack) with `corepack enable`, if it isn't already; this will add the `yarn` binary to your PATH. +> If you already have Node.js installed, you do not need to change your path. Start using Yarn by enabling [Corepack](https://yarnpkg.com/corepack) with `corepack enable`, if it isn't already; this will add the `yarn` binary to your path. To run the Yarn frontend build, after [building the WAR file](#building-the-war-file), add the downloaded versions of Node and Yarn to your path: ```sh -export PATH=$PWD/node:$PWD/node/yarn/dist/bin:$PATH +export PATH=$PWD/node:$PWD/node/node_modules/corepack/shims:$PATH ``` Then you can run Yarn with e.g. diff --git a/ath.sh b/ath.sh index 1816e037466b..c3a56d5fe4f8 100644 --- a/ath.sh +++ b/ath.sh @@ -6,7 +6,7 @@ set -o xtrace cd "$(dirname "$0")" # https://github.com/jenkinsci/acceptance-test-harness/releases -export ATH_VERSION=5997.v2a_1a_696620a_0 +export ATH_VERSION=6059.veb_df63f37069 if [[ $# -eq 0 ]]; then export JDK=17 diff --git a/bom/pom.xml b/bom/pom.xml index 47321614432c..fa38665c2a7b 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -62,7 +62,7 @@ THE SOFTWARE. org.springframework spring-framework-bom - 6.1.13 + 6.1.14 pom import @@ -70,7 +70,7 @@ THE SOFTWARE. org.springframework.security spring-security-bom - 6.3.3 + 6.3.4 pom import @@ -88,7 +88,7 @@ THE SOFTWARE. com.google.guava guava - 33.3.0-jre + 33.3.1-jre @@ -250,7 +250,7 @@ THE SOFTWARE. org.jenkins-ci annotation-indexer - 1.17 + 1.18 org.jenkins-ci @@ -260,27 +260,27 @@ THE SOFTWARE. org.jenkins-ci crypto-util - 1.9 + 1.10 org.jenkins-ci memory-monitor - 1.12 + 1.13 org.jenkins-ci symbol-annotation - 1.24 + 1.25 org.jenkins-ci task-reactor - 1.8 + 1.9 org.jenkins-ci version-number - 1.11 + 1.12 org.jenkins-ci.main @@ -352,6 +352,12 @@ THE SOFTWARE. stapler-groovy ${stapler.version} + + + org.ow2.asm + asm + 9.7.1 + org.samba.jcifs jcifs diff --git a/cli/pom.xml b/cli/pom.xml index 6309811a2e8b..2473629d23cc 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -15,7 +15,7 @@ https://github.com/jenkinsci/jenkins - 2.13.2 + 2.14.0 diff --git a/cli/src/main/java/hudson/cli/FlightRecorderInputStream.java b/cli/src/main/java/hudson/cli/FlightRecorderInputStream.java index 5a1167c4fdc5..41d7a719dd09 100644 --- a/cli/src/main/java/hudson/cli/FlightRecorderInputStream.java +++ b/cli/src/main/java/hudson/cli/FlightRecorderInputStream.java @@ -21,7 +21,7 @@ class FlightRecorderInputStream extends InputStream { * Size (in bytes) of the flight recorder ring buffer used for debugging remoting issues. * @since 2.41 */ - static final int BUFFER_SIZE = Integer.getInteger("hudson.remoting.FlightRecorderInputStream.BUFFER_SIZE", 1024 * 1024); + static final int BUFFER_SIZE = Integer.getInteger("hudson.remoting.FlightRecorderInputStream.BUFFER_SIZE", 1024); private final InputStream source; private ByteArrayRingBuffer recorder = new ByteArrayRingBuffer(BUFFER_SIZE); diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index 3936071de2ef..e7f037652c9b 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -271,14 +271,11 @@ public void run() { String protocol = s.substring(9); AgentProtocol p = AgentProtocol.of(protocol); if (p != null) { - if (Jenkins.get().getAgentProtocols().contains(protocol)) { - LOGGER.log(p instanceof PingAgentProtocol ? Level.FINE : Level.INFO, () -> "Accepted " + protocol + " connection " + connectionInfo); - p.handle(this.s); - } else { - error("Disabled protocol:" + s, this.s); - } - } else + LOGGER.log(p instanceof PingAgentProtocol ? Level.FINE : Level.INFO, () -> "Accepted " + protocol + " connection " + connectionInfo); + p.handle(this.s); + } else { error("Unknown protocol:", this.s); + } } else { error("Unrecognized protocol: " + s, this.s); } @@ -364,21 +361,11 @@ public PingAgentProtocol() { ping = "Ping\n".getBytes(StandardCharsets.UTF_8); } - @Override - public boolean isRequired() { - return true; - } - @Override public String getName() { return "Ping"; } - @Override - public String getDisplayName() { - return Messages.TcpSlaveAgentListener_PingAgentProtocol_displayName(); - } - @Override public void handle(Socket socket) throws IOException, InterruptedException { try (socket) { diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java index b4529a0ea279..07d00a44d006 100644 --- a/core/src/main/java/hudson/Util.java +++ b/core/src/main/java/hudson/Util.java @@ -1525,6 +1525,10 @@ public static Number tryParseNumber(@CheckForNull String numberStr, @CheckForNul * does not contain the specified method. */ public static boolean isOverridden(@NonNull Class base, @NonNull Class derived, @NonNull String methodName, @NonNull Class... types) { + if (base == derived) { + // If base and derived are the same type, the method is not overridden by definition + return false; + } // If derived is not a subclass or implementor of base, it can't override any method // Technically this should also be triggered when base == derived, because it can't override its own method, but // the unit tests explicitly test for that as working. diff --git a/core/src/main/java/hudson/logging/LogRecorder.java b/core/src/main/java/hudson/logging/LogRecorder.java index ad4c40028547..a4c42bdfcba7 100644 --- a/core/src/main/java/hudson/logging/LogRecorder.java +++ b/core/src/main/java/hudson/logging/LogRecorder.java @@ -44,6 +44,7 @@ import hudson.remoting.VirtualChannel; import hudson.slaves.ComputerListener; import hudson.util.CopyOnWriteList; +import hudson.util.FormApply; import hudson.util.FormValidation; import hudson.util.HttpResponses; import hudson.util.RingBufferLogHandler; @@ -463,7 +464,7 @@ public synchronized void doConfigSubmit(StaplerRequest2 req, StaplerResponse2 rs save(); if (oldFile != null) oldFile.delete(); - rsp.sendRedirect2(redirect); + FormApply.success(redirect).generateResponse(req, rsp, null); } @RequirePOST @@ -556,7 +557,7 @@ public void delete() throws IOException { loggers.forEach(Target::disable); getParent().getRecorders().forEach(logRecorder -> logRecorder.getLoggers().forEach(Target::enable)); - SaveableListener.fireOnChange(this, getConfigFile()); + SaveableListener.fireOnDeleted(this, getConfigFile()); } /** diff --git a/core/src/main/java/hudson/markup/MarkupFormatter.java b/core/src/main/java/hudson/markup/MarkupFormatter.java index a3bf53a739a1..95af637af974 100644 --- a/core/src/main/java/hudson/markup/MarkupFormatter.java +++ b/core/src/main/java/hudson/markup/MarkupFormatter.java @@ -62,9 +62,14 @@ * This is an extension point in Hudson, allowing plugins to implement different markup formatters. * *

- * Implement the following methods to enable and control CodeMirror syntax highlighting - * public String getCodeMirrorMode() // return null to disable CodeMirror dynamically - * public String getCodeMirrorConfig() + * Implement the following methods to enable and control CodeMirror syntax highlighting: + *

    + *
  • public String getCodeMirrorMode() (return null to disable CodeMirror dynamically)
  • + *
  • + * public String getCodeMirrorConfig() (JSON snippet without surrounding curly braces, e.g., "mode": "text/css". + * Historically this allowed invalid JSON, but since TODO it needs to be properly quoted etc. + *
  • + *
* *

Views

*

diff --git a/core/src/main/java/hudson/model/AbstractItem.java b/core/src/main/java/hudson/model/AbstractItem.java index 8ba7aafe15cd..f31316c31656 100644 --- a/core/src/main/java/hudson/model/AbstractItem.java +++ b/core/src/main/java/hudson/model/AbstractItem.java @@ -59,8 +59,6 @@ import java.util.ListIterator; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import javax.xml.transform.sax.SAXSource; @@ -70,6 +68,7 @@ import jenkins.model.Jenkins; import jenkins.model.Loadable; import jenkins.model.queue.ItemDeletion; +import jenkins.security.ExtendedReadRedaction; import jenkins.security.NotReallyRoleSensitiveCallable; import jenkins.security.stapler.StaplerNotDispatchable; import jenkins.util.SystemProperties; @@ -815,6 +814,7 @@ public void delete() throws IOException, InterruptedException { ItemDeletion.deregister(this); } } + SaveableListener.fireOnDeleted(this, getConfigFile()); getParent().onDeleted(AbstractItem.this); Jenkins.get().rebuildDependencyGraphAsync(); } @@ -870,11 +870,11 @@ private void doConfigDotXmlImpl(StaplerRequest2 req, StaplerResponse2 rsp) rsp.sendError(SC_BAD_REQUEST); } - static final Pattern SECRET_PATTERN = Pattern.compile(">(" + Secret.ENCRYPTED_VALUE_PATTERN + ")<"); /** * Writes {@code config.xml} to the specified output stream. * The user must have at least {@link #EXTENDED_READ}. - * If he lacks {@link #CONFIGURE}, then any {@link Secret}s detected will be masked out. + * If he lacks {@link #CONFIGURE}, then any {@link Secret}s or other sensitive information detected will be masked out. + * @see jenkins.security.ExtendedReadRedaction */ @Restricted(NoExternalUse.class) @@ -886,15 +886,13 @@ public void writeConfigDotXml(OutputStream os) throws IOException { } else { String encoding = configFile.sniffEncoding(); String xml = Files.readString(Util.fileToPath(configFile.getFile()), Charset.forName(encoding)); - Matcher matcher = SECRET_PATTERN.matcher(xml); - StringBuilder cleanXml = new StringBuilder(); - while (matcher.find()) { - if (Secret.decrypt(matcher.group(1)) != null) { - matcher.appendReplacement(cleanXml, ">********<"); - } + + for (ExtendedReadRedaction redaction : ExtendedReadRedaction.all()) { + LOGGER.log(Level.FINE, () -> "Applying redaction " + redaction.getClass().getName()); + xml = redaction.apply(xml); } - matcher.appendTail(cleanXml); - org.apache.commons.io.IOUtils.write(cleanXml.toString(), os, encoding); + + org.apache.commons.io.IOUtils.write(xml, os, encoding); } } diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 081f73dd1625..0c525dfabe84 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -41,7 +41,6 @@ import hudson.console.AnnotatedLargeText; import hudson.init.Initializer; import hudson.model.Descriptor.FormException; -import hudson.model.Queue.FlyweightTask; import hudson.model.labels.LabelAtom; import hudson.model.queue.WorkUnit; import hudson.node_monitors.AbstractDiskSpaceMonitor; @@ -67,6 +66,7 @@ import hudson.util.DaemonThreadFactory; import hudson.util.EditDistance; import hudson.util.ExceptionCatchingThreadFactory; +import hudson.util.FormApply; import hudson.util.Futures; import hudson.util.IOUtils; import hudson.util.NamingThreadFactory; @@ -106,6 +106,9 @@ import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; +import jenkins.model.DisplayExecutor; +import jenkins.model.IComputer; +import jenkins.model.IDisplayExecutor; import jenkins.model.Jenkins; import jenkins.security.ImpersonatingExecutorService; import jenkins.security.MasterToSlaveCallable; @@ -116,8 +119,6 @@ import jenkins.util.SystemProperties; import jenkins.widgets.HasWidgets; import net.jcip.annotations.GuardedBy; -import org.jenkins.ui.icon.Icon; -import org.jenkins.ui.icon.IconSet; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -150,7 +151,7 @@ * if a {@link Node} is configured (probably temporarily) with 0 executors, * you won't have a {@link Computer} object for it (except for the built-in node, * which always gets its {@link Computer} in case we have no static executors and - * we need to run a {@link FlyweightTask} - see JENKINS-7291 for more discussion.) + * we need to run a {@link Queue.FlyweightTask} - see JENKINS-7291 for more discussion.) * * Also, even if you remove a {@link Node}, it takes time for the corresponding * {@link Computer} to be removed, if some builds are already in progress on that @@ -164,7 +165,7 @@ * @author Kohsuke Kawaguchi */ @ExportedBean -public /*transient*/ abstract class Computer extends Actionable implements AccessControlled, ExecutorListener, DescriptorByNameOwner, StaplerProxy, HasWidgets { +public /*transient*/ abstract class Computer extends Actionable implements AccessControlled, IComputer, ExecutorListener, DescriptorByNameOwner, StaplerProxy, HasWidgets { private final CopyOnWriteArrayList executors = new CopyOnWriteArrayList<>(); // TODO: @@ -179,11 +180,6 @@ private long connectTime = 0; - /** - * True if Jenkins shouldn't start new builds on this node. - */ - private boolean temporarilyOffline; - /** * {@link Node} object may be created and deleted independently * from this object. @@ -351,12 +347,6 @@ public AnnotatedLargeText getLogText() { return new AnnotatedLargeText<>(getLogFile(), Charset.defaultCharset(), false, this); } - @NonNull - @Override - public ACL getACL() { - return Jenkins.get().getAuthorizationStrategy().getACL(this); - } - /** * If the computer was offline (either temporarily or not), * this method will return the cause. @@ -365,31 +355,27 @@ public ACL getACL() { * null if the system was put offline without given a cause. */ @Exported + @Override public OfflineCause getOfflineCause() { + var node = getNode(); + if (node != null) { + var temporaryOfflineCause = node.getTemporaryOfflineCause(); + if (temporaryOfflineCause != null) { + return temporaryOfflineCause; + } + } return offlineCause; } - /** - * If the computer was offline (either temporarily or not), - * this method will return the cause as a string (without user info). - * - * @return - * empty string if the system was put offline without given a cause. - */ + @Override + public boolean hasOfflineCause() { + return offlineCause != null; + } + @Exported + @Override public String getOfflineCauseReason() { - if (offlineCause == null) { - return ""; - } - // fetch the localized string for "Disconnected By" - String gsub_base = hudson.slaves.Messages.SlaveComputer_DisconnectedBy("", ""); - // regex to remove commented reason base string - String gsub1 = "^" + gsub_base + "[\\w\\W]* \\: "; - // regex to remove non-commented reason base string - String gsub2 = "^" + gsub_base + "[\\w\\W]*"; - - String newString = offlineCause.toString().replaceAll(gsub1, ""); - return newString.replaceAll(gsub2, ""); + return IComputer.super.getOfflineCauseReason(); } /** @@ -556,7 +542,7 @@ public void cliDisconnect(String cause) throws ExecutionException, InterruptedEx @Deprecated public void cliOffline(String cause) throws ExecutionException, InterruptedException { checkPermission(DISCONNECT); - setTemporarilyOffline(true, new ByCLI(cause)); + setTemporaryOfflineCause(new ByCLI(cause)); } /** @@ -565,7 +551,7 @@ public void cliOffline(String cause) throws ExecutionException, InterruptedExcep @Deprecated public void cliOnline() throws ExecutionException, InterruptedException { checkPermission(CONNECT); - setTemporarilyOffline(false, null); + setTemporaryOfflineCause(null); } /** @@ -581,9 +567,6 @@ public int getNumExecutors() { return numExecutors; } - /** - * Returns {@link Node#getNodeName() the name of the node}. - */ public @NonNull String getName() { return nodeName != null ? nodeName : ""; } @@ -628,8 +611,9 @@ public BuildTimelineWidget getTimeline() { } @Exported + @Override public boolean isOffline() { - return temporarilyOffline || getChannel() == null; + return isTemporarilyOffline() || getChannel() == null; } public final boolean isOnline() { @@ -645,12 +629,6 @@ public boolean isManualLaunchAllowed() { return getRetentionStrategy().isManualLaunchAllowed(this); } - - /** - * Is a {@link #connect(boolean)} operation in progress? - */ - public abstract boolean isConnecting(); - /** * Returns true if this computer is supposed to be launched via inbound protocol. * @deprecated since 2008-05-18. @@ -662,14 +640,8 @@ public boolean isJnlpAgent() { return false; } - /** - * Returns true if this computer can be launched by Hudson proactively and automatically. - * - *

- * For example, inbound agents return {@code false} from this, because the launch process - * needs to be initiated from the agent side. - */ @Exported + @Override public boolean isLaunchSupported() { return true; } @@ -690,85 +662,89 @@ public boolean isLaunchSupported() { @Exported @Deprecated public boolean isTemporarilyOffline() { - return temporarilyOffline; + var node = getNode(); + return node != null && node.isTemporarilyOffline(); + } + + /** + * Allows a caller to define an {@link OfflineCause} for a computer that has never been online. + * @since 2.483 + */ + public void setOfflineCause(OfflineCause cause) { + this.offlineCause = cause; } /** * @deprecated as of 1.320. - * Use {@link #setTemporarilyOffline(boolean, OfflineCause)} + * Use {@link #setTemporaryOfflineCause(OfflineCause)} */ @Deprecated public void setTemporarilyOffline(boolean temporarilyOffline) { - setTemporarilyOffline(temporarilyOffline, null); + setTemporaryOfflineCause(temporarilyOffline ? new OfflineCause.LegacyOfflineCause() : null); } /** - * Marks the computer as temporarily offline. This retains the underlying - * {@link Channel} connection, but prevent builds from executing. - * - * @param cause - * If the first argument is true, specify the reason why the node is being put - * offline. + * @deprecated + * Use {@link #setTemporaryOfflineCause(OfflineCause)} instead. */ + @Deprecated(since = "2.482") public void setTemporarilyOffline(boolean temporarilyOffline, OfflineCause cause) { - offlineCause = temporarilyOffline ? cause : null; - this.temporarilyOffline = temporarilyOffline; - Node node = getNode(); - if (node != null) { - node.setTemporaryOfflineCause(offlineCause); - } - synchronized (statusChangeLock) { - statusChangeLock.notifyAll(); - } - if (temporarilyOffline) { - Listeners.notify(ComputerListener.class, false, l -> l.onTemporarilyOffline(this, cause)); + if (cause == null) { + setTemporarilyOffline(temporarilyOffline); } else { - Listeners.notify(ComputerListener.class, false, l -> l.onTemporarilyOnline(this)); + setTemporaryOfflineCause(temporarilyOffline ? cause : null); } } /** - * Returns the icon for this computer. - * - * It is both the recommended and default implementation to serve different icons based on {@link #isOffline} + * Marks the computer as temporarily offline. This retains the underlying + * {@link Channel} connection, but prevent builds from executing. * - * @see #getIconClassName() + * @param temporaryOfflineCause The reason why the node is being put offline. + * If null, this cancels the status + * @since 2.482 */ + public void setTemporaryOfflineCause(@CheckForNull OfflineCause temporaryOfflineCause) { + var node = getNode(); + if (node == null) { + throw new IllegalStateException("Can't set a temporary offline cause if the node has been removed"); + } + node.setTemporaryOfflineCause(temporaryOfflineCause); + } + + /** + * @since 2.482 + * @return If the node is temporarily offline, the reason why. + */ + @SuppressWarnings("unused") // used by setOfflineCause.jelly + public String getTemporaryOfflineCauseReason() { + var node = getNode(); + if (node == null) { + // Node was deleted; computer still exists + return null; + } + var cause = node.getTemporaryOfflineCause(); + if (cause instanceof OfflineCause.UserCause userCause) { + return userCause.getMessage(); + } + return cause != null ? cause.toString() : ""; + } + @Exported + @Override public String getIcon() { - // The machine was taken offline by someone - if (isTemporarilyOffline() && getOfflineCause() instanceof OfflineCause.UserCause) return "symbol-computer-disconnected"; - // The computer is not accepting tasks, e.g. because the availability demands it being offline. - if (!isAcceptingTasks()) { - return "symbol-computer-not-accepting"; - } - // The computer is not connected or it is temporarily offline due to a node monitor - if (isOffline()) return "symbol-computer-offline"; - return "symbol-computer"; + return IComputer.super.getIcon(); } /** - * Returns the class name that will be used to lookup the icon. - * - * This class name will be added as a class tag to the html img tags where the icon should - * show up followed by a size specifier given by {@link Icon#toNormalizedIconSizeClass(String)} - * The conversion of class tag to src tag is registered through {@link IconSet#addIcon(Icon)} - * - * It is both the recommended and default implementation to serve different icons based on {@link #isOffline} + * {@inheritDoc} * * @see #getIcon() */ @Exported + @Override public String getIconClassName() { - return getIcon(); - } - - public String getIconAltText() { - // The machine was taken offline by someone - if (isTemporarilyOffline() && getOfflineCause() instanceof OfflineCause.UserCause) return "[temporarily offline by user]"; - // There is a "technical" reason the computer will not accept new builds - if (isOffline() || !isAcceptingTasks()) return "[offline]"; - return "[online]"; + return IComputer.super.getIconClassName(); } @Exported @@ -780,6 +756,8 @@ public String getCaption() { return Messages.Computer_Caption(nodeName); } + @Override + @NonNull public String getUrl() { return "computer/" + Util.fullEncode(getName()) + "/"; } @@ -814,16 +792,6 @@ protected void setNode(Node node) { this.nodeName = null; setNumExecutors(node.getNumExecutors()); - if (this.temporarilyOffline) { - // When we get a new node, push our current temp offline - // status to it (as the status is not carried across - // configuration changes that recreate the node). - // Since this is also called the very first time this - // Computer is created, avoid pushing an empty status - // as that could overwrite any status that the Node - // brought along from its persisted config data. - node.setTemporaryOfflineCause(this.offlineCause); - } } /** @@ -947,19 +915,18 @@ public int countIdle() { return n; } - /** - * Returns the number of {@link Executor}s that are doing some work right now. - */ + @Override public final int countBusy() { return countExecutors() - countIdle(); } /** - * Returns the current size of the executor pool for this computer. + * {@inheritDoc} * This number may temporarily differ from {@link #getNumExecutors()} if there * are busy tasks when the configured size is decreased. OneOffExecutors are * not included in this count. */ + @Override public final int countExecutors() { return executors.size(); } @@ -996,14 +963,14 @@ public List getAllExecutors() { } /** - * Used to render the list of executors. - * @return a snapshot of the executor display information + * {@inheritDoc} * @since 1.607 */ - @Restricted(NoExternalUse.class) - public List getDisplayExecutors() { + @Override + @NonNull + public List getDisplayExecutors() { // The size may change while we are populating, but let's start with a reasonable guess to minimize resizing - List result = new ArrayList<>(executors.size() + oneOffExecutors.size()); + List result = new ArrayList<>(executors.size() + oneOffExecutors.size()); int index = 0; for (Executor e : executors) { if (e.isDisplayCell()) { @@ -1426,24 +1393,23 @@ public void doRssLatest(StaplerRequest2 req, StaplerResponse2 rsp) throws IOExce @RequirePOST public HttpResponse doToggleOffline(@QueryParameter String offlineMessage) throws IOException, ServletException { - if (!temporarilyOffline) { - checkPermission(DISCONNECT); - offlineMessage = Util.fixEmptyAndTrim(offlineMessage); - setTemporarilyOffline(!temporarilyOffline, - new OfflineCause.UserCause(User.current(), offlineMessage)); - } else { + var node = getNode(); + if (node == null) { + return HttpResponses.notFound(); + } + if (node.isTemporarilyOffline()) { checkPermission(CONNECT); - setTemporarilyOffline(!temporarilyOffline, null); + setTemporaryOfflineCause(null); + return HttpResponses.redirectToDot(); + } else { + return doChangeOfflineCause(offlineMessage); } - return HttpResponses.redirectToDot(); } @RequirePOST public HttpResponse doChangeOfflineCause(@QueryParameter String offlineMessage) throws IOException, ServletException { checkPermission(DISCONNECT); - offlineMessage = Util.fixEmptyAndTrim(offlineMessage); - setTemporarilyOffline(true, - new OfflineCause.UserCause(User.current(), offlineMessage)); + setTemporaryOfflineCause(new OfflineCause.UserCause(User.current(), Util.fixEmptyAndTrim(offlineMessage))); return HttpResponses.redirectToDot(); } @@ -1542,7 +1508,7 @@ public void doConfigSubmit(StaplerRequest2 req, StaplerResponse2 rsp) throws IOE } // take the user back to the agent top page. - rsp.sendRedirect2("../" + result.getNodeName() + '/'); + FormApply.success("../" + result.getNodeName() + '/').generateResponse(req, rsp, null); } /** @@ -1659,15 +1625,8 @@ public Object getTarget() { return e != null ? e.getOwner() : null; } - /** - * Returns {@code true} if the computer is accepting tasks. Needed to allow agents programmatic suspension of task - * scheduling that does not overlap with being offline. - * - * @return {@code true} if the computer is accepting tasks - * @see hudson.slaves.RetentionStrategy#isAcceptingTasks(Computer) - * @see hudson.model.Node#isAcceptingTasks() - */ @OverrideMustInvoke + @Override public boolean isAcceptingTasks() { final Node node = getNode(); return getRetentionStrategy().isAcceptingTasks(this) && (node == null || node.isAcceptingTasks()); @@ -1727,79 +1686,12 @@ public static void relocateOldLogs() { } } - /** - * A value class to provide a consistent snapshot view of the state of an executor to avoid race conditions - * during rendering of the executors list. - * - * @since 1.607 - */ - @Restricted(NoExternalUse.class) - public static class DisplayExecutor implements ModelObject { - - @NonNull - private final String displayName; - @NonNull - private final String url; - @NonNull - private final Executor executor; - - public DisplayExecutor(@NonNull String displayName, @NonNull String url, @NonNull Executor executor) { - this.displayName = displayName; - this.url = url; - this.executor = executor; - } - - @Override - @NonNull - public String getDisplayName() { - return displayName; - } - - @NonNull - public String getUrl() { - return url; - } - - @NonNull - public Executor getExecutor() { - return executor; - } - - @Override - public String toString() { - String sb = "DisplayExecutor{" + "displayName='" + displayName + '\'' + - ", url='" + url + '\'' + - ", executor=" + executor + - '}'; - return sb; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - DisplayExecutor that = (DisplayExecutor) o; - - return executor.equals(that.executor); - } - - @Extension(ordinal = Double.MAX_VALUE) - @Restricted(DoNotUse.class) - public static class InternalComputerListener extends ComputerListener { - @Override - public void onOnline(Computer c, TaskListener listener) throws IOException, InterruptedException { - c.cachedEnvironment = null; - } - } - + @Extension(ordinal = Double.MAX_VALUE) + @Restricted(DoNotUse.class) + public static class InternalComputerListener extends ComputerListener { @Override - public int hashCode() { - return executor.hashCode(); + public void onOnline(Computer c, TaskListener listener) throws IOException, InterruptedException { + c.cachedEnvironment = null; } } diff --git a/core/src/main/java/hudson/model/ComputerSet.java b/core/src/main/java/hudson/model/ComputerSet.java index f25d25a19a50..fcc0aa4e41e7 100644 --- a/core/src/main/java/hudson/model/ComputerSet.java +++ b/core/src/main/java/hudson/model/ComputerSet.java @@ -30,6 +30,8 @@ import hudson.BulkChange; import hudson.DescriptorExtensionList; import hudson.Extension; +import hudson.ExtensionList; +import hudson.ExtensionPoint; import hudson.Util; import hudson.XmlFile; import hudson.init.Initializer; @@ -47,18 +49,24 @@ import java.lang.reflect.InvocationTargetException; import java.util.AbstractList; import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; +import jenkins.model.IComputer; import jenkins.model.Jenkins; import jenkins.model.ModelObjectWithChildren; import jenkins.model.ModelObjectWithContextMenu.ContextMenu; import jenkins.util.Timer; import jenkins.widgets.HasWidgets; import net.sf.json.JSONObject; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.Beta; +import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest2; @@ -106,15 +114,36 @@ public static List get_monitors() { return monitors.toList(); } - @Exported(name = "computer", inline = true) + /** + * @deprecated Use {@link #getComputers()} instead. + * @return All {@link Computer} instances managed by this set. + */ + @Deprecated(since = "2.480") public Computer[] get_all() { - return Jenkins.get().getComputers(); + return getComputers().stream().filter(Computer.class::isInstance).toArray(Computer[]::new); + } + + /** + * @return All {@link IComputer} instances managed by this set, sorted by name. + */ + @Exported(name = "computer", inline = true) + public Collection getComputers() { + return ExtensionList.lookupFirst(ComputerSource.class).get().stream().sorted(Comparator.comparing(IComputer::getName)).toList(); + } + + /** + * Allows plugins to override the displayed list of computers. + * + */ + @Restricted(Beta.class) + public interface ComputerSource extends ExtensionPoint { + Collection get(); } @Override public ContextMenu doChildrenContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception { ContextMenu m = new ContextMenu(); - for (Computer c : get_all()) { + for (IComputer c : getComputers()) { m.add(c); } return m; @@ -170,7 +199,7 @@ public int size() { @Exported public int getTotalExecutors() { int r = 0; - for (Computer c : get_all()) { + for (IComputer c : getComputers()) { if (c.isOnline()) r += c.countExecutors(); } @@ -183,7 +212,7 @@ public int getTotalExecutors() { @Exported public int getBusyExecutors() { int r = 0; - for (Computer c : get_all()) { + for (IComputer c : getComputers()) { if (c.isOnline()) r += c.countBusy(); } @@ -195,7 +224,7 @@ public int getBusyExecutors() { */ public int getIdleExecutors() { int r = 0; - for (Computer c : get_all()) + for (IComputer c : getComputers()) if ((c.isOnline() || c.isConnecting()) && c.isAcceptingTasks()) r += c.countIdle(); return r; @@ -214,7 +243,7 @@ public Computer getDynamic(String token, StaplerRequest2 req, StaplerResponse2 r public void do_launchAll(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException { Jenkins.get().checkPermission(Jenkins.ADMINISTER); - for (Computer c : get_all()) { + for (IComputer c : getComputers()) { if (c.isLaunchSupported()) c.connect(true); } @@ -502,4 +531,13 @@ private static NodeMonitor createDefaultInstance(Descriptor d, bool } return null; } + + @Extension(ordinal = -1) + @Restricted(DoNotUse.class) + public static class ComputerSourceImpl implements ComputerSource { + @Override + public Collection get() { + return Jenkins.get().getComputersCollection(); + } + } } diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java index 562b96e37b8e..33c981d657f5 100644 --- a/core/src/main/java/hudson/model/Descriptor.java +++ b/core/src/main/java/hudson/model/Descriptor.java @@ -24,7 +24,6 @@ package hudson.model; -import static hudson.util.QuotedStringTokenizer.quote; import static jakarta.servlet.http.HttpServletResponse.SC_NOT_FOUND; import edu.umd.cs.findbugs.annotations.CheckForNull; @@ -1306,7 +1305,7 @@ public String getFormField() { @Override public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException, ServletException { if (FormApply.isApply(req)) { - FormApply.applyResponse("notificationBar.show(" + quote(getMessage()) + ",notificationBar.ERROR)") + FormApply.showNotification(getMessage(), FormApply.NotificationType.ERROR) .generateResponse(req, rsp, node); } else { // for now, we can't really use the field name that caused the problem. diff --git a/core/src/main/java/hudson/model/Executor.java b/core/src/main/java/hudson/model/Executor.java index 94aa1c770d21..f86dbd7c6c0a 100644 --- a/core/src/main/java/hudson/model/Executor.java +++ b/core/src/main/java/hudson/model/Executor.java @@ -61,6 +61,7 @@ import java.util.stream.Collectors; import jenkins.model.CauseOfInterruption; import jenkins.model.CauseOfInterruption.UserInterruption; +import jenkins.model.IExecutor; import jenkins.model.InterruptedBuildAction; import jenkins.model.Jenkins; import jenkins.model.queue.AsynchronousExecution; @@ -88,7 +89,7 @@ * @author Kohsuke Kawaguchi */ @ExportedBean -public class Executor extends Thread implements ModelObject { +public class Executor extends Thread implements ModelObject, IExecutor { protected final @NonNull Computer owner; private final Queue queue; private final ReadWriteLock lock = new ReentrantReadWriteLock(); @@ -526,6 +527,7 @@ public void completedAsynchronous(@CheckForNull Throwable error) { * @return * null if the executor is idle. */ + @Override public @CheckForNull Queue.Executable getCurrentExecutable() { lock.readLock().lock(); try { @@ -555,14 +557,8 @@ public Queue.Executable getCurrentExecutableForApi() { return Collections.unmodifiableCollection(causes); } - /** - * Returns the current {@link WorkUnit} (of {@link #getCurrentExecutable() the current executable}) - * that this executor is running. - * - * @return - * null if the executor is idle. - */ @CheckForNull + @Override public WorkUnit getCurrentWorkUnit() { lock.readLock().lock(); try { @@ -601,22 +597,14 @@ public String getDisplayName() { return "Executor #" + getNumber(); } - /** - * Gets the executor number that uniquely identifies it among - * other {@link Executor}s for the same computer. - * - * @return - * a sequential number starting from 0. - */ @Exported + @Override public int getNumber() { return number; } - /** - * Returns true if this {@link Executor} is ready for action. - */ @Exported + @Override public boolean isIdle() { lock.readLock().lock(); try { @@ -705,13 +693,8 @@ public boolean isParking() { return null; } - /** - * Returns the progress of the current build in the number between 0-100. - * - * @return -1 - * if it's impossible to estimate the progress. - */ @Exported + @Override public int getProgress() { long d = executableEstimatedDuration; if (d <= 0) { @@ -725,14 +708,8 @@ public int getProgress() { return num; } - /** - * Returns true if the current build is likely stuck. - * - *

- * This is a heuristics based approach, but if the build is suspiciously taking for a long time, - * this method returns true. - */ @Exported + @Override public boolean isLikelyStuck() { lock.readLock().lock(); try { @@ -754,6 +731,7 @@ public boolean isLikelyStuck() { } } + @Override public long getElapsedTime() { lock.readLock().lock(); try { @@ -777,20 +755,7 @@ public long getTimeSpentInQueue() { } } - /** - * Gets the string that says how long since this build has started. - * - * @return - * string like "3 minutes" "1 day" etc. - */ - public String getTimestampString() { - return Util.getTimeSpanString(getElapsedTime()); - } - - /** - * Computes a human-readable text that shows the expected remaining time - * until the build completes. - */ + @Override public String getEstimatedRemainingTime() { long d = executableEstimatedDuration; if (d < 0) { @@ -911,9 +876,7 @@ public HttpResponse doYank() { return HttpResponses.redirectViaContextPath("/"); } - /** - * Checks if the current user has a permission to stop this build. - */ + @Override public boolean hasStopPermission() { lock.readLock().lock(); try { diff --git a/core/src/main/java/hudson/model/ItemGroupMixIn.java b/core/src/main/java/hudson/model/ItemGroupMixIn.java index 404d213f7344..89945267edc5 100644 --- a/core/src/main/java/hudson/model/ItemGroupMixIn.java +++ b/core/src/main/java/hudson/model/ItemGroupMixIn.java @@ -31,7 +31,6 @@ import hudson.security.AccessControlled; import hudson.util.CopyOnWriteMap; import hudson.util.Function1; -import hudson.util.Secret; import io.jenkins.servlet.ServletExceptionWrapper; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletResponse; @@ -44,11 +43,11 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.regex.Matcher; import javax.xml.transform.TransformerException; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import jenkins.model.Jenkins; +import jenkins.security.ExtendedReadRedaction; import jenkins.security.NotReallyRoleSensitiveCallable; import jenkins.util.xml.XMLUtils; import org.kohsuke.stapler.StaplerRequest; @@ -239,18 +238,17 @@ public synchronized T copy(T src, String name) throws I src.checkPermission(Item.EXTENDED_READ); XmlFile srcConfigFile = Items.getConfigFile(src); if (!src.hasPermission(Item.CONFIGURE)) { - Matcher matcher = AbstractItem.SECRET_PATTERN.matcher(srcConfigFile.asString()); - while (matcher.find()) { - if (Secret.decrypt(matcher.group(1)) != null) { - // AccessDeniedException2 does not permit a custom message, and anyway redirecting the user to the login screen is obviously pointless. - throw new AccessDeniedException( - Messages.ItemGroupMixIn_may_not_copy_as_it_contains_secrets_and_( - src.getFullName(), - Jenkins.getAuthentication2().getName(), - Item.PERMISSIONS.title, - Item.EXTENDED_READ.name, - Item.CONFIGURE.name)); - } + final String originalConfigDotXml = srcConfigFile.asString(); + final String redactedConfigDotXml = ExtendedReadRedaction.applyAll(originalConfigDotXml); + if (!originalConfigDotXml.equals(redactedConfigDotXml)) { + // AccessDeniedException2 does not permit a custom message, and anyway redirecting the user to the login screen is obviously pointless. + throw new AccessDeniedException( + Messages.ItemGroupMixIn_may_not_copy_as_it_contains_secrets_and_( + src.getFullName(), + Jenkins.getAuthentication2().getName(), + Item.PERMISSIONS.title, + Item.EXTENDED_READ.name, + Item.CONFIGURE.name)); } } src.getDescriptor().checkApplicableIn(parent); @@ -302,8 +300,17 @@ public synchronized TopLevelItem createProjectFromXML(String name, InputStream x } }); - success = acl.getACL().hasCreatePermission2(Jenkins.getAuthentication2(), parent, result.getDescriptor()) - && result.getDescriptor().isApplicableIn(parent); + boolean hasCreatePermission = acl.getACL().hasCreatePermission2(Jenkins.getAuthentication2(), parent, result.getDescriptor()); + boolean applicableIn = result.getDescriptor().isApplicableIn(parent); + + success = hasCreatePermission && applicableIn; + + if (!hasCreatePermission) { + throw new AccessDeniedException(Jenkins.getAuthentication2().getName() + " does not have required permissions to create " + result.getDescriptor().clazz.getName()); + } + if (!applicableIn) { + throw new AccessDeniedException(result.getDescriptor().clazz.getName() + " is not applicable in " + parent.getFullName()); + } add(result); diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index e4d54d44b375..d22c25e98e3d 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -34,6 +34,7 @@ import hudson.BulkChange; import hudson.EnvVars; import hudson.Extension; +import hudson.ExtensionList; import hudson.ExtensionPoint; import hudson.FeedAdapter; import hudson.PermalinkList; @@ -221,29 +222,20 @@ public void onLoad(ItemGroup parent, String name) TextFile f = getNextBuildNumberFile(); if (f.exists()) { - // starting 1.28, we store nextBuildNumber in a separate file. - // but old Hudson didn't do it, so if the file doesn't exist, - // assume that nextBuildNumber was read from config.xml try { synchronized (this) { this.nextBuildNumber = Integer.parseInt(f.readTrim()); } } catch (NumberFormatException e) { LOGGER.log(Level.WARNING, "Corruption in {0}: {1}", new Object[] {f, e}); - //noinspection StatementWithEmptyBody - if (this instanceof LazyBuildMixIn.LazyLoadingJob) { - // allow LazyBuildMixIn.onLoad to fix it - } else { - RunT lB = getLastBuild(); - synchronized (this) { - this.nextBuildNumber = lB != null ? lB.getNumber() + 1 : 1; - } - saveNextBuildNumber(); + RunT lB = getLastBuild(); + synchronized (this) { + this.nextBuildNumber = lB != null ? lB.getNumber() + 1 : 1; } + saveNextBuildNumber(); } - } else { - // From the old Hudson, or doCreateItem. Create this file now. - saveNextBuildNumber(); + } else if (nextBuildNumber == 0) { + nextBuildNumber = 1; } if (properties == null) // didn't exist < 1.72 @@ -346,12 +338,42 @@ public boolean isKeepDependencies() { } /** - * Allocates a new buildCommand number. + * Allocates a new build number. + * @see BuildNumberAssigner */ - public synchronized int assignBuildNumber() throws IOException { - int r = nextBuildNumber++; - saveNextBuildNumber(); - return r; + public int assignBuildNumber() throws IOException { + return ExtensionList.lookupFirst(BuildNumberAssigner.class).assignBuildNumber(this, this::saveNextBuildNumber); + } + + /** + * Alternate strategy for assigning build numbers. + */ + @Restricted(Beta.class) + public interface BuildNumberAssigner extends ExtensionPoint { + /** + * Implementation of {@link Job#assignBuildNumber}. + */ + int assignBuildNumber(Job job, SaveNextBuildNumber saveNextBuildNumber) throws IOException; + /** + * Provides an externally accessible alias for {@link Job#saveNextBuildNumber}, which is {@code protected}. + * ({@link #getNextBuildNumber} and {@link #fastUpdateNextBuildNumber} are already accessible.) + */ + interface SaveNextBuildNumber { + void call() throws IOException; + } + } + + @Restricted(DoNotUse.class) + @Extension(ordinal = -1000) + public static final class DefaultBuildNumberAssigner implements BuildNumberAssigner { + @Override + public int assignBuildNumber(Job job, SaveNextBuildNumber saveNextBuildNumber) throws IOException { + synchronized (job) { + int r = job.nextBuildNumber++; + saveNextBuildNumber.call(); + return r; + } + } } /** diff --git a/core/src/main/java/hudson/model/Node.java b/core/src/main/java/hudson/model/Node.java index 55cacd269133..d918b0f1db34 100644 --- a/core/src/main/java/hudson/model/Node.java +++ b/core/src/main/java/hudson/model/Node.java @@ -30,7 +30,6 @@ import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.BulkChange; -import hudson.Extension; import hudson.ExtensionPoint; import hudson.FilePath; import hudson.FileSystemProvisioner; @@ -69,6 +68,7 @@ import java.util.logging.Logger; import jenkins.model.Jenkins; import jenkins.model.Nodes; +import jenkins.util.Listeners; import jenkins.util.SystemProperties; import jenkins.util.io.OnMaster; import net.sf.json.JSONObject; @@ -265,24 +265,13 @@ public void onLoad(Nodes parent, String name) { } /** - * Let Nodes be aware of the lifecycle of their own {@link Computer}. + * @return true if this node has a temporary offline cause set. */ - @Extension - public static class InternalComputerListener extends ComputerListener { - @Override - public void onOnline(Computer c, TaskListener listener) { - Node node = c.getNode(); - - // At startup, we need to restore any previously in-effect temp offline cause. - // We wait until the computer is started rather than getting the data to it sooner - // so that the normal computer start up processing works as expected. - if (node != null && node.temporaryOfflineCause != null && node.temporaryOfflineCause != c.getOfflineCause()) { - c.setTemporarilyOffline(true, node.temporaryOfflineCause); - } - } + boolean isTemporarilyOffline() { + return temporaryOfflineCause != null; } - private OfflineCause temporaryOfflineCause; + private volatile OfflineCause temporaryOfflineCause; /** * Enable a {@link Computer} to inform its node when it is taken @@ -294,6 +283,11 @@ void setTemporaryOfflineCause(OfflineCause cause) { temporaryOfflineCause = cause; save(); } + if (temporaryOfflineCause != null) { + Listeners.notify(ComputerListener.class, false, l -> l.onTemporarilyOffline(toComputer(), temporaryOfflineCause)); + } else { + Listeners.notify(ComputerListener.class, false, l -> l.onTemporarilyOnline(toComputer())); + } } catch (java.io.IOException e) { LOGGER.warning("Unable to complete save, temporary offline status will not be persisted: " + e.getMessage()); } diff --git a/core/src/main/java/hudson/model/Queue.java b/core/src/main/java/hudson/model/Queue.java index 08eba90b906c..797cba56f394 100644 --- a/core/src/main/java/hudson/model/Queue.java +++ b/core/src/main/java/hudson/model/Queue.java @@ -1956,24 +1956,6 @@ default void checkAbortPermission() { } } - /** - * Works just like {@link #checkAbortPermission()} except it indicates the status by a return value, - * instead of exception. - * Also used by default for {@link hudson.model.Queue.Item#hasCancelPermission}. - *

- * NOTE: If you have implemented {@link AccessControlled} this returns by default - * {@code return hasPermission(hudson.model.Item.CANCEL);} - * - * @return false - * if the user doesn't have the permission. - */ - default boolean hasAbortPermission() { - if (this instanceof AccessControlled) { - return ((AccessControlled) this).hasPermission(CANCEL); - } - return true; - } - /** * Returns the URL of this task relative to the context root of the application. * @@ -1984,6 +1966,7 @@ default boolean hasAbortPermission() { * @return * URL that ends with '/'. */ + @Override String getUrl(); /** diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index 37b09fd47d25..ec7eaabf32c6 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -1551,6 +1551,9 @@ public synchronized void deleteArtifacts() throws IOException { * if we fail to delete. */ public void delete() throws IOException { + if (isLogUpdated()) { + throw new IOException("Unable to delete " + this + " because it is still running"); + } synchronized (this) { // Avoid concurrent delete. See https://issues.jenkins.io/browse/JENKINS-61687 if (isPendingDelete) { @@ -1570,6 +1573,7 @@ public void delete() throws IOException { )); //Still firing the delete listeners; just no need to clean up rootDir RunListener.fireDeleted(this); + SaveableListener.fireOnDeleted(this, getDataFile()); synchronized (this) { // avoid holding a lock while calling plugin impls of onDeleted removeRunFromParent(); } @@ -1578,6 +1582,7 @@ public void delete() throws IOException { //The root dir exists and is a directory that needs to be purged RunListener.fireDeleted(this); + SaveableListener.fireOnDeleted(this, getDataFile()); if (artifactManager != null) { deleteArtifacts(); @@ -1883,12 +1888,6 @@ protected final void execute(@NonNull RunExecution job) { LOGGER.log(Level.SEVERE, "Failed to save build record", e); } } - - try { - getParent().logRotate(); - } catch (Exception e) { - LOGGER.log(Level.SEVERE, "Failed to rotate log", e); - } } finally { onEndBuilding(); if (logger != null) { diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index 8a38ef2d470b..0e3cc894148a 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -538,14 +538,17 @@ public String getDownloadUrl() { /** * Is this the legacy default update center site? - * @deprecated - * Will be removed, currently returns always false. - * @since 2.343 + * @since 1.357 */ - @Deprecated @Restricted(NoExternalUse.class) public boolean isLegacyDefault() { - return false; + return isJenkinsCI(); + } + + private boolean isJenkinsCI() { + return url != null + && UpdateCenter.PREDEFINED_UPDATE_SITE_ID.equals(id) + && url.startsWith("http://updates.jenkins-ci.org/"); } /** diff --git a/core/src/main/java/hudson/model/View.java b/core/src/main/java/hudson/model/View.java index 5d53a49ef0b7..b17077cde44d 100644 --- a/core/src/main/java/hudson/model/View.java +++ b/core/src/main/java/hudson/model/View.java @@ -949,9 +949,28 @@ public void doRssLatest(StaplerRequest2 req, StaplerResponse2 rsp) throws IOExce /** * Accepts {@code config.xml} submission, as well as serve it. + * + * @since 2.475 */ @WebMethod(name = "config.xml") public HttpResponse doConfigDotXml(StaplerRequest2 req) throws IOException { + if (Util.isOverridden(View.class, getClass(), "doConfigDotXml", StaplerRequest.class)) { + return doConfigDotXml(StaplerRequest.fromStaplerRequest2(req)); + } else { + return doConfigDotXmlImpl(req); + } + } + + /** + * @deprecated use {@link #doConfigDotXml(StaplerRequest2)} + */ + @Deprecated + @StaplerNotDispatchable + public HttpResponse doConfigDotXml(StaplerRequest req) throws IOException { + return doConfigDotXmlImpl(StaplerRequest.toStaplerRequest2(req)); + } + + private HttpResponse doConfigDotXmlImpl(StaplerRequest2 req) throws IOException { if (req.getMethod().equals("GET")) { // read checkPermission(READ); diff --git a/core/src/main/java/hudson/model/listeners/SaveableListener.java b/core/src/main/java/hudson/model/listeners/SaveableListener.java index 46bbc6ab60be..14877d080bf5 100644 --- a/core/src/main/java/hudson/model/listeners/SaveableListener.java +++ b/core/src/main/java/hudson/model/listeners/SaveableListener.java @@ -30,8 +30,7 @@ import hudson.ExtensionPoint; import hudson.XmlFile; import hudson.model.Saveable; -import java.util.logging.Level; -import java.util.logging.Logger; +import jenkins.util.Listeners; /** * Receives notifications about save actions on {@link Saveable} objects in Hudson. @@ -54,6 +53,17 @@ public abstract class SaveableListener implements ExtensionPoint { */ public void onChange(Saveable o, XmlFile file) {} + /** + * Called when a {@link Saveable} object gets deleted. + * + * @param o + * The saveable object. + * @param file + * The {@link XmlFile} for this saveable object. + * @since 2.480 + */ + public void onDeleted(Saveable o, XmlFile file) {} + /** * Registers this object as an active listener so that it can start getting * callbacks invoked. @@ -77,13 +87,15 @@ public void unregister() { * Fires the {@link #onChange} event. */ public static void fireOnChange(Saveable o, XmlFile file) { - for (SaveableListener l : all()) { - try { - l.onChange(o, file); - } catch (Throwable t) { - Logger.getLogger(SaveableListener.class.getName()).log(Level.WARNING, null, t); - } - } + Listeners.notify(SaveableListener.class, false, l -> l.onChange(o, file)); + } + + /** + * Fires the {@link #onDeleted} event. + * @since 2.480 + */ + public static void fireOnDeleted(Saveable o, XmlFile file) { + Listeners.notify(SaveableListener.class, false, l -> l.onDeleted(o, file)); } /** diff --git a/core/src/main/java/hudson/model/queue/SubTask.java b/core/src/main/java/hudson/model/queue/SubTask.java index 0690d074617c..9a971d9ca40b 100644 --- a/core/src/main/java/hudson/model/queue/SubTask.java +++ b/core/src/main/java/hudson/model/queue/SubTask.java @@ -33,20 +33,16 @@ import hudson.model.Queue; import hudson.model.ResourceActivity; import java.io.IOException; +import jenkins.model.queue.ITask; /** * A component of {@link Queue.Task} that represents a computation carried out by a single {@link Executor}. * * A {@link Queue.Task} consists of a number of {@link SubTask}. * - *

- * Plugins are encouraged to extend from {@link AbstractSubTask} - * instead of implementing this interface directly, to maintain - * compatibility with future changes to this interface. - * * @since 1.377 */ -public interface SubTask extends ResourceActivity { +public interface SubTask extends ResourceActivity, ITask { /** * If this task needs to be run on a node with a particular label, * return that {@link Label}. Otherwise null, indicating @@ -115,4 +111,13 @@ default long getEstimatedDuration() { default Object getSameNodeConstraint() { return null; } + + /** + * A subtask may not be reachable by its own URL. In that case, this method should return null. + * @return the URL where to reach specifically this subtask, relative to Jenkins URL. If non-null, must end with '/'. + */ + @Override + default String getUrl() { + return null; + } } diff --git a/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java b/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java index 7cd1c75abc8d..d49924508bee 100644 --- a/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java +++ b/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java @@ -233,7 +233,7 @@ public boolean isIgnored() { */ protected boolean markOnline(Computer c) { if (isIgnored() || c.isOnline()) return false; // noop - c.setTemporarilyOffline(false, null); + c.setTemporaryOfflineCause(null); return true; } @@ -247,7 +247,7 @@ protected boolean markOnline(Computer c) { protected boolean markOffline(Computer c, OfflineCause oc) { if (isIgnored() || c.isTemporarilyOffline()) return false; // noop - c.setTemporarilyOffline(true, oc); + c.setTemporaryOfflineCause(oc); // notify the admin MonitorMarkedNodeOffline no = AdministrativeMonitor.all().get(MonitorMarkedNodeOffline.class); diff --git a/core/src/main/java/hudson/security/AuthorizationStrategy.java b/core/src/main/java/hudson/security/AuthorizationStrategy.java index db3001fc40f2..5ca218f6a8fd 100644 --- a/core/src/main/java/hudson/security/AuthorizationStrategy.java +++ b/core/src/main/java/hudson/security/AuthorizationStrategy.java @@ -43,6 +43,7 @@ import java.io.Serializable; import java.util.Collection; import java.util.Collections; +import jenkins.model.IComputer; import jenkins.model.Jenkins; import jenkins.security.stapler.StaplerAccessibleType; import net.sf.json.JSONObject; @@ -154,6 +155,22 @@ public abstract class AuthorizationStrategy extends AbstractDescribableImpl + * Default implementation delegates to {@link #getACL(Computer)} if the computer is an instance of {@link Computer}, + * otherwise it will fall back to {@link #getRootACL()}. + * + * @since 2.480 + **/ + public @NonNull ACL getACL(@NonNull IComputer computer) { + if (computer instanceof Computer c) { + return getACL(c); + } + return getRootACL(); + } + /** * Implementation can choose to provide different ACL for different {@link Cloud}s. * This can be used as a basis for more fine-grained access control. diff --git a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java index a8657df65685..ae90b0428c7b 100644 --- a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java +++ b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java @@ -37,15 +37,12 @@ import hudson.util.FormApply; import jakarta.servlet.ServletException; import java.io.IOException; -import java.util.Set; -import java.util.TreeSet; import java.util.function.Predicate; import java.util.logging.Level; import java.util.logging.Logger; import jenkins.model.GlobalConfigurationCategory; import jenkins.model.Jenkins; import jenkins.util.ServerTcpPort; -import net.sf.json.JSONArray; import net.sf.json.JSONException; import net.sf.json.JSONObject; import org.jenkinsci.Symbol; @@ -92,11 +89,6 @@ public boolean isSlaveAgentPortEnforced() { return Jenkins.get().isSlaveAgentPortEnforced(); } - @NonNull - public Set getAgentProtocols() { - return Jenkins.get().getAgentProtocols(); - } - public boolean isDisableRememberMe() { return Jenkins.get().isDisableRememberMe(); } @@ -149,18 +141,6 @@ public boolean configure(StaplerRequest2 req, JSONObject json) throws FormExcept throw new FormException(e, "slaveAgentPortType"); } } - Set agentProtocols = new TreeSet<>(); - if (json.has("agentProtocol")) { - Object protocols = json.get("agentProtocol"); - if (protocols instanceof JSONArray) { - for (int i = 0; i < ((JSONArray) protocols).size(); i++) { - agentProtocols.add(((JSONArray) protocols).getString(i)); - } - } else { - agentProtocols.add(protocols.toString()); - } - } - j.setAgentProtocols(agentProtocols); // persist all the additional security configs boolean result = true; diff --git a/core/src/main/java/hudson/slaves/OfflineCause.java b/core/src/main/java/hudson/slaves/OfflineCause.java index 556c0ebb0c53..07c2d3af2872 100644 --- a/core/src/main/java/hudson/slaves/OfflineCause.java +++ b/core/src/main/java/hudson/slaves/OfflineCause.java @@ -30,9 +30,11 @@ import hudson.model.User; import java.io.ObjectStreamException; import java.util.Collections; -import java.util.Date; +import jenkins.agents.IOfflineCause; import jenkins.model.Jenkins; import org.jvnet.localizer.Localizable; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; @@ -49,26 +51,31 @@ * @since 1.320 */ @ExportedBean -public abstract class OfflineCause { +public abstract class OfflineCause implements IOfflineCause { protected final long timestamp = System.currentTimeMillis(); /** - * Timestamp in which the event happened. + * {@inheritDoc} * * @since 1.612 */ @Exported + @Override public long getTimestamp() { return timestamp; } /** - * Same as {@link #getTimestamp()} but in a different type. - * - * @since 1.612 + * @deprecated Only exists for backward compatibility. + * @see Computer#setTemporarilyOffline(boolean) */ - public final @NonNull Date getTime() { - return new Date(timestamp); + @Deprecated + @Restricted(NoExternalUse.class) + public static class LegacyOfflineCause extends OfflineCause { + @Exported(name = "description") @Override + public String toString() { + return ""; + } } /** @@ -136,15 +143,15 @@ public static class UserCause extends SimpleOfflineCause { // null when unknown private /*final*/ @CheckForNull String userId; + private final String message; + public UserCause(@CheckForNull User user, @CheckForNull String message) { - this( - user != null ? user.getId() : null, - message != null ? " : " + message : "" - ); + this(user != null ? user.getId() : null, message); } private UserCause(String userId, String message) { - super(hudson.slaves.Messages._SlaveComputer_DisconnectedBy(userId != null ? userId : Jenkins.ANONYMOUS2.getName(), message)); + super(hudson.slaves.Messages._SlaveComputer_DisconnectedBy(userId != null ? userId : Jenkins.ANONYMOUS2.getName(), message != null ? " : " + message : "")); + this.message = message; this.userId = userId; } @@ -155,6 +162,13 @@ public User getUser() { ; } + /** + * @return the message that was provided when the computer was taken offline + */ + public String getMessage() { + return message; + } + // Storing the User in a filed was a mistake, switch to userId private Object readResolve() throws ObjectStreamException { if (user != null) { @@ -170,6 +184,24 @@ private Object readResolve() throws ObjectStreamException { } return this; } + + @Override + @NonNull + public String getComputerIcon() { + return "symbol-computer-disconnected"; + } + + @Override + @NonNull + public String getComputerIconAltText() { + return "[temporarily offline by user]"; + } + + @NonNull + @Override + public String getIcon() { + return "symbol-person"; + } } public static class ByCLI extends UserCause { @@ -190,5 +222,28 @@ public static class IdleOfflineCause extends SimpleOfflineCause { public IdleOfflineCause() { super(hudson.slaves.Messages._RetentionStrategy_Demand_OfflineIdle()); } + + @Override + @NonNull + public String getComputerIcon() { + return "symbol-computer-paused"; + } + + @Override + @NonNull + public String getComputerIconAltText() { + return "[will connect automatically whenever needed]"; + } + + @Override + @NonNull + public String getIcon() { + return "symbol-pause"; + } + + @Override + public String getStatusClass() { + return "info"; + } } } diff --git a/core/src/main/java/hudson/slaves/RetentionStrategy.java b/core/src/main/java/hudson/slaves/RetentionStrategy.java index 687e44d5c172..6fe491cdaa87 100644 --- a/core/src/main/java/hudson/slaves/RetentionStrategy.java +++ b/core/src/main/java/hudson/slaves/RetentionStrategy.java @@ -272,6 +272,8 @@ public long check(final SlaveComputer c) { logger.log(Level.INFO, "Launching computer {0} as it has been in demand for {1}", new Object[]{c.getName(), Util.getTimeSpanString(demandMilliseconds)}); c.connect(false); + } else if (c.getOfflineCause() == null) { + c.setOfflineCause(new OfflineCause.IdleOfflineCause()); } } else if (c.isIdle()) { final long idleMilliseconds = System.currentTimeMillis() - c.getIdleStartMilliseconds(); diff --git a/core/src/main/java/hudson/slaves/SimpleScheduledRetentionStrategy.java b/core/src/main/java/hudson/slaves/SimpleScheduledRetentionStrategy.java index ea90529b29b4..13a267ace665 100644 --- a/core/src/main/java/hudson/slaves/SimpleScheduledRetentionStrategy.java +++ b/core/src/main/java/hudson/slaves/SimpleScheduledRetentionStrategy.java @@ -242,6 +242,8 @@ public void run() { c.disconnect(OfflineCause.create(Messages._SimpleScheduledRetentionStrategy_FinishedUpTime())); } } + } else { + c.setOfflineCause(new ScheduledOfflineCause()); } return 0; } @@ -252,6 +254,24 @@ private synchronized boolean isOnlineScheduled() { return (lastStart < now && lastStop > now) || (nextStart < now && nextStop > now); } + public static class ScheduledOfflineCause extends OfflineCause.SimpleOfflineCause { + public ScheduledOfflineCause() { + super(Messages._SimpleScheduledRetentionStrategy_ScheduledOfflineCause_displayName()); + } + + @NonNull + @Override + public String getComputerIcon() { + return "symbol-computer-not-accepting"; + } + + @NonNull + @Override + public String getIcon() { + return "symbol-trigger"; + } + } + @Extension @Symbol("schedule") public static class DescriptorImpl extends Descriptor> { @NonNull diff --git a/core/src/main/java/hudson/tasks/LogRotator.java b/core/src/main/java/hudson/tasks/LogRotator.java index ca95081b0385..0b47f035d809 100644 --- a/core/src/main/java/hudson/tasks/LogRotator.java +++ b/core/src/main/java/hudson/tasks/LogRotator.java @@ -250,7 +250,7 @@ private boolean shouldKeepRun(Run r, Run lsb, Run lstb) { LOGGER.log(FINER, "{0} is not to be removed or purged of artifacts because it’s the last stable build", r); return true; } - if (r.isBuilding()) { + if (r.isLogUpdated()) { LOGGER.log(FINER, "{0} is not to be removed or purged of artifacts because it’s still building", r); return true; } diff --git a/core/src/main/java/hudson/util/FormApply.java b/core/src/main/java/hudson/util/FormApply.java index 280a3051286a..3d5f458ec126 100644 --- a/core/src/main/java/hudson/util/FormApply.java +++ b/core/src/main/java/hudson/util/FormApply.java @@ -24,8 +24,10 @@ package hudson.util; +import hudson.Functions; import jakarta.servlet.ServletException; import java.io.IOException; +import jenkins.model.Jenkins; import org.kohsuke.stapler.HttpResponses.HttpResponseException; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2; @@ -51,7 +53,7 @@ public static HttpResponseException success(final String destination) { public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException, ServletException { if (isApply(req)) { // if the submission is via 'apply', show a response in the notification bar - applyResponse("notificationBar.show('" + Messages.HttpResponses_Saved() + "',notificationBar.SUCCESS)") + showNotification(Messages.HttpResponses_Saved(), NotificationType.SUCCESS) .generateResponse(req, rsp, node); } else { rsp.sendRedirect(destination); @@ -69,6 +71,7 @@ public static boolean isApply(StaplerRequest2 req) { return Boolean.parseBoolean(req.getParameter("core:apply")); } + /** * @deprecated use {@link #isApply(StaplerRequest2)} */ @@ -82,7 +85,10 @@ public static boolean isApply(StaplerRequest req) { *

* When the response HTML includes a JavaScript function in a pre-determined name, that function gets executed. * This method generates such a response from JavaScript text. + * + * @deprecated use {@link #showNotification(String, NotificationType)} instead, which is CSP compatible version */ + @Deprecated public static HttpResponseException applyResponse(final String script) { return new HttpResponseException() { @Override @@ -98,4 +104,36 @@ public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object n } }; } + + /** + * Generates the response for the asynchronous background form submission (AKA the Apply button), + * that will show a notification of certain type and with provided message. + * + * @param message a message to display in the popup. Only plain text is supported. + * @param notificationType type of notification. See {@link NotificationType} for supported types. Defines the notification + * color and the icon that will be shown. + * + * @since 2.482 + */ + public static HttpResponseException showNotification(final String message, final NotificationType notificationType) { + return new HttpResponseException() { + @Override + public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException { + rsp.setContentType("text/html;charset=UTF-8"); + rsp.getWriter().println(""); + } + }; + } + + + /** + * Corresponds to types declared in index.js + */ + public enum NotificationType { + SUCCESS, + WARNING, + ERROR + } } diff --git a/core/src/main/java/hudson/util/RobustCollectionConverter.java b/core/src/main/java/hudson/util/RobustCollectionConverter.java index 64dbbc7d9e9a..f914d909be27 100644 --- a/core/src/main/java/hudson/util/RobustCollectionConverter.java +++ b/core/src/main/java/hudson/util/RobustCollectionConverter.java @@ -26,6 +26,7 @@ import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.XStreamException; +import com.thoughtworks.xstream.converters.ConversionException; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.converters.collections.CollectionConverter; import com.thoughtworks.xstream.converters.reflection.ReflectionProvider; @@ -34,11 +35,15 @@ import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.mapper.Mapper; import com.thoughtworks.xstream.security.InputManipulationException; +import edu.umd.cs.findbugs.annotations.CheckForNull; +import hudson.diagnosis.OldDataMonitor; +import java.lang.reflect.Type; import java.util.Collection; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; import java.util.logging.Logger; import jenkins.util.xstream.CriticalXStreamException; +import org.jvnet.tiger_types.Types; /** * {@link CollectionConverter} that ignores {@link XStreamException}. @@ -52,14 +57,39 @@ @SuppressWarnings({"rawtypes", "unchecked"}) public class RobustCollectionConverter extends CollectionConverter { private final SerializableConverter sc; + /** + * When available, this field holds the declared type of the collection being deserialized. + */ + private final @CheckForNull Class elementType; public RobustCollectionConverter(XStream xs) { - this(xs.getMapper(), xs.getReflectionProvider()); + this(xs.getMapper(), xs.getReflectionProvider(), null); } public RobustCollectionConverter(Mapper mapper, ReflectionProvider reflectionProvider) { + this(mapper, reflectionProvider, null); + } + + /** + * Creates a converter that will validate the types of collection elements during deserialization. + *

Elements with invalid types will be omitted from deserialized collections and may result in an + * {@link OldDataMonitor} warning. + *

This type checking currently uses the erasure of the type argument, so for example, the element type for a + * {@code List>} is just a raw {@code Optional}, so non-integer values inside of the optional + * would still deserialize successfully and the resulting optional would be included in the list. + * + * @see RobustReflectionConverter#unmarshalField + */ + public RobustCollectionConverter(Mapper mapper, ReflectionProvider reflectionProvider, Type collectionType) { super(mapper); sc = new SerializableConverter(mapper, reflectionProvider, new ClassLoaderReference(null)); + if (collectionType != null && Collection.class.isAssignableFrom(Types.erasure(collectionType))) { + var baseType = Types.getBaseClass(collectionType, Collection.class); + var typeArg = Types.getTypeArgument(baseType, 0, Object.class); + this.elementType = Types.erasure(typeArg); + } else { + this.elementType = null; + } } @Override @@ -85,9 +115,19 @@ protected void populateCollection(HierarchicalStreamReader reader, Unmarshalling reader.moveDown(); try { Object item = readBareItem(reader, context, collection); - long nanoNow = System.nanoTime(); - collection.add(item); - XStream2SecurityUtils.checkForCollectionDoSAttack(context, nanoNow); + if (elementType != null && item != null && !elementType.isInstance(item)) { + var exception = new ConversionException("Invalid type for collection element"); + // c.f. TreeUnmarshaller.addInformationTo + exception.add("required-type", elementType.getName()); + exception.add("class", item.getClass().getName()); + exception.add("converter-type", getClass().getName()); + reader.appendErrors(exception); + RobustReflectionConverter.addErrorInContext(context, exception); + } else { + long nanoNow = System.nanoTime(); + collection.add(item); + XStream2SecurityUtils.checkForCollectionDoSAttack(context, nanoNow); + } } catch (CriticalXStreamException e) { throw e; } catch (InputManipulationException e) { diff --git a/core/src/main/java/hudson/util/RobustMapConverter.java b/core/src/main/java/hudson/util/RobustMapConverter.java index f845e38771cc..c802959d0d09 100644 --- a/core/src/main/java/hudson/util/RobustMapConverter.java +++ b/core/src/main/java/hudson/util/RobustMapConverter.java @@ -31,9 +31,13 @@ import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.mapper.Mapper; import com.thoughtworks.xstream.security.InputManipulationException; +import edu.umd.cs.findbugs.annotations.CheckForNull; +import hudson.diagnosis.OldDataMonitor; +import java.lang.reflect.Type; import java.util.Map; import java.util.logging.Logger; import jenkins.util.xstream.CriticalXStreamException; +import org.jvnet.tiger_types.Types; /** * Loads a {@link Map} while tolerating read errors on its keys and values. @@ -42,13 +46,47 @@ final class RobustMapConverter extends MapConverter { private static final Object ERROR = new Object(); + /** + * When available, this field holds the declared type of the keys of the map being deserialized. + */ + private final @CheckForNull Class keyType; + + /** + * When available, this field holds the declared type of the values of the map being deserialized. + */ + private final @CheckForNull Class valueType; + RobustMapConverter(Mapper mapper) { + this(mapper, null); + } + + /** + * Creates a converter that will validate the types of map entry keys and values during deserialization. + *

Map entries whose key or value has an invalid type will be omitted from deserialized maps and may result in + * an {@link OldDataMonitor} warning. + *

This type checking currently uses the erasure of the type argument, so for example, the value type for a + * {@code Map>} is just a raw {@code Optional}, so non-integer values inside of the + * optional would still deserialize successfully and the resulting map entry would be included in the map. + * + * @see RobustReflectionConverter#unmarshalField + */ + RobustMapConverter(Mapper mapper, Type mapType) { super(mapper); + if (mapType != null && Map.class.isAssignableFrom(Types.erasure(mapType))) { + var baseType = Types.getBaseClass(mapType, Map.class); + var keyTypeArg = Types.getTypeArgument(baseType, 0, Object.class); + this.keyType = Types.erasure(keyTypeArg); + var valueTypeArg = Types.getTypeArgument(baseType, 1, Object.class); + this.valueType = Types.erasure(valueTypeArg); + } else { + this.keyType = null; + this.valueType = null; + } } @Override protected void putCurrentEntryIntoMap(HierarchicalStreamReader reader, UnmarshallingContext context, Map map, Map target) { - Object key = read(reader, context, map); - Object value = read(reader, context, map); + Object key = read(reader, context, map, keyType); + Object value = read(reader, context, map, valueType); if (key != ERROR && value != ERROR) { try { long nanoNow = System.nanoTime(); @@ -64,7 +102,7 @@ final class RobustMapConverter extends MapConverter { } } - private Object read(HierarchicalStreamReader reader, UnmarshallingContext context, Map map) { + private Object read(HierarchicalStreamReader reader, UnmarshallingContext context, Map map, @CheckForNull Class expectedType) { if (!reader.hasMoreChildren()) { var exception = new ConversionException("Invalid map entry"); reader.appendErrors(exception); @@ -73,7 +111,18 @@ private Object read(HierarchicalStreamReader reader, UnmarshallingContext contex } reader.moveDown(); try { - return readBareItem(reader, context, map); + var object = readBareItem(reader, context, map); + if (expectedType != null && object != null && !expectedType.isInstance(object)) { + var exception = new ConversionException("Invalid type for map entry key/value"); + // c.f. TreeUnmarshaller.addInformationTo + exception.add("required-type", expectedType.getName()); + exception.add("class", object.getClass().getName()); + exception.add("converter-type", getClass().getName()); + reader.appendErrors(exception); + RobustReflectionConverter.addErrorInContext(context, exception); + return ERROR; + } + return object; } catch (CriticalXStreamException x) { throw x; } catch (XStreamException | LinkageError x) { diff --git a/core/src/main/java/hudson/util/RobustReflectionConverter.java b/core/src/main/java/hudson/util/RobustReflectionConverter.java index d1bc500003e1..686aad13c342 100644 --- a/core/src/main/java/hudson/util/RobustReflectionConverter.java +++ b/core/src/main/java/hudson/util/RobustReflectionConverter.java @@ -48,6 +48,7 @@ import hudson.model.Saveable; import hudson.security.ACL; import java.lang.reflect.Field; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -65,6 +66,7 @@ import jenkins.util.xstream.CriticalXStreamException; import net.jcip.annotations.GuardedBy; import org.acegisecurity.Authentication; +import org.jvnet.tiger_types.Types; /** * Custom {@link ReflectionConverter} that handle errors more gracefully. @@ -80,7 +82,7 @@ @SuppressWarnings({"rawtypes", "unchecked"}) public class RobustReflectionConverter implements Converter { - private static /* non-final for Groovy */ boolean RECORD_FAILURES_FOR_ALL_AUTHENTICATIONS = SystemProperties.getBoolean(RobustReflectionConverter.class.getName() + ".recordFailuresForAllAuthentications", false); + static /* non-final for Groovy */ boolean RECORD_FAILURES_FOR_ALL_AUTHENTICATIONS = SystemProperties.getBoolean(RobustReflectionConverter.class.getName() + ".recordFailuresForAllAuthentications", false); private static /* non-final for Groovy */ boolean RECORD_FAILURES_FOR_ADMINS = SystemProperties.getBoolean(RobustReflectionConverter.class.getName() + ".recordFailuresForAdmins", false); protected final ReflectionProvider reflectionProvider; @@ -324,7 +326,8 @@ public Object doUnmarshal(final Object result, final HierarchicalStreamReader re } } - Map implicitCollectionsForCurrentObject = null; + Map> implicitCollectionsForCurrentObject = new HashMap<>(); + Map> implicitCollectionElementTypesForCurrentObject = new HashMap<>(); while (reader.hasMoreChildren()) { reader.moveDown(); @@ -365,7 +368,7 @@ public Object doUnmarshal(final Object result, final HierarchicalStreamReader re reflectionProvider.writeField(result, fieldName, value, classDefiningField); seenFields.add(classDefiningField, fieldName); } else { - implicitCollectionsForCurrentObject = writeValueToImplicitCollection(context, value, implicitCollectionsForCurrentObject, result, fieldName); + writeValueToImplicitCollection(reader, context, value, implicitCollectionsForCurrentObject, implicitCollectionElementTypesForCurrentObject, result, fieldName); } } } catch (CriticalXStreamException e) { @@ -451,18 +454,23 @@ private boolean fieldDefinedInClass(Object result, String attrName) { protected Object unmarshalField(final UnmarshallingContext context, final Object result, Class type, Field field) { Converter converter = mapper.getLocalConverter(field.getDeclaringClass(), field.getName()); + if (converter == null) { + if (new RobustCollectionConverter(mapper, reflectionProvider).canConvert(type)) { + converter = new RobustCollectionConverter(mapper, reflectionProvider, field.getGenericType()); + } else if (new RobustMapConverter(mapper).canConvert(type)) { + converter = new RobustMapConverter(mapper, field.getGenericType()); + } + } return context.convertAnother(result, type, converter); } - private Map writeValueToImplicitCollection(UnmarshallingContext context, Object value, Map implicitCollections, Object result, String itemFieldName) { + private void writeValueToImplicitCollection(HierarchicalStreamReader reader, UnmarshallingContext context, Object value, Map> implicitCollections, Map> implicitCollectionElementTypes, Object result, String itemFieldName) { String fieldName = mapper.getFieldNameForItemTypeAndName(context.getRequiredType(), value.getClass(), itemFieldName); if (fieldName != null) { - if (implicitCollections == null) { - implicitCollections = new HashMap(); // lazy instantiation - } - Collection collection = (Collection) implicitCollections.get(fieldName); + Collection collection = implicitCollections.get(fieldName); if (collection == null) { - Class fieldType = mapper.defaultImplementationOf(reflectionProvider.getFieldType(result, fieldName, null)); + Field field = reflectionProvider.getField(result.getClass(), fieldName); + Class fieldType = mapper.defaultImplementationOf(field.getType()); if (!Collection.class.isAssignableFrom(fieldType)) { throw new ObjectAccessException("Field " + fieldName + " of " + result.getClass().getName() + " is configured for an implicit Collection, but field is of type " + fieldType.getName()); @@ -473,10 +481,25 @@ private Map writeValueToImplicitCollection(UnmarshallingContext context, Object collection = (Collection) pureJavaReflectionProvider.newInstance(fieldType); reflectionProvider.writeField(result, fieldName, collection, null); implicitCollections.put(fieldName, collection); + Type fieldGenericType = field.getGenericType(); + Type elementGenericType = Types.getTypeArgument(Types.getBaseClass(fieldGenericType, Collection.class), 0, Object.class); + Class elementType = Types.erasure(elementGenericType); + implicitCollectionElementTypes.put(fieldName, elementType); + } + Class elementType = implicitCollectionElementTypes.getOrDefault(fieldName, Object.class); + if (!elementType.isInstance(value)) { + var exception = new ConversionException("Invalid element type for implicit collection for field: " + fieldName); + // c.f. TreeUnmarshaller.addInformationTo + exception.add("required-type", elementType.getName()); + exception.add("class", value.getClass().getName()); + exception.add("converter-type", getClass().getName()); + reader.appendErrors(exception); + throw exception; } collection.add(value); + } else { + // TODO: Should we warn in this case? The value will be ignored. } - return implicitCollections; } private Class determineWhichClassDefinesField(HierarchicalStreamReader reader) { diff --git a/core/src/main/java/jenkins/AgentProtocol.java b/core/src/main/java/jenkins/AgentProtocol.java index d43398985810..1494dc60b183 100644 --- a/core/src/main/java/jenkins/AgentProtocol.java +++ b/core/src/main/java/jenkins/AgentProtocol.java @@ -7,8 +7,6 @@ import hudson.TcpSlaveAgentListener; import java.io.IOException; import java.net.Socket; -import java.util.Set; -import jenkins.model.Jenkins; /** * Pluggable Jenkins TCP agent protocol handler called from {@link TcpSlaveAgentListener}. @@ -18,57 +16,31 @@ * Implementations of this extension point is singleton, and its {@link #handle(Socket)} method * gets invoked concurrently whenever a new connection comes in. * - *

Extending UI

- *
- *
description.jelly
- *
Optional protocol description
- *
deprecationCause.jelly
- *
Optional. If the protocol is marked as {@link #isDeprecated()}, - * clarifies the deprecation reason and provides extra documentation links
- *
- * * @author Kohsuke Kawaguchi * @since 1.467 * @see TcpSlaveAgentListener */ public abstract class AgentProtocol implements ExtensionPoint { /** - * Allow experimental {@link AgentProtocol} implementations to declare being opt-in. - * Note that {@link Jenkins#setAgentProtocols(Set)} only records the protocols where the admin has made a - * conscious decision thus: - *
    - *
  • if a protocol is opt-in, it records the admin enabling it
  • - *
  • if a protocol is opt-out, it records the admin disabling it
  • - *
- * Implementations should not transition rapidly from {@code opt-in -> opt-out -> opt-in}. - * Implementations should never flip-flop: {@code opt-in -> opt-out -> opt-in -> opt-out} as that will basically - * clear any preference that an admin has set. This latter restriction should be ok as we only ever will be - * adding new protocols and retiring old ones. - * - * @return {@code true} if the protocol requires explicit opt-in. - * @since 2.16 - * @see Jenkins#setAgentProtocols(Set) + * @deprecated no longer used */ + @Deprecated public boolean isOptIn() { return false; } + /** - * Allow essential {@link AgentProtocol} implementations (basically {@link TcpSlaveAgentListener.PingAgentProtocol}) - * to be always enabled. - * - * @return {@code true} if the protocol can never be disabled. - * @since 2.16 + * @deprecated no longer used */ - + @Deprecated public boolean isRequired() { return false; } /** - * Checks if the protocol is deprecated. - * - * @since 2.75 + * @deprecated no longer used */ + @Deprecated public boolean isDeprecated() { return false; } @@ -79,17 +51,15 @@ public boolean isDeprecated() { * This is a short string that consists of printable ASCII chars. Sent by the client to select the protocol. * * @return - * null to be disabled. This is useful for avoiding getting used - * until the protocol is properly configured. + * null to be disabled */ + @CheckForNull public abstract String getName(); /** - * Returns the human readable protocol display name. - * - * @return the human readable protocol display name. - * @since 2.16 + * @deprecated no longer used */ + @Deprecated public String getDisplayName() { return getName(); } diff --git a/core/src/main/java/jenkins/agents/IOfflineCause.java b/core/src/main/java/jenkins/agents/IOfflineCause.java new file mode 100644 index 000000000000..b1c32820e848 --- /dev/null +++ b/core/src/main/java/jenkins/agents/IOfflineCause.java @@ -0,0 +1,108 @@ +/* + * The MIT License + * + * Copyright 2024 CloudBees, Inc. + * + * 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: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package jenkins.agents; + +import edu.umd.cs.findbugs.annotations.NonNull; +import hudson.Util; +import java.util.Date; +import java.util.Objects; +import jenkins.model.IComputer; + +/** + * Represents a cause that puts a {@linkplain IComputer#isOffline() computer offline}. + * @since 2.483 + */ +public interface IOfflineCause { + /** + * @return The icon to use for the computer that has this offline cause. It will be displayed in the build executor status widget, as well as in nodes list screen. + */ + @NonNull + default String getComputerIcon() { + return "symbol-computer-offline"; + } + + /** + * @return The alt text for the icon returned by {@link #getComputerIcon()}. + */ + @NonNull + default String getComputerIconAltText() { + return "[offline]"; + } + + /** + * @return The icon to render this offline cause. It will be displayed in the build executor status widget. + */ + @NonNull + default String getIcon() { + return "symbol-error"; + } + + /** + * @return The reason why this offline cause exists. + *

+ * For implementers: this can use HTML formatting, so make sure to only include trusted content. + */ + @NonNull + default String getReason() { + // fetch the localized string for "Disconnected By" + String gsub_base = hudson.slaves.Messages.SlaveComputer_DisconnectedBy("", ""); + // regex to remove commented reason base string + String gsub1 = "^" + gsub_base + "[\\w\\W]* \\: "; + // regex to remove non-commented reason base string + String gsub2 = "^" + gsub_base + "[\\w\\W]*"; + return Objects.requireNonNull(Util.escape(toString().replaceAll(gsub1, "").replaceAll(gsub2, ""))); + } + + /** + * @return A short message (one word) that summarizes the offline cause. + * + *

+ * For implementers: this can use HTML formatting, so make sure to only include trusted content. + */ + @NonNull + default String getMessage() { + return Messages.IOfflineCause_offline(); + } + + /** + * @return the CSS class name that should be used to render the status. + */ + @SuppressWarnings("unused") // jelly + default String getStatusClass() { + return "warning"; + } + + /** + * Timestamp in which the event happened. + */ + long getTimestamp(); + + /** + * Same as {@link #getTimestamp()} but in a different type. + */ + @NonNull + default Date getTime() { + return new Date(getTimestamp()); + } +} diff --git a/core/src/main/java/jenkins/cli/SafeRestartCommand.java b/core/src/main/java/jenkins/cli/SafeRestartCommand.java index 54c624bbba27..4c1a8009e44d 100644 --- a/core/src/main/java/jenkins/cli/SafeRestartCommand.java +++ b/core/src/main/java/jenkins/cli/SafeRestartCommand.java @@ -32,6 +32,7 @@ import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.args4j.Option; +import org.kohsuke.stapler.StaplerRequest2; /** * Safe Restart Jenkins - do not accept any new jobs and try to pause existing. @@ -53,7 +54,7 @@ public String getShortDescription() { @Override protected int run() throws Exception { - Jenkins.get().doSafeRestart(null, message); + Jenkins.get().doSafeRestart((StaplerRequest2) null, message); return 0; } } diff --git a/core/src/main/java/jenkins/model/BackgroundGlobalBuildDiscarder.java b/core/src/main/java/jenkins/model/BackgroundGlobalBuildDiscarder.java index 1a42c0577a47..ad33643879f5 100644 --- a/core/src/main/java/jenkins/model/BackgroundGlobalBuildDiscarder.java +++ b/core/src/main/java/jenkins/model/BackgroundGlobalBuildDiscarder.java @@ -31,6 +31,7 @@ import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Stream; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -56,8 +57,18 @@ protected void execute(TaskListener listener) throws IOException, InterruptedExc } } + /** + * Runs all globally configured build discarders against a job. + */ public static void processJob(TaskListener listener, Job job) { - GlobalBuildDiscarderConfiguration.get().getConfiguredBuildDiscarders().forEach(strategy -> { + processJob(listener, job, GlobalBuildDiscarderConfiguration.get().getConfiguredBuildDiscarders().stream()); + } + + /** + * Runs the specified build discarders against a job. + */ + public static void processJob(TaskListener listener, Job job, Stream strategies) { + strategies.forEach(strategy -> { String displayName = strategy.getDescriptor().getDisplayName(); if (strategy.isApplicable(job)) { try { diff --git a/core/src/main/java/jenkins/model/DisplayExecutor.java b/core/src/main/java/jenkins/model/DisplayExecutor.java new file mode 100644 index 000000000000..f7559ff85799 --- /dev/null +++ b/core/src/main/java/jenkins/model/DisplayExecutor.java @@ -0,0 +1,97 @@ +/* + * The MIT License + * + * Copyright 2024 CloudBees, Inc. + * + * 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: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.model; + +import edu.umd.cs.findbugs.annotations.NonNull; +import hudson.model.Executor; +import hudson.model.ModelObject; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +/** + * A value class providing a consistent snapshot view of the state of an executor to avoid race conditions + * during rendering of the executors list. + */ +@Restricted(NoExternalUse.class) +public class DisplayExecutor implements ModelObject, IDisplayExecutor { + + @NonNull + private final String displayName; + @NonNull + private final String url; + @NonNull + private final Executor executor; + + public DisplayExecutor(@NonNull String displayName, @NonNull String url, @NonNull Executor executor) { + this.displayName = displayName; + this.url = url; + this.executor = executor; + } + + @Override + @NonNull + public String getDisplayName() { + return displayName; + } + + @Override + @NonNull + public String getUrl() { + return url; + } + + @Override + @NonNull + public Executor getExecutor() { + return executor; + } + + @Override + public String toString() { + return "DisplayExecutor{" + "displayName='" + displayName + '\'' + + ", url='" + url + '\'' + + ", executor=" + executor + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + DisplayExecutor that = (DisplayExecutor) o; + + return executor.equals(that.executor); + } + + @Override + public int hashCode() { + return executor.hashCode(); + } +} diff --git a/core/src/main/java/jenkins/model/GlobalBuildDiscarderListener.java b/core/src/main/java/jenkins/model/GlobalBuildDiscarderListener.java index 7ddea84c4241..6d2c58b44774 100644 --- a/core/src/main/java/jenkins/model/GlobalBuildDiscarderListener.java +++ b/core/src/main/java/jenkins/model/GlobalBuildDiscarderListener.java @@ -35,7 +35,7 @@ import org.kohsuke.accmod.restrictions.NoExternalUse; /** - * Run background build discarders on an individual job once a build is finalized + * Run build discarders on an individual job once a build is finalized */ @Extension @Restricted(NoExternalUse.class) @@ -46,6 +46,15 @@ public class GlobalBuildDiscarderListener extends RunListener { @Override public void onFinalized(Run run) { Job job = run.getParent(); - BackgroundGlobalBuildDiscarder.processJob(new LogTaskListener(LOGGER, Level.FINE), job); + try { + // Job-level build discarder execution is unconditional. + job.logRotate(); + } catch (Exception e) { + LOGGER.log(Level.WARNING, e, () -> "Failed to rotate log for " + run); + } + // Avoid calling Job.logRotate twice in case JobGlobalBuildDiscarderStrategy is configured globally. + BackgroundGlobalBuildDiscarder.processJob(new LogTaskListener(LOGGER, Level.FINE), job, + GlobalBuildDiscarderConfiguration.get().getConfiguredBuildDiscarders().stream() + .filter(s -> !(s instanceof JobGlobalBuildDiscarderStrategy))); } } diff --git a/core/src/main/java/jenkins/model/IComputer.java b/core/src/main/java/jenkins/model/IComputer.java new file mode 100644 index 000000000000..37fe0af98535 --- /dev/null +++ b/core/src/main/java/jenkins/model/IComputer.java @@ -0,0 +1,227 @@ +/* + * The MIT License + * + * Copyright 2024 CloudBees, Inc. + * + * 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: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.model; + +import edu.umd.cs.findbugs.annotations.NonNull; +import hudson.Util; +import hudson.model.Computer; +import hudson.model.Node; +import hudson.security.ACL; +import hudson.security.AccessControlled; +import java.util.List; +import java.util.concurrent.Future; +import jenkins.agents.IOfflineCause; +import org.jenkins.ui.icon.Icon; +import org.jenkins.ui.icon.IconSet; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.Beta; + +/** + * Interface for computer-like objects meant to be passed to {@code t:executors} tag. + * + * @since 2.480 + */ +@Restricted(Beta.class) +public interface IComputer extends AccessControlled { + /** + * Returns {@link Node#getNodeName() the name of the node}. + */ + @NonNull + String getName(); + + /** + * Used to render the list of executors. + * @return a snapshot of the executor display information + */ + @NonNull + List getDisplayExecutors(); + + /** + * @return {@code true} if the node is offline. {@code false} if it is online. + */ + boolean isOffline(); + + /** + * @return the node name for UI purposes. + */ + @NonNull + String getDisplayName(); + + /** + * Returns {@code true} if the computer is accepting tasks. Needed to allow agents programmatic suspension of task + * scheduling that does not overlap with being offline. + * + * @return {@code true} if the computer is accepting tasks + * @see hudson.slaves.RetentionStrategy#isAcceptingTasks(Computer) + * @see hudson.model.Node#isAcceptingTasks() + */ + boolean isAcceptingTasks(); + + /** + * @return the URL where to reach specifically this computer, relative to Jenkins URL. + */ + @NonNull + String getUrl(); + + /** + * @return {@code true} if this computer has a defined offline cause, @{code false} otherwise. + */ + default boolean hasOfflineCause() { + return Util.fixEmpty(getOfflineCauseReason()) != null; + } + + /** + * @return the offline cause if the computer is offline. + * @since 2.483 + */ + IOfflineCause getOfflineCause(); + + /** + * If the computer was offline (either temporarily or not), + * this method will return the cause as a string (without user info). + *

+ * {@code hasOfflineCause() == true} implies this must be nonempty. + * + * @return + * empty string if the system was put offline without given a cause. + */ + @NonNull + default String getOfflineCauseReason() { + if (getOfflineCause() == null) { + return ""; + } + return getOfflineCause().getReason(); + } + + /** + * @return true if the node is currently connecting to the Jenkins controller. + */ + boolean isConnecting(); + + /** + * Returns the icon for this computer. + *

+ * It is both the recommended and default implementation to serve different icons based on {@link #isOffline} + * + * @see #getIconClassName() + */ + default String getIcon() { + // The computer is not accepting tasks, e.g. because the availability demands it being offline. + if (!isAcceptingTasks()) { + return "symbol-computer-not-accepting"; + } + var offlineCause = getOfflineCause(); + if (offlineCause != null) { + return offlineCause.getComputerIcon(); + } + // The computer is not connected or it is temporarily offline due to a node monitor + if (isOffline()) return "symbol-computer-offline"; + return "symbol-computer"; + } + + /** + * Returns the alternative text for the computer icon. + */ + @SuppressWarnings("unused") // jelly + default String getIconAltText() { + if (!isAcceptingTasks()) { + return "[suspended]"; + } + var offlineCause = getOfflineCause(); + if (offlineCause != null) { + return offlineCause.getComputerIconAltText(); + } + // There is a "technical" reason the computer will not accept new builds + if (isOffline()) return "[offline]"; + return "[online]"; + } + + default String getTooltip() { + var offlineCause = getOfflineCause(); + if (offlineCause != null) { + return offlineCause.toString(); + } else { + return ""; + } + } + + /** + * Returns the class name that will be used to look up the icon. + *

+ * This class name will be added as a class tag to the html img tags where the icon should + * show up followed by a size specifier given by {@link Icon#toNormalizedIconSizeClass(String)} + * The conversion of class tag to src tag is registered through {@link IconSet#addIcon(Icon)} + * + * @see #getIcon() + */ + default String getIconClassName() { + return getIcon(); + } + + /** + * Returns the number of {@link IExecutor}s that are doing some work right now. + */ + int countBusy(); + /** + * Returns the current size of the executor pool for this computer. + */ + int countExecutors(); + + /** + * @return true if the computer is online. + */ + boolean isOnline(); + /** + * @return the number of {@link IExecutor}s that are idle right now. + */ + int countIdle(); + + /** + * @return true if this computer can be launched by Jenkins proactively and automatically. + * + *

+ * For example, inbound agents return {@code false} from this, because the launch process + * needs to be initiated from the agent side. + */ + boolean isLaunchSupported(); + + /** + * Attempts to connect this computer. + * + * @param forceReconnect If true and a connect activity is already in progress, it will be cancelled and + * the new one will be started. If false, and a connect activity is already in progress, this method + * will do nothing and just return the pending connection operation. + * @return A {@link Future} representing pending completion of the task. The 'completion' includes + * both a successful completion and a non-successful completion (such distinction typically doesn't + * make much sense because as soon as {@link IComputer} is connected it can be disconnected by some other threads.) + */ + Future connect(boolean forceReconnect); + + @NonNull + @Override + default ACL getACL() { + return Jenkins.get().getAuthorizationStrategy().getACL(this); + } +} diff --git a/core/src/main/java/jenkins/model/IDisplayExecutor.java b/core/src/main/java/jenkins/model/IDisplayExecutor.java new file mode 100644 index 000000000000..5f959a158faa --- /dev/null +++ b/core/src/main/java/jenkins/model/IDisplayExecutor.java @@ -0,0 +1,55 @@ +/* + * The MIT License + * + * Copyright 2024 CloudBees, Inc. + * + * 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: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.model; + +import edu.umd.cs.findbugs.annotations.NonNull; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.Beta; + +/** + * A snapshot of the executor information for display purpose. + * + * @since 2.480 + */ +@Restricted(Beta.class) +public interface IDisplayExecutor { + /** + * @return The UI label for this executor. + */ + @NonNull + String getDisplayName(); + + /** + * @return the URL where to reach specifically this executor, relative to Jenkins URL. + */ + @NonNull + String getUrl(); + + /** + * @return the executor this display information is for. + */ + @NonNull + IExecutor getExecutor(); +} diff --git a/core/src/main/java/jenkins/model/IExecutor.java b/core/src/main/java/jenkins/model/IExecutor.java new file mode 100644 index 000000000000..1aec72db5be9 --- /dev/null +++ b/core/src/main/java/jenkins/model/IExecutor.java @@ -0,0 +1,144 @@ +/* + * The MIT License + * + * Copyright 2024 CloudBees, Inc. + * + * 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: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.model; + +import edu.umd.cs.findbugs.annotations.CheckForNull; +import hudson.Util; +import hudson.model.Queue; +import hudson.model.queue.WorkUnit; +import jenkins.model.queue.ITask; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.Beta; + +/** + * Interface for an executor that can be displayed in the executors widget. + * + * @since 2.480 + */ +@Restricted(Beta.class) +public interface IExecutor { + /** + * Returns true if this {@link IExecutor} is ready for action. + */ + boolean isIdle(); + + /** + * @return the {@link IComputer} that this executor belongs to. + */ + IComputer getOwner(); + + /** + * @return the current executable, if any. + */ + @CheckForNull Queue.Executable getCurrentExecutable(); + + /** + * Returns the current {@link WorkUnit} (of {@link #getCurrentExecutable() the current executable}) + * that this executor is running. + * + * @return + * null if the executor is idle. + */ + @CheckForNull WorkUnit getCurrentWorkUnit(); + + /** + * @return the current display name of the executor. Usually the name of the executable. + */ + String getDisplayName(); + + /** + * @return a reference to the parent task of the current executable, if any. + */ + @CheckForNull + default ITask getParentTask() { + var currentExecutable = getCurrentExecutable(); + if (currentExecutable == null) { + var workUnit = getCurrentWorkUnit(); + if (workUnit != null) { + return workUnit.work; + } else { + // Idle + return null; + } + } else { + return currentExecutable.getParent(); + } + } + + /** + * Checks if the current user has a permission to stop this build. + */ + boolean hasStopPermission(); + + /** + * Gets the executor number that uniquely identifies it among + * other {@link IExecutor}s for the same computer. + * + * @return + * a sequential number starting from 0. + */ + int getNumber(); + + /** + * Gets the elapsed time since the build has started. + * + * @return + * the number of milliseconds since the build has started. + */ + long getElapsedTime(); + + /** + * Gets the string that says how long since this build has started. + * + * @return + * string like "3 minutes" "1 day" etc. + */ + default String getTimestampString() { + return Util.getTimeSpanString(getElapsedTime()); + } + + /** + * Computes a human-readable text that shows the expected remaining time + * until the build completes. + */ + String getEstimatedRemainingTime(); + + /** + * Returns true if the current build is likely stuck. + * + *

+ * This is a heuristics based approach, but if the build is suspiciously taking for a long time, + * this method returns true. + */ + boolean isLikelyStuck(); + + /** + * Returns the progress of the current build in the number between 0-100. + * + * @return -1 + * if it's impossible to estimate the progress. + */ + int getProgress(); +} diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 705044cd8fa0..bedbea0af7c4 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -656,47 +656,6 @@ private static int getSlaveAgentPortInitialValue(int def) { */ private static final boolean SLAVE_AGENT_PORT_ENFORCE = SystemProperties.getBoolean(Jenkins.class.getName() + ".slaveAgentPortEnforce", false); - /** - * The TCP agent protocols that are explicitly disabled (we store the disabled ones so that newer protocols - * are enabled by default). Will be {@code null} instead of empty to simplify XML format. - * - * @since 2.16 - */ - @CheckForNull - @GuardedBy("this") - private List disabledAgentProtocols; - /** - * @deprecated Just a temporary buffer for XSTream migration code from JENKINS-39465, do not use - */ - @Deprecated - private transient String[] _disabledAgentProtocols; - - /** - * The TCP agent protocols that are {@link AgentProtocol#isOptIn()} and explicitly enabled. - * Will be {@code null} instead of empty to simplify XML format. - * - * @since 2.16 - */ - @CheckForNull - @GuardedBy("this") - private List enabledAgentProtocols; - /** - * @deprecated Just a temporary buffer for XSTream migration code from JENKINS-39465, do not use - */ - @Deprecated - private transient String[] _enabledAgentProtocols; - - /** - * The TCP agent protocols that are enabled. Built from {@link #disabledAgentProtocols} and - * {@link #enabledAgentProtocols}. - * - * @since 2.16 - * @see #setAgentProtocols(Set) - * @see #getAgentProtocols() - */ - @GuardedBy("this") - private transient Set agentProtocols; - /** * Whitespace-separated labels assigned to the built-in node as a {@link Node}. */ @@ -1012,6 +971,7 @@ protected Jenkins(File root, ServletContext context, PluginManager pluginManager adjuncts = new AdjunctManager(getServletContext(), pluginManager.uberClassLoader, "adjuncts/" + SESSION_HASH, TimeUnit.DAYS.toMillis(365)); ClassFilterImpl.register(); + LOGGER.info("Starting version " + getVersion()); // initialization consists of ... executeReactor(is, @@ -1095,18 +1055,6 @@ protected Object readResolve() { if (SLAVE_AGENT_PORT_ENFORCE) { slaveAgentPort = getSlaveAgentPortInitialValue(slaveAgentPort); } - synchronized (this) { - if (disabledAgentProtocols == null && _disabledAgentProtocols != null) { - disabledAgentProtocols = Arrays.asList(_disabledAgentProtocols); - _disabledAgentProtocols = null; - } - if (enabledAgentProtocols == null && _enabledAgentProtocols != null) { - enabledAgentProtocols = Arrays.asList(_enabledAgentProtocols); - _enabledAgentProtocols = null; - } - // Invalidate the protocols cache after the reload - agentProtocols = null; - } // no longer persisted installStateName = null; @@ -1281,81 +1229,15 @@ private void forceSetSlaveAgentPort(int port) throws IOException { */ @NonNull public synchronized Set getAgentProtocols() { - if (agentProtocols == null) { - Set result = new TreeSet<>(); - Set disabled = new TreeSet<>(); - for (String p : Util.fixNull(disabledAgentProtocols)) { - disabled.add(p.trim()); - } - Set enabled = new TreeSet<>(); - for (String p : Util.fixNull(enabledAgentProtocols)) { - enabled.add(p.trim()); - } - for (AgentProtocol p : AgentProtocol.all()) { - String name = p.getName(); - if (name != null && (p.isRequired() - || (!disabled.contains(name) && (!p.isOptIn() || enabled.contains(name))))) { - result.add(name); - } - } - /* - * An empty result is almost never valid, but it can happen due to JENKINS-70206. Since we know the result - * is likely incorrect, at least decline to cache it so that a correct result can be computed later on - * rather than continuing to deliver the incorrect result indefinitely. - */ - if (!result.isEmpty()) { - agentProtocols = result; - } - return result; - } - return agentProtocols; + return AgentProtocol.all().stream().map(AgentProtocol::getName).filter(Objects::nonNull).collect(Collectors.toCollection(TreeSet::new)); } /** - * Sets the enabled agent protocols. - * - * @param protocols the enabled agent protocols. - * @since 2.16 + * @deprecated No longer does anything. */ + @Deprecated public synchronized void setAgentProtocols(@NonNull Set protocols) { - Set disabled = new TreeSet<>(); - Set enabled = new TreeSet<>(); - for (AgentProtocol p : AgentProtocol.all()) { - String name = p.getName(); - if (name != null && !p.isRequired()) { - // we want to record the protocols where the admin has made a conscious decision - // thus, if a protocol is opt-in, we record the admin enabling it - // if a protocol is opt-out, we record the admin disabling it - // We should not transition rapidly from opt-in -> opt-out -> opt-in - // the scenario we want to have work is: - // 1. We introduce a new protocol, it starts off as opt-in. Some admins decide to test and opt-in - // 2. We decide that the protocol is ready for general use. It gets marked as opt-out. Any admins - // that took part in early testing now have their config switched to not mention the new protocol - // at all when they save their config as the protocol is now opt-out. Any admins that want to - // disable it can do so and will have their preference recorded. - // 3. We decide that the protocol needs to be retired. It gets switched back to opt-in. At this point - // the initial opt-in admins, assuming they visited an upgrade to a controller with step 2, will - // have the protocol disabled for them. This is what we want. If they didn't upgrade to a controller - // with step 2, well there is not much we can do to differentiate them from somebody who is upgrading - // from a previous step 3 controller and had needed to keep the protocol turned on. - // - // What we should never do is flip-flop: opt-in -> opt-out -> opt-in -> opt-out as that will basically - // clear any preference that an admin has set, but this should be ok as we only ever will be - // adding new protocols and retiring old ones. - if (p.isOptIn()) { - if (protocols.contains(name)) { - enabled.add(name); - } - } else { - if (!protocols.contains(name)) { - disabled.add(name); - } - } - } - } - disabledAgentProtocols = disabled.isEmpty() ? null : new ArrayList<>(disabled); - enabledAgentProtocols = enabled.isEmpty() ? null : new ArrayList<>(enabled); - agentProtocols = null; + LOGGER.log(Level.WARNING, null, new IllegalStateException("Jenkins.agentProtocols no longer configurable")); } private void launchTcpSlaveAgentListener() throws IOException { @@ -2071,7 +1953,7 @@ public boolean isUpgradedFromBefore(VersionNumber v) { * Gets the read-only list of all {@link Computer}s. */ public Computer[] getComputers() { - return computers.values().stream().sorted(Comparator.comparing(Computer::getName)).toArray(Computer[]::new); + return getComputersCollection().stream().sorted(Comparator.comparing(Computer::getName)).toArray(Computer[]::new); } @CLIResolver @@ -2080,7 +1962,7 @@ public Computer[] getComputers() { || name.equals("(master)")) // backwards compatibility for URLs name = ""; - for (Computer c : computers.values()) { + for (Computer c : getComputersCollection()) { if (c.getName().equals(name)) return c; } @@ -2247,6 +2129,14 @@ protected ConcurrentMap getComputerMap() { return computers; } + /** + * @return the collection of all {@link Computer}s in this instance. + */ + @Restricted(NoExternalUse.class) + public Collection getComputersCollection() { + return computers.values(); + } + /** * Returns all {@link Node}s in the system, excluding {@link Jenkins} instance itself which * represents the built-in node (in other words, this only returns agents). @@ -2479,7 +2369,7 @@ protected Iterable allAsIterable() { protected Computer get(String key) { return getComputer(key); } @Override - protected Collection all() { return computers.values(); } + protected Collection all() { return getComputersCollection(); } }) .add(new CollectionSearchIndex() { // for users @Override @@ -3814,7 +3704,7 @@ private Set> _cleanUpDisconnectComputers(final List errors) final Set> pending = new HashSet<>(); // JENKINS-28840 we know we will be interrupting all the Computers so get the Queue lock once for all Queue.withLock(() -> { - for (Computer c : computers.values()) { + for (Computer c : getComputersCollection()) { try { c.interrupt(); killComputer(c); @@ -4151,7 +4041,7 @@ public synchronized void doConfigExecutorsSubmit(StaplerRequest2 req, StaplerRes updateComputerList(); - rsp.sendRedirect(req.getContextPath() + '/' + toComputer().getUrl()); // back to the computer page + FormApply.success(req.getContextPath() + '/' + toComputer().getUrl()).generateResponse(req, rsp, null); } /** @@ -4659,13 +4549,13 @@ public void generateNotFoundResponse(StaplerRequest2 req, StaplerResponse2 rsp) */ @Deprecated(since = "2.414") public HttpResponse doSafeRestart(StaplerRequest req) throws IOException, ServletException, RestartNotSupportedException { - return doSafeRestart(StaplerRequest.toStaplerRequest2(req), null); + return doSafeRestart(req != null ? StaplerRequest.toStaplerRequest2(req) : null, null); } /** * Queues up a safe restart of Jenkins. Jobs have to finish or pause before it can proceed. No new jobs are accepted. * - * @since 2.414 + * @since 2.475 */ public HttpResponse doSafeRestart(StaplerRequest2 req, @QueryParameter("message") String message) throws IOException, ServletException, RestartNotSupportedException { checkPermission(MANAGE); @@ -4684,6 +4574,20 @@ public HttpResponse doSafeRestart(StaplerRequest2 req, @QueryParameter("message" return HttpResponses.redirectToDot(); } + /** + * @deprecated use {@link #doSafeRestart(StaplerRequest2, String)} + * @since 2.414 + */ + @Deprecated + @StaplerNotDispatchable + public HttpResponse doSafeRestart(StaplerRequest req, @QueryParameter("message") String message) throws IOException, javax.servlet.ServletException, RestartNotSupportedException { + try { + return doSafeRestart(req != null ? StaplerRequest.toStaplerRequest2(req) : null, message); + } catch (ServletException e) { + throw ServletExceptionWrapper.fromJakartaServletException(e); + } + } + private static Lifecycle restartableLifecycle() throws RestartNotSupportedException { if (Main.isUnitTest) { throw new RestartNotSupportedException("Restarting the controller JVM is not supported in JenkinsRule-based tests"); @@ -5476,6 +5380,7 @@ protected MasterComputer() { * Returns "" to match with {@link Jenkins#getNodeName()}. */ @Override + @NonNull public String getName() { return ""; } @@ -5497,6 +5402,7 @@ public String getCaption() { } @Override + @NonNull public String getUrl() { return "computer/(built-in)/"; } @@ -5975,8 +5881,6 @@ public boolean shouldShowStackTrace() { // for backward compatibility with <1.75, recognize the tag name "view" as well. XSTREAM.alias("view", ListView.class); XSTREAM.alias("listView", ListView.class); - XSTREAM.addImplicitArray(Jenkins.class, "_disabledAgentProtocols", "disabledAgentProtocol"); - XSTREAM.addImplicitArray(Jenkins.class, "_enabledAgentProtocols", "enabledAgentProtocol"); XSTREAM2.addCriticalField(Jenkins.class, "securityRealm"); XSTREAM2.addCriticalField(Jenkins.class, "authorizationStrategy"); // this seems to be necessary to force registration of converter early enough diff --git a/core/src/main/java/jenkins/model/ModelObjectWithContextMenu.java b/core/src/main/java/jenkins/model/ModelObjectWithContextMenu.java index f46280fef0c0..11eea481106a 100644 --- a/core/src/main/java/jenkins/model/ModelObjectWithContextMenu.java +++ b/core/src/main/java/jenkins/model/ModelObjectWithContextMenu.java @@ -254,8 +254,20 @@ public ContextMenu add(Node n) { * Adds a computer * * @since 1.513 + * @deprecated use {@link #add(IComputer)} instead. */ + @Deprecated(since = "2.480") public ContextMenu add(Computer c) { + return add((IComputer) c); + } + + /** + * Adds a {@link IComputer} instance. + * @param c the computer to add to the menu + * @return this + * @since 2.480 + */ + public ContextMenu add(IComputer c) { return add(new MenuItem() .withDisplayName(c.getDisplayName()) .withIconClass(c.getIconClassName()) diff --git a/core/src/main/java/jenkins/model/Nodes.java b/core/src/main/java/jenkins/model/Nodes.java index 8f4c0e5eafc6..a01c3fc342b5 100644 --- a/core/src/main/java/jenkins/model/Nodes.java +++ b/core/src/main/java/jenkins/model/Nodes.java @@ -43,10 +43,9 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; +import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.TreeMap; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentMap; @@ -114,26 +113,31 @@ public List getNodes() { * @throws IOException if the new list of nodes could not be persisted. */ public void setNodes(final @NonNull Collection nodes) throws IOException { - Set toRemove = new HashSet<>(); - Queue.withLock(new Runnable() { - @Override - public void run() { - toRemove.addAll(Nodes.this.nodes.keySet()); - for (Node n : nodes) { - final String name = n.getNodeName(); + Map toRemove = new HashMap<>(); + Queue.withLock(() -> { + toRemove.putAll(Nodes.this.nodes); + for (var node : nodes) { + final var name = node.getNodeName(); + var oldNode = toRemove.get(name); + if (oldNode != null) { + NodeListener.fireOnUpdated(oldNode, node); toRemove.remove(name); - Nodes.this.nodes.put(name, n); - n.onLoad(Nodes.this, name); + } else { + NodeListener.fireOnCreated(node); } - Nodes.this.nodes.keySet().removeAll(toRemove); - jenkins.updateComputerList(); - jenkins.trimLabels(); + Nodes.this.nodes.put(name, node); + node.onLoad(Nodes.this, name); } + Nodes.this.nodes.keySet().removeAll(toRemove.keySet()); + jenkins.updateComputerList(); + jenkins.trimLabels(); }); save(); - for (String name : toRemove) { - LOGGER.fine(() -> "deleting " + new File(getRootDir(), name)); - Util.deleteRecursive(new File(getRootDir(), name)); + for (var deletedNode : toRemove.values()) { + NodeListener.fireOnDeleted(deletedNode); + var nodeName = deletedNode.getNodeName(); + LOGGER.fine(() -> "deleting " + new File(getRootDir(), nodeName)); + Util.deleteRecursive(new File(getRootDir(), nodeName)); } } @@ -295,6 +299,7 @@ public void run() { jenkins.trimLabels(node); } NodeListener.fireOnDeleted(node); + SaveableListener.fireOnDeleted(node, getConfigFile(node)); } } diff --git a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java index c73c5cbf80f1..d6329ed13ed5 100644 --- a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java +++ b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java @@ -109,8 +109,8 @@ public void onLoad(ItemGroup parent, String name) throws IOExcep int max = _builds.maxNumberOnDisk(); int next = asJob().getNextBuildNumber(); if (next <= max) { - LOGGER.log(Level.WARNING, "JENKINS-27530: improper nextBuildNumber {0} detected in {1} with highest build number {2}; adjusting", new Object[] {next, asJob(), max}); - asJob().updateNextBuildNumber(max + 1); + LOGGER.log(Level.FINE, "nextBuildNumber {0} detected in {1} with highest build number {2}; adjusting", new Object[] {next, asJob(), max}); + asJob().fastUpdateNextBuildNumber(max + 1); } RunMap currentBuilds = this.builds; if (parent != null) { diff --git a/core/src/main/java/jenkins/model/queue/ITask.java b/core/src/main/java/jenkins/model/queue/ITask.java new file mode 100644 index 000000000000..37b0e62150de --- /dev/null +++ b/core/src/main/java/jenkins/model/queue/ITask.java @@ -0,0 +1,76 @@ +/* + * The MIT License + * + * Copyright 2024 CloudBees, Inc. + * + * 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: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.model.queue; + +import edu.umd.cs.findbugs.annotations.CheckForNull; +import hudson.model.Item; +import hudson.model.ModelObject; +import hudson.security.AccessControlled; + +/** + * A task that can be displayed in the executors widget. + * + * @since 2.480 + */ +public interface ITask extends ModelObject { + /** + * @return {@code true} if the current user can cancel the current task. + * + * NOTE: If you have implemented {@link AccessControlled} this returns by default + * {@code hasPermission(Item.CANCEL)} + */ + default boolean hasAbortPermission() { + if (this instanceof AccessControlled ac) { + return ac.hasPermission(Item.CANCEL); + } + return true; + } + + /** + * @return {@code true} if the current user has read access on the task. + */ + @SuppressWarnings("unused") // jelly + default boolean hasReadPermission() { + if (this instanceof AccessControlled ac) { + return ac.hasPermission(Item.READ); + } + return true; + } + + /** + * @return the full display name of the task. + *

+ * Defaults to the same as {@link #getDisplayName()}. + */ + default String getFullDisplayName() { + return getDisplayName(); + } + + /** + * @return the URL where to reach specifically this task, relative to Jenkins URL. If non-null, must end with '/'. + */ + @CheckForNull + String getUrl(); +} diff --git a/core/src/main/java/jenkins/model/queue/ItemDeletion.java b/core/src/main/java/jenkins/model/queue/ItemDeletion.java index a2d954fbc459..b278f4d24c93 100644 --- a/core/src/main/java/jenkins/model/queue/ItemDeletion.java +++ b/core/src/main/java/jenkins/model/queue/ItemDeletion.java @@ -266,12 +266,10 @@ public static void cancelBuildsInProgress(@NonNull Item initiatingItem) throws F // comparison with executor.getCurrentExecutable() == executable currently should always be // true as we no longer recycle Executors, but safer to future-proof in case we ever // revisit recycling. - if (!entry.getKey().isAlive() + if (!entry.getKey().isActive() || entry.getValue() != entry.getKey().getCurrentExecutable()) { iterator.remove(); } - // I don't know why, but we have to keep interrupting - entry.getKey().interrupt(Result.ABORTED); } Thread.sleep(50L); } diff --git a/core/src/main/java/jenkins/monitor/OperatingSystemEndOfLifeAdminMonitor.java b/core/src/main/java/jenkins/monitor/OperatingSystemEndOfLifeAdminMonitor.java index 0ff40d018225..50cf3c9da6f0 100644 --- a/core/src/main/java/jenkins/monitor/OperatingSystemEndOfLifeAdminMonitor.java +++ b/core/src/main/java/jenkins/monitor/OperatingSystemEndOfLifeAdminMonitor.java @@ -145,7 +145,7 @@ void readOperatingSystemList(String initialOperatingSystemJson) throws IOExcepti } LOGGER.log(Level.FINE, "Matched operating system {0}", name); - if (startDate.isBefore(LocalDate.now())) { + if (!startDate.isAfter(LocalDate.now())) { this.operatingSystemName = name; this.documentationUrl = buildDocumentationUrl(this.operatingSystemName); this.endOfLifeDate = endOfLife.toString(); diff --git a/core/src/main/java/jenkins/security/ExtendedReadRedaction.java b/core/src/main/java/jenkins/security/ExtendedReadRedaction.java new file mode 100644 index 000000000000..7baec1962f48 --- /dev/null +++ b/core/src/main/java/jenkins/security/ExtendedReadRedaction.java @@ -0,0 +1,36 @@ +package jenkins.security; + +import hudson.ExtensionList; +import hudson.ExtensionPoint; + +/** + * Redact {@code config.xml} contents for users with ExtendedRead permission + * while lacking the required Configure permission to see the full unredacted + * configuration. + * + * @see SECURITY-266 + * @see Jenkins Security Advisory 2016-05-11 + * @since 2.479 + */ +public interface ExtendedReadRedaction extends ExtensionPoint { + /** + * Redacts sensitive information from the provided {@code config.xml} file content. + * Input may already have redactions applied; output may be passed through further redactions. + * These methods are expected to retain the basic structure of the XML document contained in input/output strings. + * + * @param configDotXml String representation of (potentially already redacted) config.xml file + * @return Redacted config.xml file content + */ + String apply(String configDotXml); + + static ExtensionList all() { + return ExtensionList.lookup(ExtendedReadRedaction.class); + } + + static String applyAll(String configDotXml) { + for (ExtendedReadRedaction redaction : all()) { + configDotXml = redaction.apply(configDotXml); + } + return configDotXml; + } +} diff --git a/core/src/main/java/jenkins/security/ExtendedReadSecretRedaction.java b/core/src/main/java/jenkins/security/ExtendedReadSecretRedaction.java new file mode 100644 index 000000000000..91a79f354d71 --- /dev/null +++ b/core/src/main/java/jenkins/security/ExtendedReadSecretRedaction.java @@ -0,0 +1,28 @@ +package jenkins.security; + +import hudson.Extension; +import hudson.util.Secret; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +@Restricted(NoExternalUse.class) +@Extension +public class ExtendedReadSecretRedaction implements ExtendedReadRedaction { + + private static final Pattern SECRET_PATTERN = Pattern.compile(">(" + Secret.ENCRYPTED_VALUE_PATTERN + ")<"); + + @Override + public String apply(String configDotXml) { + Matcher matcher = SECRET_PATTERN.matcher(configDotXml); + StringBuilder cleanXml = new StringBuilder(); + while (matcher.find()) { + if (Secret.decrypt(matcher.group(1)) != null) { + matcher.appendReplacement(cleanXml, ">********<"); + } + } + matcher.appendTail(cleanXml); + return cleanXml.toString(); + } +} diff --git a/core/src/main/java/jenkins/security/stapler/TypedFilter.java b/core/src/main/java/jenkins/security/stapler/TypedFilter.java index eabce3b2dfc9..5851c5e47269 100644 --- a/core/src/main/java/jenkins/security/stapler/TypedFilter.java +++ b/core/src/main/java/jenkins/security/stapler/TypedFilter.java @@ -5,8 +5,6 @@ import hudson.ExtensionList; import java.lang.annotation.Annotation; import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import jenkins.util.SystemProperties; @@ -25,8 +23,6 @@ public class TypedFilter implements FieldRef.Filter, FunctionList.Filter { private static final Logger LOGGER = Logger.getLogger(TypedFilter.class.getName()); - private static final Map, Boolean> staplerCache = new HashMap<>(); - private boolean isClassAcceptable(Class clazz) { if (clazz.isArray()) { // special case to allow klass.isArray() dispatcher @@ -46,31 +42,23 @@ private boolean isClassAcceptable(Class clazz) { return false; } } - return SKIP_TYPE_CHECK || isStaplerRelevantCached(clazz); + return SKIP_TYPE_CHECK || isStaplerRelevant.get(clazz); } - private static boolean isStaplerRelevantCached(@NonNull Class clazz) { - if (staplerCache.containsKey(clazz)) { - return staplerCache.get(clazz); + private static final ClassValue isStaplerRelevant = new ClassValue<>() { + @Override + protected Boolean computeValue(Class clazz) { + return isSpecificClassStaplerRelevant(clazz) || isSuperTypesStaplerRelevant(clazz); } - boolean ret = isStaplerRelevant(clazz); - - staplerCache.put(clazz, ret); - return ret; - } - - @Restricted(NoExternalUse.class) - public static boolean isStaplerRelevant(@NonNull Class clazz) { - return isSpecificClassStaplerRelevant(clazz) || isSuperTypesStaplerRelevant(clazz); - } + }; private static boolean isSuperTypesStaplerRelevant(@NonNull Class clazz) { Class superclass = clazz.getSuperclass(); - if (superclass != null && isStaplerRelevantCached(superclass)) { + if (superclass != null && isStaplerRelevant.get(superclass)) { return true; } for (Class interfaceClass : clazz.getInterfaces()) { - if (isStaplerRelevantCached(interfaceClass)) { + if (isStaplerRelevant.get(interfaceClass)) { return true; } } diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java index 54c1402927a9..87eb26daeb4c 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java @@ -137,16 +137,6 @@ private char[] constructPassword() { return "password".toCharArray(); } - @Override - public boolean isOptIn() { - return false; - } - - @Override - public String getDisplayName() { - return Messages.JnlpSlaveAgentProtocol4_displayName(); - } - @Override public String getName() { return "JNLP4-connect"; // matches JnlpProtocol4Handler.getName diff --git a/core/src/main/java/jenkins/widgets/ExecutorsWidget.java b/core/src/main/java/jenkins/widgets/ExecutorsWidget.java index c660d4e03911..3577d21af48b 100644 --- a/core/src/main/java/jenkins/widgets/ExecutorsWidget.java +++ b/core/src/main/java/jenkins/widgets/ExecutorsWidget.java @@ -10,6 +10,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import jenkins.model.IComputer; import jenkins.model.Jenkins; import org.jenkinsci.Symbol; @@ -23,9 +24,9 @@ */ public class ExecutorsWidget extends Widget { private final String ownerUrl; - private final List computers; + private final List computers; - public ExecutorsWidget(@NonNull String ownerUrl, @NonNull List computers) { + public ExecutorsWidget(@NonNull String ownerUrl, @NonNull List computers) { this.ownerUrl = ownerUrl; this.computers = new ArrayList<>(computers); } @@ -35,7 +36,7 @@ protected String getOwnerUrl() { return ownerUrl; } - public List getComputers() { + public List getComputers() { return Collections.unmodifiableList(computers); } @@ -92,7 +93,7 @@ public Class widgetType() { @NonNull @Override public Collection createFor(@NonNull ComputerSet target) { - return List.of(new ExecutorsWidget("computer/", List.of(target.get_all()))); + return List.of(new ExecutorsWidget("computer/", new ArrayList<>(target.getComputers()))); } } } diff --git a/core/src/main/resources/hudson/Messages.properties b/core/src/main/resources/hudson/Messages.properties index 99c77ebbed46..a15f31703cd0 100644 --- a/core/src/main/resources/hudson/Messages.properties +++ b/core/src/main/resources/hudson/Messages.properties @@ -127,7 +127,6 @@ PluginWrapper.Plugin.Has.Dependent=The plugin ''{0}'' has, at least, one depende PluginWrapper.Plugin.Disabled=Plugin ''{0}'' disabled PluginWrapper.NoSuchPlugin=No such plugin found with the name ''{0}'' PluginWrapper.Error.Disabling=There was an error disabling the ''{0}'' plugin. Error: ''{1}'' -TcpSlaveAgentListener.PingAgentProtocol.displayName=Ping protocol ProxyConfigurationManager.DisplayName=Proxy Configuration ProxyConfigurationManager.Description=Configure the http proxy used by Jenkins diff --git a/core/src/main/resources/hudson/Messages_bg.properties b/core/src/main/resources/hudson/Messages_bg.properties index 98b816053e44..e741c7400a06 100644 --- a/core/src/main/resources/hudson/Messages_bg.properties +++ b/core/src/main/resources/hudson/Messages_bg.properties @@ -105,9 +105,6 @@ PluginWrapper.disabledAndObsolete=\ # {0} is disabled. To fix, enable it. PluginWrapper.disabled=\ „{0}“ е изключена. Включете я. -# Ping protocol -TcpSlaveAgentListener.PingAgentProtocol.displayName=\ - Протокол „ping“ # {0} v{1} failed to load. Fix this plugin first. PluginWrapper.failed_to_load_dependency=\ „{0}“, версия {1} не се зареди. Оправете приставката. diff --git a/core/src/main/resources/hudson/Messages_de.properties b/core/src/main/resources/hudson/Messages_de.properties index e4068a20b58a..d524a518cd44 100644 --- a/core/src/main/resources/hudson/Messages_de.properties +++ b/core/src/main/resources/hudson/Messages_de.properties @@ -75,5 +75,3 @@ AboutJenkins.DisplayName=Über Jenkins AboutJenkins.Description=Versions- und Lizenzinformationen anzeigen. Functions.NoExceptionDetails=Keine Details zum Ausnahmefehler - -TcpSlaveAgentListener.PingAgentProtocol.displayName=Ping-Protokoll diff --git a/core/src/main/resources/hudson/Messages_es.properties b/core/src/main/resources/hudson/Messages_es.properties index 298ef23821d8..47d3b400c747 100644 --- a/core/src/main/resources/hudson/Messages_es.properties +++ b/core/src/main/resources/hudson/Messages_es.properties @@ -117,4 +117,3 @@ PluginWrapper.Plugin.Has.Dependant=El plugin {0} tiene, al menos, un plugin depe PluginWrapper.Plugin.Disabled=Plugin {0} deshabilitado PluginWrapper.NoSuchPlugin=No se encuentra un plugin con el nombre {0} PluginWrapper.Error.Disabling=Hubo un error al desactivar el plugin ''{0}''. Error: ''{1}'' -TcpSlaveAgentListener.PingAgentProtocol.displayName=Protocolo ping diff --git a/core/src/main/resources/hudson/Messages_fr.properties b/core/src/main/resources/hudson/Messages_fr.properties index 1e0286deddc5..06e739d3b479 100644 --- a/core/src/main/resources/hudson/Messages_fr.properties +++ b/core/src/main/resources/hudson/Messages_fr.properties @@ -126,4 +126,3 @@ PluginWrapper.Plugin.Has.Dependent=Le plugin "{0}" a au moins un plugin dépenda PluginWrapper.Plugin.Disabled=Plugin "{0}" désactivé PluginWrapper.NoSuchPlugin=Aucun plugin trouvé avec le nom "{0}" PluginWrapper.Error.Disabling=Une erreur a été relevée lors de la désactivation du plugin "{0}". Erreur : "{1}" -TcpSlaveAgentListener.PingAgentProtocol.displayName=Protocole de ping diff --git a/core/src/main/resources/hudson/Messages_it.properties b/core/src/main/resources/hudson/Messages_it.properties index 2747e2d39366..d63200aabd1e 100644 --- a/core/src/main/resources/hudson/Messages_it.properties +++ b/core/src/main/resources/hudson/Messages_it.properties @@ -109,7 +109,6 @@ ProxyConfiguration.MalformedTestUrl=URL di prova {0} malformato. ProxyConfiguration.NonTLSWarning=Jenkins supporta solo l''utilizzo di una connessione http al proxy. Le credenziali potrebbero essere esposte a qualcuno sulla stessa rete. ProxyConfiguration.Success=Connessione riuscita (codice {0}) ProxyConfiguration.TestUrlRequired=È richiesto un URL di prova. -TcpSlaveAgentListener.PingAgentProtocol.displayName=Protocollo ping Util.day={0} g Util.hour={0} h Util.millisecond={0} ms diff --git a/core/src/main/resources/hudson/Messages_pt_BR.properties b/core/src/main/resources/hudson/Messages_pt_BR.properties index 0a809578524e..d67bdcba599c 100644 --- a/core/src/main/resources/hudson/Messages_pt_BR.properties +++ b/core/src/main/resources/hudson/Messages_pt_BR.properties @@ -57,7 +57,6 @@ PluginWrapper.missing=Não foi possível encontrar {0} v{1}. Para corrigir, inst Functions.NoExceptionDetails=Sem detalhes da exception FilePath.validateAntFileMask.whitespaceSeparator=Espaços em branco não podem mais serem utilizados como separador. Por \ favor use ", " como separadores. -TcpSlaveAgentListener.PingAgentProtocol.displayName=Protocolo de ping PluginWrapper.PluginWrapperAdministrativeMonitor.DisplayName=Falha ao carregar a extensão ProxyConfiguration.MalformedTestUrl=URL de teste {0} inválida. FilePath.TildaDoesntWork="~" é suportado apenas em um shell Unix e em nenhum outro lugar. diff --git a/core/src/main/resources/hudson/Messages_sr.properties b/core/src/main/resources/hudson/Messages_sr.properties index 3c266c5d67a3..414a84b3a41b 100644 --- a/core/src/main/resources/hudson/Messages_sr.properties +++ b/core/src/main/resources/hudson/Messages_sr.properties @@ -40,4 +40,3 @@ PluginWrapper.disabledAndObsolete={0}, верзија {1} је онемогућ PluginWrapper.disabled={0}, верзија {1} је онемогућено. Молимо вас, омогућите ову модулу. PluginWrapper.obsolete={0}, верзија {1} је старије него што је подржано. Инсталирајте верзију {2} или новије. PluginWrapper.obsoleteCore=Морате ажурирати Jenkins са верзије {0} на {1} или новије да би могли користити ову модулу. -TcpSlaveAgentListener.PingAgentProtocol.displayName=Протокол 'ping' diff --git a/core/src/main/resources/hudson/Messages_sv_SE.properties b/core/src/main/resources/hudson/Messages_sv_SE.properties index fdfa6ee3a524..f4a977e99098 100644 --- a/core/src/main/resources/hudson/Messages_sv_SE.properties +++ b/core/src/main/resources/hudson/Messages_sv_SE.properties @@ -125,7 +125,6 @@ PluginWrapper.Plugin.Has.Dependent=Insticksprogrammet ''{0}'' har minst ett bero PluginWrapper.Plugin.Disabled=Insticksprogrammet ''{0}'' inaktiverades PluginWrapper.NoSuchPlugin=Inget insticksprogram med namnet ''{0}'' hittades PluginWrapper.Error.Disabling=Ett fel uppstod när insticksprogrammet ''{0}'' inaktiverades. Fel: ''{1}'' -TcpSlaveAgentListener.PingAgentProtocol.displayName=Ping-protokoll ProxyConfigurationManager.DisplayName=Proxykonfiguration ProxyConfigurationManager.Description=Konfigurera http-proxyn som Jenkins använder diff --git a/core/src/main/resources/hudson/Messages_zh_TW.properties b/core/src/main/resources/hudson/Messages_zh_TW.properties index 708613e7e603..cc5fb76cb059 100644 --- a/core/src/main/resources/hudson/Messages_zh_TW.properties +++ b/core/src/main/resources/hudson/Messages_zh_TW.properties @@ -96,7 +96,6 @@ PluginWrapper.Plugin.Has.Dependent=外掛「{0}」有至少一個相依性外掛 PluginWrapper.Plugin.Disabled=已停用外掛「{0}」 PluginWrapper.NoSuchPlugin=找不到名為「{0}」的外掛 PluginWrapper.Error.Disabling=停用外掛「{0}」時發生錯誤,錯誤\: 「{1}」 -TcpSlaveAgentListener.PingAgentProtocol.displayName=Ping 協定 PluginManager.emptyUpdateSiteUrl=更新站台網址不得為空,請輸入網址 PluginManager.connectionFailed=無法連線至這個URL diff --git a/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_tr.properties b/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_tr.properties index 2ac4acc9ebbe..2de2187639d5 100644 --- a/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_tr.properties +++ b/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_tr.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -More\ Info=Daha fazla Bilgi +More\ Info=Daha Fazla Bilgi blurb=Ters vekil sunucu yapılandırmanız bozuk görünüyor. diff --git a/core/src/main/resources/hudson/logging/LogRecorder/configure.jelly b/core/src/main/resources/hudson/logging/LogRecorder/configure.jelly index b49ccc278858..ef7c6f3781b2 100644 --- a/core/src/main/resources/hudson/logging/LogRecorder/configure.jelly +++ b/core/src/main/resources/hudson/logging/LogRecorder/configure.jelly @@ -66,12 +66,8 @@ THE SOFTWARE. - - - - + - diff --git a/core/src/main/resources/hudson/model/AllView/noJob_tr.properties b/core/src/main/resources/hudson/model/AllView/noJob_tr.properties index f11e7258733e..31dd63cf187c 100644 --- a/core/src/main/resources/hudson/model/AllView/noJob_tr.properties +++ b/core/src/main/resources/hudson/model/AllView/noJob_tr.properties @@ -29,6 +29,7 @@ setUpDistributedBuilds=Dağıtılmış bir yapılandırma kurun setUpAgent=Bir ajan kur setUpCloud=Bir bulut ayarla learnMoreDistributedBuilds=Dağıtılmış yapılandırmalar hakkında daha fazla bilgi edinin +thisFolderIsEmpty=Bu klasör boş startBuilding=Yazılım projenizi yapılandırmaya başlayın diff --git a/core/src/main/resources/hudson/model/Computer/configure.jelly b/core/src/main/resources/hudson/model/Computer/configure.jelly index bd33078013cd..ce76f5fb2d3b 100644 --- a/core/src/main/resources/hudson/model/Computer/configure.jelly +++ b/core/src/main/resources/hudson/model/Computer/configure.jelly @@ -46,15 +46,8 @@ THE SOFTWARE. - - - - - + - - - diff --git a/core/src/main/resources/hudson/model/Computer/setOfflineCause.jelly b/core/src/main/resources/hudson/model/Computer/setOfflineCause.jelly index 587057a464e1..8bac3c7e27c7 100644 --- a/core/src/main/resources/hudson/model/Computer/setOfflineCause.jelly +++ b/core/src/main/resources/hudson/model/Computer/setOfflineCause.jelly @@ -34,7 +34,7 @@ THE SOFTWARE. ${%blurb}

- +

diff --git a/core/src/main/resources/hudson/model/Computer/sidepanel_tr.properties b/core/src/main/resources/hudson/model/Computer/sidepanel_tr.properties index a96d29188a81..30694a2d05e4 100644 --- a/core/src/main/resources/hudson/model/Computer/sidepanel_tr.properties +++ b/core/src/main/resources/hudson/model/Computer/sidepanel_tr.properties @@ -23,6 +23,6 @@ Back\ to\ List=Listeye Dön Build\ History=Yapılandırma Geçmişi Configure=Yapılandır -Load\ Statistics=Yüklenme istatistikleri +Load\ Statistics=Yük İstatistikleri Script\ Console=Script Konsolu Status=Durum diff --git a/core/src/main/resources/hudson/model/ComputerSet/_legend.jelly b/core/src/main/resources/hudson/model/ComputerSet/_legend.jelly index 07871a6fe5f1..1668323aa584 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/_legend.jelly +++ b/core/src/main/resources/hudson/model/ComputerSet/_legend.jelly @@ -10,6 +10,13 @@ ${%online} +
+ +
+
+ ${%paused} +
+
diff --git a/core/src/main/resources/hudson/model/ComputerSet/_legend.properties b/core/src/main/resources/hudson/model/ComputerSet/_legend.properties index 075df2f8a1c4..223ac506677e 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/_legend.properties +++ b/core/src/main/resources/hudson/model/ComputerSet/_legend.properties @@ -6,6 +6,7 @@ not-accepting=The agent is not accepting tasks for execution. This usually means the time window. The agent might still execute tasks that have started while it was accepting tasks. Cloud agents that are \ intended to run only a single task might also use this.
\ Agents will be shown as suspended in the Build Executor Status widgets. +paused=The agent has been put offline due to the configured retention strategy. It will be brought back online when needed (e.g. a new task requests it). offline=None of the above conditions applies. The agent is not connected or it is still connected but a node monitor decided \ that the agent is not in a healthy state. An agent in this state should be investigated. Legend=Icon legend diff --git a/core/src/main/resources/hudson/model/ComputerSet/configure.jelly b/core/src/main/resources/hudson/model/ComputerSet/configure.jelly index 9e58aeda59e6..3483113b0fb4 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/configure.jelly +++ b/core/src/main/resources/hudson/model/ComputerSet/configure.jelly @@ -45,14 +45,8 @@ THE SOFTWARE. instances="${it.monitors}" forceRowSet="true"/> - - - - - - + - diff --git a/core/src/main/resources/hudson/model/ComputerSet/index.jelly b/core/src/main/resources/hudson/model/ComputerSet/index.jelly index f261e1f3f8cd..5e957e2bd9c0 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/index.jelly +++ b/core/src/main/resources/hudson/model/ComputerSet/index.jelly @@ -72,12 +72,12 @@ THE SOFTWARE. - - + +
- +
@@ -93,7 +93,7 @@ THE SOFTWARE.
- +
diff --git a/core/src/main/resources/hudson/model/ComputerSet/index_tr.properties b/core/src/main/resources/hudson/model/ComputerSet/index_tr.properties new file mode 100644 index 000000000000..0434bbae3c0e --- /dev/null +++ b/core/src/main/resources/hudson/model/ComputerSet/index_tr.properties @@ -0,0 +1,4 @@ +Nodes=Sunucular +New\ Node=Yeni Sunucu +Name=İsim +Data\ obtained=Son güncelleme diff --git a/core/src/main/resources/hudson/model/ComputerSet/new_tr.properties b/core/src/main/resources/hudson/model/ComputerSet/new_tr.properties new file mode 100644 index 000000000000..921759b8e7ef --- /dev/null +++ b/core/src/main/resources/hudson/model/ComputerSet/new_tr.properties @@ -0,0 +1,2 @@ +New\ node=Yeni sunucu +Node\ name=Sunucu ismi diff --git a/core/src/main/resources/hudson/model/ComputerSet/sidepanel_tr.properties b/core/src/main/resources/hudson/model/ComputerSet/sidepanel_tr.properties index ec93e331bfed..f4761cfdc026 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/sidepanel_tr.properties +++ b/core/src/main/resources/hudson/model/ComputerSet/sidepanel_tr.properties @@ -22,3 +22,5 @@ Back\ to\ Dashboard=Kontrol Merkezi'ne Dön Manage\ Jenkins=Jenkins''i Yönet +Nodes=Sunucular +Clouds=Bulutlar diff --git a/core/src/main/resources/hudson/model/Job/configure.jelly b/core/src/main/resources/hudson/model/Job/configure.jelly index d226a966558d..3d347a863945 100644 --- a/core/src/main/resources/hudson/model/Job/configure.jelly +++ b/core/src/main/resources/hudson/model/Job/configure.jelly @@ -63,16 +63,8 @@ THE SOFTWARE. - - - - - - + - - - diff --git a/core/src/main/resources/hudson/model/ListView/configure-entries-resources.js b/core/src/main/resources/hudson/model/ListView/configure-entries-resources.js index 86ccbb6447a7..f9db2d067478 100644 --- a/core/src/main/resources/hudson/model/ListView/configure-entries-resources.js +++ b/core/src/main/resources/hudson/model/ListView/configure-entries-resources.js @@ -1,5 +1,8 @@ Behaviour.specify("#recurse", "ListView", 0, function (e) { - var nestedElements = document.querySelectorAll("SPAN.nested"); + // SPAN.nested is kept for backwards compatability + var nestedElements = document.querySelectorAll( + ".listview-jobs--nested, SPAN.nested", + ); e.onclick = function () { nestedElements.forEach(function (el) { el.style.display = e.checked ? "" : "none"; diff --git a/core/src/main/resources/hudson/model/ListView/configure-entries.jelly b/core/src/main/resources/hudson/model/ListView/configure-entries.jelly index 5cffab5e11ee..350235870b01 100644 --- a/core/src/main/resources/hudson/model/ListView/configure-entries.jelly +++ b/core/src/main/resources/hudson/model/ListView/configure-entries.jelly @@ -27,49 +27,51 @@ THE SOFTWARE. + + + + - - - - - - - -
- - - - - - + + + + +
+ + + +
- - -
-
-
-
-
+ + - - - + +
+ + + +
-
+ + + + + + +
- + - +
+ + - - - - - - -
diff --git a/core/src/main/resources/hudson/model/ListView/configure-entries.properties b/core/src/main/resources/hudson/model/ListView/configure-entries.properties new file mode 100644 index 000000000000..fb58880346b9 --- /dev/null +++ b/core/src/main/resources/hudson/model/ListView/configure-entries.properties @@ -0,0 +1,3 @@ +jobs.description=Select the jobs to show in this view. +filters.description=Filter the jobs that show in this view based on specific conditions. +columns.description=Select the columns in this view. diff --git a/core/src/main/resources/hudson/model/Messages_tr.properties b/core/src/main/resources/hudson/model/Messages_tr.properties index 75399955f2e6..4d9ae97b7bd8 100644 --- a/core/src/main/resources/hudson/model/Messages_tr.properties +++ b/core/src/main/resources/hudson/model/Messages_tr.properties @@ -48,6 +48,8 @@ BallColor.Pending=Bekliyor BallColor.Success=Başarılı BallColor.Unstable=Dengesiz +ComputerSet.DisplayName=Sunucular + Executor.NotAvailable=Mevcut Değil FreeStyleProject.DisplayName=Serbest stil proje diff --git a/core/src/main/resources/hudson/model/Run/configure.jelly b/core/src/main/resources/hudson/model/Run/configure.jelly index edc2a24e904e..ff2bc3f09944 100644 --- a/core/src/main/resources/hudson/model/Run/configure.jelly +++ b/core/src/main/resources/hudson/model/Run/configure.jelly @@ -38,17 +38,8 @@ THE SOFTWARE. - - - - - - - + - - - diff --git a/core/src/main/resources/hudson/model/Run/delete.jelly b/core/src/main/resources/hudson/model/Run/delete.jelly index 83e3cbd77e71..7443203f2650 100644 --- a/core/src/main/resources/hudson/model/Run/delete.jelly +++ b/core/src/main/resources/hudson/model/Run/delete.jelly @@ -27,7 +27,7 @@ THE SOFTWARE. --> - + diff --git a/core/src/main/resources/hudson/model/View/configure.jelly b/core/src/main/resources/hudson/model/View/configure.jelly index beceff8230ab..1d47dd542287 100644 --- a/core/src/main/resources/hudson/model/View/configure.jelly +++ b/core/src/main/resources/hudson/model/View/configure.jelly @@ -29,25 +29,25 @@ THE SOFTWARE. - + + + + + - - - - - - - - - - - - - + + + + + + + + + @@ -55,12 +55,19 @@ THE SOFTWARE. - - - - + + + + + + + + + + - diff --git a/core/src/main/resources/hudson/model/View/configure.properties b/core/src/main/resources/hudson/model/View/configure.properties new file mode 100644 index 000000000000..f5883d65a59e --- /dev/null +++ b/core/src/main/resources/hudson/model/View/configure.properties @@ -0,0 +1,4 @@ +description.description=Describe the purpose of this view. +widgets.description=Customize the widgets that show in this view. +widgets.filterqueue.description=If checked, only jobs in this view will be shown in the queue. +widgets.filterexecutors.description=If checked, only those build executors will be shown that could execute the jobs in this view. diff --git a/core/src/main/resources/hudson/model/userproperty/Messages_tr.properties b/core/src/main/resources/hudson/model/userproperty/Messages_tr.properties new file mode 100644 index 000000000000..8144297c655b --- /dev/null +++ b/core/src/main/resources/hudson/model/userproperty/Messages_tr.properties @@ -0,0 +1,13 @@ +UserPropertyCategory.Account.DisplayName=Hesap +UserPropertyCategory.Appearance.DisplayName=Görünüm +UserPropertyCategory.Experimental.DisplayName=Deneyler +UserPropertyCategory.Invisible.DisplayName=Görünmez +UserPropertyCategory.Preferences.DisplayName=Tercihler +UserPropertyCategory.Unclassified.DisplayName=Sınıflandırılmamış +UserPropertyCategory.Security.DisplayName=Güvenlik + +UserPropertyCategoryAccountAction.DisplayName=Hesap +UserPropertyCategoryAppearanceAction.DisplayName=Görünüm +UserPropertyCategoryExperimentalAction.DisplayName=Deneyler +UserPropertyCategoryPreferencesAction.DisplayName=Tercihler +UserPropertyCategorySecurityAction.DisplayName=Güvenlik diff --git a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryAccountAction/index.jelly b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryAccountAction/index.jelly index c6b458cecfe9..006458e02048 100644 --- a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryAccountAction/index.jelly +++ b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryAccountAction/index.jelly @@ -62,11 +62,8 @@ THE SOFTWARE. - - - - - + + diff --git a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryAccountAction/index_tr.properties b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryAccountAction/index_tr.properties index ead6d67dee06..14b810099914 100644 --- a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryAccountAction/index_tr.properties +++ b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryAccountAction/index_tr.properties @@ -20,6 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +title=Hesap Full\ name=İsminiz Description=Açıklama Save=Kaydet diff --git a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryAppearanceAction/index.jelly b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryAppearanceAction/index.jelly index 0d90ad4b2d76..eeceeb7eee0c 100644 --- a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryAppearanceAction/index.jelly +++ b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryAppearanceAction/index.jelly @@ -62,11 +62,8 @@ THE SOFTWARE.
- - - - - + + diff --git a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryAppearanceAction/index_tr.properties b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryAppearanceAction/index_tr.properties new file mode 100644 index 000000000000..f9e350543d71 --- /dev/null +++ b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryAppearanceAction/index_tr.properties @@ -0,0 +1,2 @@ +title=Görünüm +warningNoItems=Yapılandırılacak görünüm öğesi yok. diff --git a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryExperimentalAction/index.jelly b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryExperimentalAction/index.jelly index 0d90ad4b2d76..eeceeb7eee0c 100644 --- a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryExperimentalAction/index.jelly +++ b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryExperimentalAction/index.jelly @@ -62,11 +62,8 @@ THE SOFTWARE. - - - - - + + diff --git a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryExperimentalAction/index_tr.properties b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryExperimentalAction/index_tr.properties new file mode 100644 index 000000000000..b645842a1872 --- /dev/null +++ b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryExperimentalAction/index_tr.properties @@ -0,0 +1,2 @@ +title=Deneyler +warningNoItems=Şu anda herhangi bir deney mevcut değil. diff --git a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryPreferencesAction/index.jelly b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryPreferencesAction/index.jelly index 6971e5abf8d0..ea96f1bc39e8 100644 --- a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryPreferencesAction/index.jelly +++ b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryPreferencesAction/index.jelly @@ -62,11 +62,8 @@ THE SOFTWARE. - - - - - + + diff --git a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryPreferencesAction/index_tr.properties b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryPreferencesAction/index_tr.properties new file mode 100644 index 000000000000..5108f7b2cc0b --- /dev/null +++ b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategoryPreferencesAction/index_tr.properties @@ -0,0 +1,2 @@ +title=Tercihler +warningNoItems=Tercih bulunamadı. diff --git a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategorySecurityAction/index.jelly b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategorySecurityAction/index.jelly index 0d90501fbbb0..a50387704139 100644 --- a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategorySecurityAction/index.jelly +++ b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategorySecurityAction/index.jelly @@ -64,10 +64,7 @@ THE SOFTWARE. - - - - + diff --git a/core/src/main/resources/hudson/model/userproperty/UserPropertyCategorySecurityAction/index_tr.properties b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategorySecurityAction/index_tr.properties new file mode 100644 index 000000000000..21a255c0268e --- /dev/null +++ b/core/src/main/resources/hudson/model/userproperty/UserPropertyCategorySecurityAction/index_tr.properties @@ -0,0 +1,2 @@ +title=Güvenlik +warningNoItems=Güvenlik yapılandırması mevcut değil. diff --git a/core/src/main/resources/hudson/node_monitors/Messages_tr.properties b/core/src/main/resources/hudson/node_monitors/Messages_tr.properties index a58be1787e59..0ac3946dc2c0 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages_tr.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages_tr.properties @@ -22,4 +22,7 @@ ArchitectureMonitor.DisplayName=Mimari ClockMonitor.DisplayName=Saat Farkı -DiskSpaceMonitor.DisplayName=Diskteki Boş Alan +DiskSpaceMonitor.DisplayName=Boş Disk Alanı +SwapSpaceMonitor.DisplayName=Boş Swap Alanı +TemporarySpaceMonitor.DisplayName=Boş Temp Alanı +ResponseTimeMonitor.DisplayName=Tepki Süresi diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-agentProtocol.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-agentProtocol.html deleted file mode 100644 index 01bcd8d3b24b..000000000000 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-agentProtocol.html +++ /dev/null @@ -1,4 +0,0 @@ -
- Jenkins uses a TCP port to communicate with various remote agents. This option - allows control over which agent protocols are enabled. -
diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-agentProtocol_bg.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-agentProtocol_bg.html deleted file mode 100644 index 41852a0729a8..000000000000 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-agentProtocol_bg.html +++ /dev/null @@ -1,4 +0,0 @@ -
- Jenkins използва порт па TCP, за да комуникира с подчинените компютри. Тази - опция задава кои протоколи за връзка са включени. -
diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-agentProtocol_it.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-agentProtocol_it.html deleted file mode 100644 index 2adbe90a72a1..000000000000 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-agentProtocol_it.html +++ /dev/null @@ -1,4 +0,0 @@ -
- Jenkins utilizza una porta TCP per comunicare con vari agenti remoti. - Quest'opzione consente di controllare i vari protocolli agente abilitati. -
diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-agentProtocol_sv_SE.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-agentProtocol_sv_SE.html deleted file mode 100644 index adf57097bb6f..000000000000 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-agentProtocol_sv_SE.html +++ /dev/null @@ -1,5 +0,0 @@ -
- Jenkins använder en TCP-port för att kommunicera med olika fjärragenter. Det - här alternativet gör det möjligt att kontrollera vilka agentprotokoll som är - aktiverade. -
diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy index 2abc4e795cc0..9c3c80607ca8 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy @@ -3,7 +3,6 @@ package hudson.security.GlobalSecurityConfiguration import hudson.security.SecurityRealm import hudson.markup.MarkupFormatterDescriptor import hudson.security.AuthorizationStrategy -import jenkins.AgentProtocol import hudson.Functions import hudson.model.Descriptor @@ -51,33 +50,6 @@ l.layout(permission:app.SYSTEM_READ, title:my.displayName, cssclass:request.getP f.serverTcpPort() } } - f.advanced(title: _("Agent protocols"), align:"left") { - f.entry(title: _("Agent protocols"), help: '/descriptor/hudson.security.GlobalSecurityConfiguration/help/agentProtocol') { - def agentProtocols = my.agentProtocols - div() { - for (AgentProtocol p : AgentProtocol.all()) { - if (p.name != null && !p.required) { - f.block() { - f.checkbox(name: "agentProtocol", - title: p.displayName, - checked: agentProtocols.contains(p.name), - json: p.name) - } - div(class: "tr") { - div(class:"setting-description"){ - st.include(from:p, page: "description", optional:true) - if (p.deprecated) { - br() - text(b(_("Deprecated. "))) - st.include(from:p, page: "deprecationCause", optional:true) - } - } - } - } - } - } - } - } } Functions.getSortedDescriptorsForGlobalConfigByDescriptor(my.FILTER).each { Descriptor descriptor -> diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_it.properties b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_it.properties index 9b343aab6b5e..ba6cf0fe694f 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_it.properties +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_it.properties @@ -25,7 +25,6 @@ Agent\ protocols=Protocolli agente Agents=Agenti Authentication=Autenticazione Authorization=Autorizzazione -Deprecated.\ =Deprecato. Disable\ remember\ me=Disabilita "Ricordami" LOADING=Caricamento in corso Markup\ Formatter=Componente formattazione markup diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_tr.properties b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_tr.properties index 1b12b9eb167c..7f79912af880 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_tr.properties +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_tr.properties @@ -20,8 +20,9 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +Authentication=Kimlik Doğrulama Disable\ remember\ me=Beni hatırla özelliğini devre dışı bırak -Markup\ Formatter= +Markup\ Formatter=Metin Formatlayıcısı Access\ Control=Erişim Kontrolü Security\ Realm=Güvenlik Alanı Authorization=Yetkilendirme diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser_tr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser_tr.properties new file mode 100644 index 000000000000..73adeed2eeaf --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser_tr.properties @@ -0,0 +1 @@ +Create\ First\ Admin\ User=İlk Yönetici Kullanıcıyı Oluştur diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success_tr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success_tr.properties new file mode 100644 index 000000000000..2320478a1e6c --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success_tr.properties @@ -0,0 +1,2 @@ +Success=Tebrikler +description=Giriş yaptınız.
Ana sayfaya geri dönün. diff --git a/core/src/main/resources/hudson/security/Messages_tr.properties b/core/src/main/resources/hudson/security/Messages_tr.properties index eefcbfd2ea1c..b3303fcafc21 100644 --- a/core/src/main/resources/hudson/security/Messages_tr.properties +++ b/core/src/main/resources/hudson/security/Messages_tr.properties @@ -22,7 +22,7 @@ GlobalSecurityConfiguration.DisplayName=Güvenlik GlobalSecurityConfiguration.Description=Jenkins''i güvenli hale getir; sisteme erişim izni olanları belirle. -LegacyAuthorizationStrategy.DisplayName=Miras modu +LegacyAuthorizationStrategy.DisplayName=Eski yöntem HudsonPrivateSecurityRealm.DisplayName=Jenkins''in kendi kullanıcı veritabanı HudsonPrivateSecurityRealm.Details.DisplayName=Şifre @@ -32,7 +32,15 @@ HudsonPrivateSecurityRealm.Details.PasswordError=\ HudsonPrivateSecurityRealm.ManageUserLinks.DisplayName=Kullanıcılar HudsonPrivateSecurityRealm.ManageUserLinks.Description=Jenkins''de oturum açabilecek kullanıcıları oluşturun, silin veya değiştirin. +FullControlOnceLoggedInAuthorizationStrategy.DisplayName=Giriş yapmış kullanıcılar her şeyi yapabilir + +AuthorizationStrategy.DisplayName=Herkes her şeyi yapabilir + +LegacySecurityRealm.Displayname=Servlet konteynerine devredin + UserDetailsServiceProxy.UnableToQuery=Kullanıcı bilgisi alınamıyor: {0} # not in use Permission.Permissions.Title=Mevcut Değil + +NoneSecurityRealm.DisplayName=Hiçbiri diff --git a/core/src/main/resources/hudson/slaves/Cloud/configure.jelly b/core/src/main/resources/hudson/slaves/Cloud/configure.jelly index f7479a743176..acb1e2d980fa 100644 --- a/core/src/main/resources/hudson/slaves/Cloud/configure.jelly +++ b/core/src/main/resources/hudson/slaves/Cloud/configure.jelly @@ -37,15 +37,8 @@ THE SOFTWARE. - - - - - + - - - diff --git a/core/src/main/resources/hudson/slaves/JNLPLauncher/main.jelly b/core/src/main/resources/hudson/slaves/JNLPLauncher/main.jelly index 2f211d16feae..ad9184473224 100644 --- a/core/src/main/resources/hudson/slaves/JNLPLauncher/main.jelly +++ b/core/src/main/resources/hudson/slaves/JNLPLauncher/main.jelly @@ -53,26 +53,26 @@ ${copy_java_cmd_secret_unix} ${copy_agent_jar_windows} ${copy_java_cmd_secret_windows} - - + +

${%slaveAgent.cli.run.secret} (Unix) - +

-${copy_secret_to_file}
+${copy_secret_to_file_unix}
 ${copy_agent_jar_unix}
 ${copy_java_cmd_secret2_unix}
 

${%slaveAgent.cli.run.secret} (Windows) - +

-${copy_secret_to_file}
+${copy_secret_to_file_windows}
 ${copy_agent_jar_windows}
 ${copy_java_cmd_secret2_windows}
 
diff --git a/core/src/main/resources/hudson/slaves/Messages.properties b/core/src/main/resources/hudson/slaves/Messages.properties index 5c95fd0df998..7dbd6e8a1909 100644 --- a/core/src/main/resources/hudson/slaves/Messages.properties +++ b/core/src/main/resources/hudson/slaves/Messages.properties @@ -42,3 +42,4 @@ ComputerLauncher.JavaVersionResult={0} -version returned {1}. ComputerLauncher.UnknownJavaVersion=Couldn’t figure out the Java version of {0} Cloud.ProvisionPermission.Description=Provision new nodes Cloud.RequiredName=Cloud must have a unique non-empty name. +SimpleScheduledRetentionStrategy.ScheduledOfflineCause.displayName=Offline according to schedule diff --git a/core/src/main/resources/hudson/slaves/Messages_tr.properties b/core/src/main/resources/hudson/slaves/Messages_tr.properties index 3f09ef711a25..061c5c7a2ff7 100644 --- a/core/src/main/resources/hudson/slaves/Messages_tr.properties +++ b/core/src/main/resources/hudson/slaves/Messages_tr.properties @@ -1 +1,2 @@ +DumbSlave.displayName=Kalıcı Ajan EnvironmentVariablesNodeProperty.displayName=Ortam değişkenleri diff --git a/core/src/main/resources/hudson/slaves/OfflineCause/cause.jelly b/core/src/main/resources/hudson/slaves/OfflineCause/cause.jelly index 51a05a144aaf..e2457c8ae2bc 100644 --- a/core/src/main/resources/hudson/slaves/OfflineCause/cause.jelly +++ b/core/src/main/resources/hudson/slaves/OfflineCause/cause.jelly @@ -24,12 +24,12 @@ THE SOFTWARE. -
+
- ${it} +
diff --git a/core/src/main/resources/hudson/tasks/Shell/config.groovy b/core/src/main/resources/hudson/tasks/Shell/config.groovy index f895ffe88f3e..bfd163196917 100644 --- a/core/src/main/resources/hudson/tasks/Shell/config.groovy +++ b/core/src/main/resources/hudson/tasks/Shell/config.groovy @@ -25,7 +25,7 @@ package hudson.tasks.Shell f=namespace(lib.FormTagLib) f.entry(title:_("Command"),description:_("description",rootURL)) { - f.textarea(name: "command", value: instance?.command, class: "fixed-width", 'codemirror-mode': 'shell', 'codemirror-config': "mode: 'text/x-sh'") + f.textarea(name: "command", value: instance?.command, class: "fixed-width", 'codemirror-mode': 'shell', 'codemirror-config': '"mode": "text/x-sh"') } f.advanced() { diff --git a/core/src/main/resources/hudson/util/Messages_tr.properties b/core/src/main/resources/hudson/util/Messages_tr.properties new file mode 100644 index 000000000000..1df20672d1a6 --- /dev/null +++ b/core/src/main/resources/hudson/util/Messages_tr.properties @@ -0,0 +1 @@ +ClockDifference.InSync=Senkronize diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column.jelly b/core/src/main/resources/hudson/views/BuildButtonColumn/column.jelly index 8cced8eccbda..ce12897c5efa 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column.jelly +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column.jelly @@ -37,7 +37,10 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column.properties index bf14a6abb2db..86d64eaaf683 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column.properties @@ -23,3 +23,4 @@ Task_scheduled={0} scheduled Schedule_a_task=Schedule a {1} for {0} Schedule_a_task_with_parameters=Schedule a {1} with parameters for {0} +Task_schedule_failed=Failed to schedule build for {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/icon.js b/core/src/main/resources/hudson/views/BuildButtonColumn/icon.js index 80977933eaaa..936c87b0766a 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/icon.js +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/icon.js @@ -5,6 +5,7 @@ Behaviour.specify( function (e) { var url = e.getAttribute("data-url"); var message = e.getAttribute("data-notification"); + var failure = e.getAttribute("data-failure"); var id = e.getAttribute("data-id"); var icon = document.getElementById(id); @@ -12,8 +13,13 @@ Behaviour.specify( fetch(url, { method: "post", headers: crumb.wrap({}), + }).then((rsp) => { + if (rsp.ok) { + notificationBar.show(message, notificationBar.SUCCESS); + } else { + notificationBar.show(failure, notificationBar.ERROR); + } }); - hoverNotification(message, this, -100); return false; }; }, diff --git a/core/src/main/resources/jenkins/agents/CloudSet/index.jelly b/core/src/main/resources/jenkins/agents/CloudSet/index.jelly index f0d1fa0f9c69..3bf3f0183e44 100644 --- a/core/src/main/resources/jenkins/agents/CloudSet/index.jelly +++ b/core/src/main/resources/jenkins/agents/CloudSet/index.jelly @@ -35,6 +35,7 @@ THE SOFTWARE. + diff --git a/core/src/main/resources/jenkins/agents/Messages.properties b/core/src/main/resources/jenkins/agents/Messages.properties index 11a27f40642c..468a77f88db8 100644 --- a/core/src/main/resources/jenkins/agents/Messages.properties +++ b/core/src/main/resources/jenkins/agents/Messages.properties @@ -4,3 +4,4 @@ CloudSet.SpecifyCloudToCopy=Specify which cloud to copy CloudSet.NoSuchCloud=No such cloud: {0} CloudsLink.DisplayName=Clouds CloudsLink.Description=Add, remove, and configure cloud instances to provision agents on-demand. +IOfflineCause.offline=Offline diff --git a/core/src/main/resources/jenkins/agents/Messages_bg.properties b/core/src/main/resources/jenkins/agents/Messages_bg.properties new file mode 100644 index 000000000000..854f81e155df --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_bg.properties @@ -0,0 +1,2 @@ +IOfflineCause.offline=\ + Извън линия diff --git a/core/src/main/resources/jenkins/agents/Messages_ca.properties b/core/src/main/resources/jenkins/agents/Messages_ca.properties new file mode 100644 index 000000000000..b1dc57237b69 --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_ca.properties @@ -0,0 +1 @@ +IOfflineCause.offline=Fora de línia diff --git a/core/src/main/resources/jenkins/agents/Messages_cs.properties b/core/src/main/resources/jenkins/agents/Messages_cs.properties new file mode 100644 index 000000000000..e8be0867d387 --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_cs.properties @@ -0,0 +1 @@ +IOfflineCause.offline=nedostupný diff --git a/core/src/main/resources/jenkins/agents/Messages_da.properties b/core/src/main/resources/jenkins/agents/Messages_da.properties new file mode 100644 index 000000000000..3eeb9c7db8ac --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_da.properties @@ -0,0 +1 @@ +IOfflineCause.offline=offline diff --git a/core/src/main/resources/jenkins/agents/Messages_de.properties b/core/src/main/resources/jenkins/agents/Messages_de.properties new file mode 100644 index 000000000000..3eeb9c7db8ac --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_de.properties @@ -0,0 +1 @@ +IOfflineCause.offline=offline diff --git a/core/src/main/resources/jenkins/agents/Messages_es.properties b/core/src/main/resources/jenkins/agents/Messages_es.properties new file mode 100644 index 000000000000..227b94579e02 --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_es.properties @@ -0,0 +1 @@ +IOfflineCause.offline=fuera de linea diff --git a/core/src/main/resources/jenkins/agents/Messages_es_AR.properties b/core/src/main/resources/jenkins/agents/Messages_es_AR.properties new file mode 100644 index 000000000000..6876bdefb1c9 --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_es_AR.properties @@ -0,0 +1 @@ +IOfflineCause.offline=desconectado diff --git a/core/src/main/resources/jenkins/agents/Messages_et.properties b/core/src/main/resources/jenkins/agents/Messages_et.properties new file mode 100644 index 000000000000..569f0fb79967 --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_et.properties @@ -0,0 +1 @@ +IOfflineCause.offline=offlain diff --git a/core/src/main/resources/jenkins/agents/Messages_fi.properties b/core/src/main/resources/jenkins/agents/Messages_fi.properties new file mode 100644 index 000000000000..9366da643837 --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_fi.properties @@ -0,0 +1 @@ +IOfflineCause.offline=ei yhteyttä diff --git a/core/src/main/resources/jenkins/agents/Messages_fr.properties b/core/src/main/resources/jenkins/agents/Messages_fr.properties index 4d11e586212e..6b5c376636ef 100644 --- a/core/src/main/resources/jenkins/agents/Messages_fr.properties +++ b/core/src/main/resources/jenkins/agents/Messages_fr.properties @@ -4,3 +4,4 @@ CloudSet.SpecifyCloudToCopy=Spécifier le cloud à copier CloudSet.NoSuchCloud=Aucun cloud : {0} CloudsLink.DisplayName=Clouds CloudsLink.Description=Ajouter, supprimer et configurer les instances de cloud afin de provisionner les agents à la demande. +IOfflineCause.offline=déconnecté diff --git a/core/src/main/resources/jenkins/agents/Messages_he.properties b/core/src/main/resources/jenkins/agents/Messages_he.properties new file mode 100644 index 000000000000..845bb4c14d51 --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_he.properties @@ -0,0 +1 @@ +IOfflineCause.offline=לא מקוון diff --git a/core/src/main/resources/jenkins/agents/Messages_hu.properties b/core/src/main/resources/jenkins/agents/Messages_hu.properties new file mode 100644 index 000000000000..f1d2ee59ca29 --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_hu.properties @@ -0,0 +1 @@ +IOfflineCause.offline=kapcsolat nélkül diff --git a/core/src/main/resources/jenkins/agents/Messages_it.properties b/core/src/main/resources/jenkins/agents/Messages_it.properties new file mode 100644 index 000000000000..67f532b2888e --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_it.properties @@ -0,0 +1 @@ +IOfflineCause.offline=non in linea diff --git a/core/src/main/resources/jenkins/agents/Messages_ja.properties b/core/src/main/resources/jenkins/agents/Messages_ja.properties new file mode 100644 index 000000000000..1dc8b5a9de59 --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_ja.properties @@ -0,0 +1 @@ +IOfflineCause.offline=オフライン diff --git a/core/src/main/resources/jenkins/agents/Messages_ko.properties b/core/src/main/resources/jenkins/agents/Messages_ko.properties new file mode 100644 index 000000000000..b66c4afd873d --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_ko.properties @@ -0,0 +1 @@ +IOfflineCause.offline=오프라인 diff --git a/core/src/main/resources/jenkins/agents/Messages_lt.properties b/core/src/main/resources/jenkins/agents/Messages_lt.properties new file mode 100644 index 000000000000..1dc33ef4d0ce --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_lt.properties @@ -0,0 +1 @@ +IOfflineCause.offline=nepasiekiamas diff --git a/core/src/main/resources/jenkins/agents/Messages_lv.properties b/core/src/main/resources/jenkins/agents/Messages_lv.properties new file mode 100644 index 000000000000..b201d5aa457b --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_lv.properties @@ -0,0 +1 @@ +IOfflineCause.offline=bezsaitē diff --git a/core/src/main/resources/jenkins/agents/Messages_nb_NO.properties b/core/src/main/resources/jenkins/agents/Messages_nb_NO.properties new file mode 100644 index 000000000000..e4c6f4d4c1cf --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_nb_NO.properties @@ -0,0 +1 @@ +IOfflineCause.offline=ikke tilgjengelig diff --git a/core/src/main/resources/jenkins/agents/Messages_nl.properties b/core/src/main/resources/jenkins/agents/Messages_nl.properties new file mode 100644 index 000000000000..db8aa00bc17e --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_nl.properties @@ -0,0 +1 @@ +IOfflineCause.offline=niet verbonden diff --git a/core/src/main/resources/jenkins/agents/Messages_pl.properties b/core/src/main/resources/jenkins/agents/Messages_pl.properties new file mode 100644 index 000000000000..d077ba98ac3d --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_pl.properties @@ -0,0 +1 @@ +IOfflineCause.offline=rozłączony diff --git a/core/src/main/resources/jenkins/agents/Messages_pt_BR.properties b/core/src/main/resources/jenkins/agents/Messages_pt_BR.properties new file mode 100644 index 000000000000..6876bdefb1c9 --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_pt_BR.properties @@ -0,0 +1 @@ +IOfflineCause.offline=desconectado diff --git a/core/src/main/resources/jenkins/agents/Messages_pt_PT.properties b/core/src/main/resources/jenkins/agents/Messages_pt_PT.properties new file mode 100644 index 000000000000..1b4e4281c66a --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_pt_PT.properties @@ -0,0 +1 @@ +IOfflineCause.offline=desligado diff --git a/core/src/main/resources/jenkins/agents/Messages_ro.properties b/core/src/main/resources/jenkins/agents/Messages_ro.properties new file mode 100644 index 000000000000..003d60708ddd --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_ro.properties @@ -0,0 +1 @@ +IOfflineCause.offline=oprit diff --git a/core/src/main/resources/jenkins/agents/Messages_ru.properties b/core/src/main/resources/jenkins/agents/Messages_ru.properties new file mode 100644 index 000000000000..6b7d6b72f9bc --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_ru.properties @@ -0,0 +1 @@ +IOfflineCause.offline=выключен diff --git a/core/src/main/resources/jenkins/agents/Messages_sr.properties b/core/src/main/resources/jenkins/agents/Messages_sr.properties new file mode 100644 index 000000000000..33944f0fed07 --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_sr.properties @@ -0,0 +1 @@ +IOfflineCause.offline=Ван мреже diff --git a/core/src/main/resources/jenkins/agents/Messages_sv_SE.properties b/core/src/main/resources/jenkins/agents/Messages_sv_SE.properties index 38cc64867d62..51ede868f109 100644 --- a/core/src/main/resources/jenkins/agents/Messages_sv_SE.properties +++ b/core/src/main/resources/jenkins/agents/Messages_sv_SE.properties @@ -4,3 +4,4 @@ CloudSet.SpecifyCloudToCopy=Ange vilket moln som ska kopieras CloudSet.NoSuchCloud=Det finns inget sådant moln: {0} CloudsLink.DisplayName=Moln CloudsLink.Description=Lägg till, ta bort och konfigurera molninstanser för att tillhandahålla agenter på begäran. +IOfflineCause.offline=frånkopplad diff --git a/core/src/main/resources/jenkins/agents/Messages_tr.properties b/core/src/main/resources/jenkins/agents/Messages_tr.properties index 5265f554c784..2ae6997d3203 100644 --- a/core/src/main/resources/jenkins/agents/Messages_tr.properties +++ b/core/src/main/resources/jenkins/agents/Messages_tr.properties @@ -4,3 +4,4 @@ CloudSet.SpecifyCloudToCopy=Hangi bulutun kopyalanacağını belirtin CloudSet.NoSuchCloud=Böyle bir bulut yok: {0} CloudsLink.DisplayName=Bulutlar CloudsLink.Description=İsteğe bağlı olarak ajan hazırlamak için kullanılmak üzere bulut tanımları ekleyin, kaldırın ve düzenleyin. +IOfflineCause.offline=Çevrimdışı diff --git a/core/src/main/resources/jenkins/agents/Messages_uk.properties b/core/src/main/resources/jenkins/agents/Messages_uk.properties new file mode 100644 index 000000000000..1138609d6943 --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_uk.properties @@ -0,0 +1 @@ +IOfflineCause.offline=поза мережею diff --git a/core/src/main/resources/jenkins/agents/Messages_zh_TW.properties b/core/src/main/resources/jenkins/agents/Messages_zh_TW.properties new file mode 100644 index 000000000000..8f59605265aa --- /dev/null +++ b/core/src/main/resources/jenkins/agents/Messages_zh_TW.properties @@ -0,0 +1 @@ +IOfflineCause.offline=離線 diff --git a/core/src/main/resources/jenkins/appearance/AppearanceGlobalConfiguration/index.jelly b/core/src/main/resources/jenkins/appearance/AppearanceGlobalConfiguration/index.jelly index 9c4863c2b3f1..a49d8c765acf 100644 --- a/core/src/main/resources/jenkins/appearance/AppearanceGlobalConfiguration/index.jelly +++ b/core/src/main/resources/jenkins/appearance/AppearanceGlobalConfiguration/index.jelly @@ -44,12 +44,7 @@ THE SOFTWARE. - - - - - - + diff --git a/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_tr.properties b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_tr.properties new file mode 100644 index 000000000000..73adeed2eeaf --- /dev/null +++ b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_tr.properties @@ -0,0 +1 @@ +Create\ First\ Admin\ User=İlk Yönetici Kullanıcıyı Oluştur diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config.groovy b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config.groovy index f470918608d3..78b82d5a5021 100644 --- a/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config.groovy +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config.groovy @@ -29,22 +29,21 @@ import hudson.model.AdministrativeMonitor f = namespace(lib.FormTagLib) st = namespace("jelly:stapler") -f.section(title: _("Administrative monitors configuration")) { +f.section(title: _("Administrative monitors"), description: _("blurb")) { f.advanced(title: _("Administrative monitors")) { - f.entry(title: _("Enabled administrative monitors")) { - p(class: "jenkins-form-description", _("blurb")) + f.entry() { for (AdministrativeMonitor am : new ArrayList<>(AdministrativeMonitor.all()) .sort({ o1, o2 -> o1.getDisplayName() <=> o2.getDisplayName() })) { - div(class: "jenkins-checkbox-help-wrapper") { - f.checkbox(name: "administrativeMonitor", - title: am.displayName, - checked: am.enabled, - json: am.id) - if (am.isSecurity()) { - span(style: 'margin-left: 0.5rem', class: 'am-badge', _("Security")) + div(style: "margin-bottom: 0.625rem") { + div(class: "jenkins-checkbox-help-wrapper") { + f.checkbox(name: "administrativeMonitor", + title: am.displayName, + checked: am.enabled, + json: am.id) + if (am.isSecurity()) { + span(style: 'margin-left: 0.5rem', class: 'jenkins-badge', _("Security")) + } } - } - div(class: "tr") { div(class: "jenkins-checkbox__description") { st.include(it: am, page: "description", optional: true) } diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_it.properties b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_it.properties index 99774b93a33c..e6a4cda88b8d 100644 --- a/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_it.properties +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_it.properties @@ -22,10 +22,8 @@ # THE SOFTWARE. Administrative\ monitors=Monitor amministrativi -Administrative\ monitors\ configuration=Configurazione monitor amministrativi blurb=I monitor amministrativi sono avvisi visualizzati agli amministratori \ di Jenkins riguardanti lo stato dell''istanza di Jenkins. In generale è \ caldamente consigliato mantenere tutti i monitor amministrativi abilitati, \ ma se non si è interessati a ricevere specifici avvisi, li si deselezioni \ qui per nasconderli permanentemente. -Enabled\ administrative\ monitors=Monitor amministrativi abilitati diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_ru.properties b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_ru.properties index fabeb6e453ef..fc794e82e30f 100644 --- a/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_ru.properties +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_ru.properties @@ -21,8 +21,6 @@ # THE SOFTWARE. Administrative\ monitors=Мониторы администрирования -Administrative\ monitors\ configuration=Настройка мониторов администрирования blurb=Мониторы администрирования - это предупреждения о состоянии экземпляра Jenkins, которые показываются \ администраторам Jenkins. Обычно настоятельно рекомендуется оставить все мониторы администрирования включёнными, но \ если некоторые предупреждения вас не интересуют, отключите их здесь, чтобы навсегда скрыть их. -Enabled\ administrative\ monitors=Включённые мониторы администрирования diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_sv_SE.properties b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_sv_SE.properties index 2d46f007949b..4d20f2a9ff9b 100644 --- a/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_sv_SE.properties +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_sv_SE.properties @@ -4,5 +4,3 @@ blurb=Administrativa övervakningar är varningar som visas för Jenkins-adminis inte är intresserad av specifika varningar kan du avmarkera dem här för att \ dölja dem permanent. Administrative\ monitors=Administrativa övervakningar -Administrative\ monitors\ configuration=Konfiguration av administrativa övervakningar -Enabled\ administrative\ monitors=Aktiverade administrativa övervakningar \ No newline at end of file diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_tr.properties b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_tr.properties index 188640215ba6..63b7ff3612b0 100644 --- a/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_tr.properties +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config_tr.properties @@ -1,4 +1,2 @@ -Administrative\ monitors\ configuration=İdari monitör ayarları Administrative\ monitors=İdari monitörler -Enabled\ administrative\ monitors=Aktif idari monitörler blurb=İdari monitörler, Jenkins yöneticilerine Jenkins örneğinin durumu hakkında gösterilen uyarılardır. Genel olarak tüm yönetim monitörlerini etkin tutmanız şiddetle tavsiye edilir, ancak belirli uyarılarla ilgilenmiyorsanız, kalıcı olarak gizlemek için buradaki işaretlerini kaldırın. diff --git a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure.jelly b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure.jelly index d71a75949106..d01b9dc210a2 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure.jelly @@ -55,11 +55,7 @@ THE SOFTWARE. - - - - - + diff --git a/core/src/main/resources/jenkins/model/Jenkins/_404.jelly b/core/src/main/resources/jenkins/model/Jenkins/_404.jelly index 7230e4f31acc..2578c10b99bd 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/_404.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/_404.jelly @@ -44,6 +44,9 @@ THE SOFTWARE. ${%noAccess} + + ${%tryLoggingIn} + ${%notFound} diff --git a/core/src/main/resources/jenkins/model/Jenkins/_404.properties b/core/src/main/resources/jenkins/model/Jenkins/_404.properties index c671d3ed833c..42a8c07eb02f 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/_404.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/_404.properties @@ -1,3 +1,4 @@ title = {0} noAccess = This page may not exist, or you may not have permission to see it. +tryLoggingIn = If you have an account, try logging in. notFound = This page does not exist. diff --git a/core/src/main/resources/jenkins/model/Jenkins/configure.jelly b/core/src/main/resources/jenkins/model/Jenkins/configure.jelly index 34b067bec99c..b24f0e872cf4 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/configure.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/configure.jelly @@ -32,6 +32,7 @@ THE SOFTWARE. +
@@ -46,7 +47,6 @@ THE SOFTWARE.
- @@ -60,17 +60,9 @@ THE SOFTWARE.
- - - - - - - + + - - - diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly deleted file mode 100644 index 55e2c974b5ba..000000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly +++ /dev/null @@ -1,4 +0,0 @@ - - - ${%summary} - diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.properties deleted file mode 100644 index 4ecb60357fd6..000000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.properties +++ /dev/null @@ -1 +0,0 @@ -summary=A TLS secured connection between the controller and the agent performed by TLS upgrade of the socket. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_bg.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_bg.properties deleted file mode 100644 index 4d13804ebdad..000000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_bg.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Bulgarian translation: Copyright (c) 2016, 2017, Alexander Shopov -# -# 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: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -# A TLS secured connection between the master and the agent performed by TLS upgrade of the socket. -summary=\ - Защитена връзка между управляващия и подчинения компютър чрез преминаване към\ - TLS по гнездото. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_de.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_de.properties deleted file mode 100644 index 77064f1441ee..000000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_de.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2017 Daniel Beck and a number of other of contributors -# -# 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: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -summary=Eine TLS-gesicherte Verbindung zwischen Master-Knoten und Agenten über TLS-Upgrade des Sockets. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_fr.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_fr.properties deleted file mode 100644 index 26c2dd5b35c8..000000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_fr.properties +++ /dev/null @@ -1 +0,0 @@ -summary=Une connexion TLS sécurisée entre le contrôleur et l''agent a été effectuée via une mise à jour du TLS du socket. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_it.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_it.properties deleted file mode 100644 index 2d9452d7f068..000000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_it.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Italian localization plugin for Jenkins -# Copyright © 2020 Alessandro Menti -# -# 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: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -summary=Una connessione fra il master e l''agente protetta da TLS ed \ - eseguita aggiornando il socket a TLS. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_pt_BR.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_pt_BR.properties deleted file mode 100644 index 74e67bc910b6..000000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_pt_BR.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors -# -# 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: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -summary=Uma conexão segura via TLS entre o controlador e o agente realizada por uma atualização de TLS no soquete. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_sv_SE.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_sv_SE.properties deleted file mode 100644 index 35b1deaba4fd..000000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_sv_SE.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors -# -# 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: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -summary=En TLS-säker anslutning mellan styrenheten och agenten utfördes av sockelns TLS-uppgradering. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_zh_TW.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_zh_TW.properties deleted file mode 100644 index 949804a0f146..000000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description_zh_TW.properties +++ /dev/null @@ -1 +0,0 @@ -summary=透過 TLS 通訊端升級 Controller 和 Agent 間的 TLS 安全連線。 diff --git a/core/src/main/resources/jenkins/slaves/Messages.properties b/core/src/main/resources/jenkins/slaves/Messages.properties deleted file mode 100644 index 41abfc7a302c..000000000000 --- a/core/src/main/resources/jenkins/slaves/Messages.properties +++ /dev/null @@ -1,27 +0,0 @@ -# The MIT License -# -# Copyright 2016 Stephen Connolly -# -# 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: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -JnlpSlaveAgentProtocol.displayName=Inbound TCP Agent Protocol/1 (deprecated, unencrypted) -JnlpSlaveAgentProtocol2.displayName=Inbound TCP Agent Protocol/2 (deprecated, unencrypted) -JnlpSlaveAgentProtocol3.displayName=Inbound TCP Agent Protocol/3 (deprecated, basic encryption) -JnlpSlaveAgentProtocol4.displayName=Inbound TCP Agent Protocol/4 (TLS encryption) -DeprecatedAgentProtocolMonitor.displayName=Deprecated Agent Protocol Monitor diff --git a/core/src/main/resources/jenkins/slaves/Messages_bg.properties b/core/src/main/resources/jenkins/slaves/Messages_bg.properties deleted file mode 100644 index 459672fa3c3d..000000000000 --- a/core/src/main/resources/jenkins/slaves/Messages_bg.properties +++ /dev/null @@ -1,37 +0,0 @@ -# The MIT License -# -# Bulgarian translation: Copyright (c) 2016, 2017, Alexander Shopov -# -# 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: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -# Java Web Start Agent Protocol/3 -JnlpSlaveAgentProtocol3.displayName=\ - Протокол за стартиране на агента за Java през уeб, версия 3 -# Java Web Start Agent Protocol/1 -JnlpSlaveAgentProtocol.displayName=\ - Протокол за стартиране на агента за Java през уeб, версия 1 -# Java Web Start Agent Protocol/2 -JnlpSlaveAgentProtocol2.displayName=\ - Протокол за стартиране на агента за Java през уeб, версия 2 -# Java Web Start Agent Protocol/4 (TLS encryption) -JnlpSlaveAgentProtocol4.displayName=\ - Протокол за стартиране на агента за Java през уeб, версия 4 (шифриране с TLS) -# Deprecated Agent Protocol Monitor -DeprecatedAgentProtocolMonitor.displayName=\ - Датчик за остарели протоколи за стартиране на агента за Java през уeб diff --git a/core/src/main/resources/jenkins/slaves/Messages_de.properties b/core/src/main/resources/jenkins/slaves/Messages_de.properties deleted file mode 100644 index cceceebe685f..000000000000 --- a/core/src/main/resources/jenkins/slaves/Messages_de.properties +++ /dev/null @@ -1,27 +0,0 @@ -# The MIT License -# -# Copyright (c) 2017 Daniel Beck and a number of other of contributors -# -# 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: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -# Java Web Start Agent Protocol/4 (TLS encryption) -JnlpSlaveAgentProtocol4.displayName=Java-Web-Start-Agentenprotokoll Version 4 (TLS-Verschlüsselung) -JnlpSlaveAgentProtocol2.displayName=Java-Web-Start-Agentenprotokoll Version 2 (unverschlüsselt) -JnlpSlaveAgentProtocol.displayName=Java-Web-Start-Agentenprotokoll Version 1 (unverschlüsselt) -JnlpSlaveAgentProtocol3.displayName=Java-Web-Start-Agentenprotokoll Version 3 (einfache Verschlüsselung) diff --git a/core/src/main/resources/jenkins/slaves/Messages_fr.properties b/core/src/main/resources/jenkins/slaves/Messages_fr.properties deleted file mode 100644 index babe83c53fa8..000000000000 --- a/core/src/main/resources/jenkins/slaves/Messages_fr.properties +++ /dev/null @@ -1,27 +0,0 @@ -# The MIT License -# -# Copyright 2016 Stephen Connolly -# -# 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: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -JnlpSlaveAgentProtocol.displayName=Inbound TCP Agent Protocol/1 (obsolète, non chiffré) -JnlpSlaveAgentProtocol2.displayName=Inbound TCP Agent Protocol/2 (obsolète, non chiffré) -JnlpSlaveAgentProtocol3.displayName=Inbound TCP Agent Protocol/3 (obsolète, chiffrement basique) -JnlpSlaveAgentProtocol4.displayName=Inbound TCP Agent Protocol/4 (chiffrement TLS) -DeprecatedAgentProtocolMonitor.displayName=Moniteur de protocole obsolète d''agent diff --git a/core/src/main/resources/jenkins/slaves/Messages_it.properties b/core/src/main/resources/jenkins/slaves/Messages_it.properties deleted file mode 100644 index 15a4fd1854fa..000000000000 --- a/core/src/main/resources/jenkins/slaves/Messages_it.properties +++ /dev/null @@ -1,33 +0,0 @@ -# The MIT License -# -# Italian localization plugin for Jenkins -# Copyright © 2020 Alessandro Menti -# -# 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: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -DeprecatedAgentProtocolMonitor.displayName=Componente di monitoraggio \ - protocolli deprecati agenti -JnlpSlaveAgentProtocol.displayName=Protocollo in ingresso TCP per agenti, \ - versione 1 (deprecato, senza crittografia) -JnlpSlaveAgentProtocol2.displayName=Protocollo in ingresso TCP per agenti, \ - versione 2 (deprecato, senza crittografia) -JnlpSlaveAgentProtocol3.displayName=Protocollo in ingresso TCP per agenti, \ - versione 3 (deprecato, con crittografia di base) -JnlpSlaveAgentProtocol4.displayName=Protocollo in ingresso TCP per agenti, \ - versione 4 (crittografia TLS) diff --git a/core/src/main/resources/jenkins/slaves/Messages_pt_BR.properties b/core/src/main/resources/jenkins/slaves/Messages_pt_BR.properties deleted file mode 100644 index c185388bf156..000000000000 --- a/core/src/main/resources/jenkins/slaves/Messages_pt_BR.properties +++ /dev/null @@ -1,27 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors -# -# 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: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -DeprecatedAgentProtocolMonitor.displayName=Monitor de protocolo de agente descontinuado -JnlpSlaveAgentProtocol3.displayName=Protocolo de agente TCP de entrada/3 (descontinuado, criptografia básica) -JnlpSlaveAgentProtocol2.displayName=Protocolo de agente TCP de entrada/2 (descontinuado, sem criptografia) -JnlpSlaveAgentProtocol.displayName=Protocolo de agente TCP de entrada/1 (descontinuado, sem criptografia) -JnlpSlaveAgentProtocol4.displayName=Protocolo de agente TCP de entrada/4 (criptografia via TLS) diff --git a/core/src/main/resources/jenkins/slaves/Messages_sv_SE.properties b/core/src/main/resources/jenkins/slaves/Messages_sv_SE.properties deleted file mode 100644 index 4274099d00a1..000000000000 --- a/core/src/main/resources/jenkins/slaves/Messages_sv_SE.properties +++ /dev/null @@ -1,27 +0,0 @@ -# The MIT License -# -# Copyright 2016 Stephen Connolly -# -# 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: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -JnlpSlaveAgentProtocol.displayName=Ingående TCP-agentsprotokoll/1 (inaktuell, ej krypterat) -JnlpSlaveAgentProtocol2.displayName=Ingående TCP-agentsprotokoll/2 (inaktuell, ej krypterat) -JnlpSlaveAgentProtocol3.displayName=Ingående TCP-agentsprotokoll/3 (inaktuell, enkel kryptering) -JnlpSlaveAgentProtocol4.displayName=Ingående TCP-agentsprotokoll/4 (TLS-kryptering) -DeprecatedAgentProtocolMonitor.displayName=Inaktuell övervakning av agentsprotokoll diff --git a/core/src/main/resources/jenkins/slaves/Messages_zh_TW.properties b/core/src/main/resources/jenkins/slaves/Messages_zh_TW.properties deleted file mode 100644 index 830e59610c15..000000000000 --- a/core/src/main/resources/jenkins/slaves/Messages_zh_TW.properties +++ /dev/null @@ -1,27 +0,0 @@ -# The MIT License -# -# Copyright 2016 Stephen Connolly -# -# 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: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -JnlpSlaveAgentProtocol.displayName=連入 TCP Agent 通訊協定/1 (棄用、未加密) -JnlpSlaveAgentProtocol2.displayName=連入 TCP Agent 通訊協定/2 (棄用、未加密) -JnlpSlaveAgentProtocol3.displayName=連入 TCP Agent 通訊協定/3 (棄用、基本加密) -JnlpSlaveAgentProtocol4.displayName=連入 TCP Agent 通訊協定/4 (TLS 加密) -DeprecatedAgentProtocolMonitor.displayName=已棄用的 Agent 通訊協定監視器 diff --git a/core/src/main/resources/lib/form/checkbox.jelly b/core/src/main/resources/lib/form/checkbox.jelly index 60c8c11f4c52..de831954cafc 100644 --- a/core/src/main/resources/lib/form/checkbox.jelly +++ b/core/src/main/resources/lib/form/checkbox.jelly @@ -69,6 +69,9 @@ THE SOFTWARE. Used as tooltip of the checkbox, and, if a title is specified, of the title + + Optional description for the checkbox + @@ -87,6 +90,11 @@ THE SOFTWARE. + +
+ ${attrs.description} +
+
${customizedFields.add(name)} diff --git a/core/src/main/resources/lib/form/combobox.jelly b/core/src/main/resources/lib/form/combobox.jelly index 51fe7ce0d30f..517e12cd875e 100644 --- a/core/src/main/resources/lib/form/combobox.jelly +++ b/core/src/main/resources/lib/form/combobox.jelly @@ -70,11 +70,6 @@ THE SOFTWARE. ${descriptor.calcFillSettings(field,attrs)} - - + @@ -34,13 +37,11 @@ ]]> - - Jenkins Taglib Documentation - + org.apache.maven.skins maven-fluido-skin - 1.12.0 + 2.0.0-M11 @@ -56,4 +57,4 @@ false - + diff --git a/core/src/test/java/hudson/util/IsOverriddenTest.java b/core/src/test/java/hudson/util/IsOverriddenTest.java index c608e7453f9a..4711c5edf0a6 100644 --- a/core/src/test/java/hudson/util/IsOverriddenTest.java +++ b/core/src/test/java/hudson/util/IsOverriddenTest.java @@ -31,6 +31,7 @@ import static org.junit.Assert.assertTrue; import hudson.Util; +import java.io.PrintWriter; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ErrorCollector; @@ -52,6 +53,8 @@ public void isOverriddenTest() { assertTrue(Util.isOverridden(Base.class, Derived.class, "method")); assertTrue(Util.isOverridden(Base.class, Intermediate.class, "method")); assertFalse(Util.isOverridden(Base.class, Base.class, "method")); + assertFalse(Util.isOverridden(Throwable.class, Throwable.class, "printStackTrace", PrintWriter.class)); + assertFalse(Util.isOverridden(Throwable.class, Exception.class, "printStackTrace", PrintWriter.class)); assertTrue(Util.isOverridden(Base.class, Intermediate.class, "setX", Object.class)); assertTrue(Util.isOverridden(Base.class, Intermediate.class, "getX")); } diff --git a/core/src/test/java/hudson/util/RobustCollectionConverterTest.java b/core/src/test/java/hudson/util/RobustCollectionConverterTest.java index 7786fb0833f7..57f2ad42af39 100644 --- a/core/src/test/java/hudson/util/RobustCollectionConverterTest.java +++ b/core/src/test/java/hudson/util/RobustCollectionConverterTest.java @@ -32,6 +32,8 @@ import static org.junit.Assert.assertTrue; import com.thoughtworks.xstream.security.InputManipulationException; +import hudson.model.Saveable; +import java.io.IOException; import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; @@ -42,10 +44,24 @@ import java.util.Map; import java.util.Set; import jenkins.util.xstream.CriticalXStreamException; +import org.junit.After; +import org.junit.Before; import org.junit.Test; import org.jvnet.hudson.test.Issue; public class RobustCollectionConverterTest { + private final boolean originalRecordFailures = RobustReflectionConverter.RECORD_FAILURES_FOR_ALL_AUTHENTICATIONS; + + @Before + public void before() { + RobustReflectionConverter.RECORD_FAILURES_FOR_ALL_AUTHENTICATIONS = true; + } + + @After + public void after() { + RobustReflectionConverter.RECORD_FAILURES_FOR_ALL_AUTHENTICATIONS = originalRecordFailures; + } + @Test public void workingByDefaultWithSimplePayload() { XStream2 xstream2 = new XStream2(); @@ -173,4 +189,58 @@ private Set preparePayload() { } return set; } + + @Issue("JENKINS-63343") + @Test + public void checkElementTypes() { + var xmlContent = + """ + + + 1 + 2 + oops! + + 3 + + + """; + var actual = (Data) new XStream2().fromXML(xmlContent); + assertEquals(Arrays.asList(1, 2, null, 3), actual.numbers); + } + + @Test + public void rawtypes() { + var xmlContent = + """ + + + 1 + 2 + oops! + 3 + + + """; + var actual = (DataRaw) new XStream2().fromXML(xmlContent); + assertEquals(List.of(1, 2, "oops!", 3), actual.values); + } + + public static class Data implements Saveable { + private List numbers; + + @Override + public void save() throws IOException { + // We only implement Saveable so that RobustReflectionConverter logs deserialization problems. + } + } + + public static class DataRaw implements Saveable { + private List values; + + @Override + public void save() throws IOException { + // We only implement Saveable so that RobustReflectionConverter logs deserialization problems. + } + } } diff --git a/core/src/test/java/hudson/util/RobustMapConverterTest.java b/core/src/test/java/hudson/util/RobustMapConverterTest.java index b74ac9303f71..c46a7ade2f57 100644 --- a/core/src/test/java/hudson/util/RobustMapConverterTest.java +++ b/core/src/test/java/hudson/util/RobustMapConverterTest.java @@ -32,13 +32,29 @@ import static org.junit.Assert.assertTrue; import com.thoughtworks.xstream.security.InputManipulationException; +import hudson.model.Saveable; +import java.io.IOException; import java.util.HashMap; import java.util.Map; import jenkins.util.xstream.CriticalXStreamException; +import org.junit.After; +import org.junit.Before; import org.junit.Test; import org.jvnet.hudson.test.Issue; public class RobustMapConverterTest { + private final boolean originalRecordFailures = RobustReflectionConverter.RECORD_FAILURES_FOR_ALL_AUTHENTICATIONS; + + @Before + public void before() { + RobustReflectionConverter.RECORD_FAILURES_FOR_ALL_AUTHENTICATIONS = true; + } + + @After + public void after() { + RobustReflectionConverter.RECORD_FAILURES_FOR_ALL_AUTHENTICATIONS = originalRecordFailures; + } + /** * As RobustMapConverter is the replacer of the default MapConverter * We had to patch it in order to not be impacted by CVE-2021-43859 @@ -146,6 +162,7 @@ private Map preparePayload() { @Test public void robustAgainstInvalidEntry() { + RobustReflectionConverter.RECORD_FAILURES_FOR_ALL_AUTHENTICATIONS = true; XStream2 xstream2 = new XStream2(); String xml = """ @@ -184,7 +201,103 @@ public void robustAgainstInvalidEntryWithNoValue() { assertThat(data.map, equalTo(Map.of("key2", "value2"))); } - private static final class Data { + @Issue("JENKINS-63343") + @Test + public void robustAgainstInvalidKeyType() { + XStream2 xstream2 = new XStream2(); + String xml = + """ + + + + 1 + value1 + + + key2 + value2 + + + + value3 + + + + """; + Data data = (Data) xstream2.fromXML(xml); + var map = new HashMap<>(); + map.put("key2", "value2"); + map.put(null, "value3"); + assertThat(data.map, equalTo(map)); + } + + @Issue("JENKINS-63343") + @Test + public void robustAgainstInvalidValueType() { + XStream2 xstream2 = new XStream2(); + String xml = + """ + + + + key1 + value1 + + + key2 + 2 + + + key3 + + + + + """; + Data data = (Data) xstream2.fromXML(xml); + var map = new HashMap<>(); + map.put("key1", "value1"); + map.put("key3", null); + assertThat(data.map, equalTo(map)); + } + + @Test + public void rawtypes() { + XStream2 xstream2 = new XStream2(); + String xml = + """ + + + + key1 + value1 + + + key2 + 2 + + + + """; + var data = (DataRaw) xstream2.fromXML(xml); + assertThat(data.map, equalTo(Map.of("key1", "value1", "key2", 2))); + } + + private static class Data implements Saveable { Map map; + + @Override + public void save() throws IOException { + // We only implement Saveable so that RobustReflectionConverter logs deserialization problems. + } + } + + private static class DataRaw implements Saveable { + Map map; + + @Override + public void save() throws IOException { + // We only implement Saveable so that RobustReflectionConverter logs deserialization problems. + } } } diff --git a/core/src/test/java/hudson/util/RobustReflectionConverterTest.java b/core/src/test/java/hudson/util/RobustReflectionConverterTest.java index bb392132afdd..9f3da4b754b3 100644 --- a/core/src/test/java/hudson/util/RobustReflectionConverterTest.java +++ b/core/src/test/java/hudson/util/RobustReflectionConverterTest.java @@ -26,6 +26,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -41,6 +42,8 @@ import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.mapper.Mapper; import com.thoughtworks.xstream.security.InputManipulationException; +import hudson.model.Saveable; +import java.io.IOException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -52,6 +55,9 @@ import java.util.logging.Logger; import jenkins.util.xstream.CriticalXStreamException; import org.hamcrest.Matchers; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.jvnet.hudson.test.Issue; @@ -59,11 +65,22 @@ * @author Kohsuke Kawaguchi */ public class RobustReflectionConverterTest { + private final boolean originalRecordFailures = RobustReflectionConverter.RECORD_FAILURES_FOR_ALL_AUTHENTICATIONS; static { Logger.getLogger(RobustReflectionConverter.class.getName()).setLevel(Level.OFF); } + @Before + public void before() { + RobustReflectionConverter.RECORD_FAILURES_FOR_ALL_AUTHENTICATIONS = true; + } + + @After + public void after() { + RobustReflectionConverter.RECORD_FAILURES_FOR_ALL_AUTHENTICATIONS = originalRecordFailures; + } + @Test public void robustUnmarshalling() { Point p = read(new XStream2()); @@ -132,8 +149,72 @@ public void implicitCollection() { "", xs.toXML(h)); } - public static class Hold { + @Ignore("Throws an NPE in writeValueToImplicitCollection. Issue has existed since RobustReflectionConverter was created.") + @Test + public void implicitCollectionsAllowNullElements() { + XStream2 xs = new XStream2(); + xs.alias("hold", Hold.class); + xs.addImplicitCollection(Hold.class, "items", "item", String.class); + Hold h = (Hold) xs.fromXML("b"); + assertThat(h.items, Matchers.containsInAnyOrder(null, "b")); + assertEquals("\n" + + " \n" + + " b\n" + + "", xs.toXML(h)); + } + + @Issue("JENKINS-63343") + @Test + public void robustAgainstImplicitCollectionElementsWithBadTypes() { + XStream2 xs = new XStream2(); + xs.alias("hold", Hold.class); + // Note that the fix only matters for `addImplicitCollection` overloads like the following where the element type is not provided. + xs.addImplicitCollection(Hold.class, "items"); + Hold h = (Hold) xs.fromXML( + """ + + 123 + abc + 456 + def + + """); + assertThat(h.items, equalTo(List.of("abc", "def"))); + } + + public static class Hold implements Saveable { List items; + + @Override + public void save() throws IOException { + // We only implement Saveable so that RobustReflectionConverter logs deserialization problems. + } + } + + @Test + public void implicitCollectionRawtypes() { + XStream2 xs = new XStream2(); + xs.alias("hold", HoldRaw.class); + xs.addImplicitCollection(HoldRaw.class, "items"); + var h = (HoldRaw) xs.fromXML( + """ + + 123 + abc + 456 + def + + """); + assertThat(h.items, equalTo(List.of(123, "abc", 456, "def"))); + } + + public static class HoldRaw implements Saveable { + List items; + + @Override + public void save() throws IOException { + // We only implement Saveable so that RobustReflectionConverter logs deserialization problems. + } } @Retention(RetentionPolicy.RUNTIME) @interface Owner { diff --git a/core/src/test/java/hudson/util/io/TarArchiverTest.java b/core/src/test/java/hudson/util/io/TarArchiverTest.java index c0f41981c27f..2d7d9b5524cd 100644 --- a/core/src/test/java/hudson/util/io/TarArchiverTest.java +++ b/core/src/test/java/hudson/util/io/TarArchiverTest.java @@ -36,9 +36,17 @@ import hudson.util.StreamTaskListener; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.nio.file.Path; import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import org.apache.tools.tar.TarEntry; +import org.apache.tools.tar.TarInputStream; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -121,6 +129,28 @@ private static void run(FilePath dir, String... cmds) throws InterruptedExceptio } } + @Ignore("TODO fails to add empty directories to archive") + @Issue("JENKINS-73837") + @Test + public void emptyDirectory() throws Exception { + Path tar = tmp.newFile("test.tar").toPath(); + Path root = tmp.newFolder().toPath(); + Files.createDirectory(root.resolve("foo")); + Files.createDirectory(root.resolve("bar")); + Files.writeString(root.resolve("bar/file.txt"), "foobar", StandardCharsets.UTF_8); + try (OutputStream out = Files.newOutputStream(tar)) { + new FilePath(root.toFile()).tar(out, "**"); + } + Set names = new HashSet<>(); + try (InputStream is = Files.newInputStream(tar); + TarInputStream tis = new TarInputStream(is, StandardCharsets.UTF_8.name())) { + TarEntry te; + while ((te = tis.getNextEntry()) != null) { + names.add(te.getName()); + } + } + assertEquals(Set.of("foo/", "bar/", "bar/file.txt"), names); + } /** * Test backing up an open file diff --git a/core/src/test/java/hudson/util/io/ZipArchiverTest.java b/core/src/test/java/hudson/util/io/ZipArchiverTest.java index 2daea14a2a17..a54fad193ecf 100644 --- a/core/src/test/java/hudson/util/io/ZipArchiverTest.java +++ b/core/src/test/java/hudson/util/io/ZipArchiverTest.java @@ -2,13 +2,21 @@ import static org.junit.Assert.assertEquals; +import hudson.FilePath; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.io.RandomAccessFile; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; +import java.util.zip.ZipInputStream; import org.junit.Assume; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -72,4 +80,27 @@ public void huge64bitFile() throws IOException { assertEquals(length, zipEntry.getSize()); } } + + @Ignore("TODO fails to add empty directories to archive") + @Issue("JENKINS-49296") + @Test + public void emptyDirectory() throws Exception { + Path zip = tmp.newFile("test.zip").toPath(); + Path root = tmp.newFolder().toPath(); + Files.createDirectory(root.resolve("foo")); + Files.createDirectory(root.resolve("bar")); + Files.writeString(root.resolve("bar/file.txt"), "foobar", StandardCharsets.UTF_8); + try (OutputStream out = Files.newOutputStream(zip)) { + new FilePath(root.toFile()).zip(out, "**"); + } + Set names = new HashSet<>(); + try (InputStream is = Files.newInputStream(zip); + ZipInputStream zis = new ZipInputStream(is, StandardCharsets.UTF_8)) { + ZipEntry ze; + while ((ze = zis.getNextEntry()) != null) { + names.add(ze.getName()); + } + } + assertEquals(Set.of("foo/", "bar/", "bar/file.txt"), names); + } } diff --git a/core/src/test/java/jenkins/monitor/OperatingSystemEndOfLifeAdminMonitorTest.java b/core/src/test/java/jenkins/monitor/OperatingSystemEndOfLifeAdminMonitorTest.java index 5cd09790cdd9..84bc3790241a 100644 --- a/core/src/test/java/jenkins/monitor/OperatingSystemEndOfLifeAdminMonitorTest.java +++ b/core/src/test/java/jenkins/monitor/OperatingSystemEndOfLifeAdminMonitorTest.java @@ -28,6 +28,7 @@ import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; @@ -35,15 +36,24 @@ import java.io.File; import java.io.IOException; import java.net.URL; +import java.nio.file.Files; +import java.time.LocalDate; import java.util.Random; import java.util.stream.Stream; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import org.junit.Rule; import org.junit.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import org.junit.rules.TemporaryFolder; public class OperatingSystemEndOfLifeAdminMonitorTest { + @Rule + public TemporaryFolder tmp = new TemporaryFolder(); + private final OperatingSystemEndOfLifeAdminMonitor monitor; private final Random random = new Random(); private final String PREFIX = "administrativeMonitor/"; @@ -210,6 +220,21 @@ public void testReadOperatingSystemNames(String fileName, String pattern, String assertThat(monitor.readOperatingSystemName(releaseFile, pattern), is(job)); } + @Test + public void testReadOperatingSystemListOnWarningDate() throws Exception { + File dataFile = tmp.newFile(); + Files.writeString(dataFile.toPath(), "PRETTY_NAME=\"Test OS\""); + JSONObject eolIn6Months = new JSONObject(); + eolIn6Months.put("pattern", "Test OS"); + eolIn6Months.put("endOfLife", LocalDate.now().plusMonths(6).toString()); + eolIn6Months.put("file", dataFile.getAbsolutePath()); + JSONArray jsonArray = new JSONArray(); + jsonArray.add(eolIn6Months); + monitor.readOperatingSystemList(jsonArray.toString()); + assertTrue(monitor.isActivated()); + assertEquals(LocalDate.now().plusMonths(6).toString(), monitor.getEndOfLifeDate()); + } + @Test public void testReadOperatingSystemNameMissingFile() { assertThat(monitor.readOperatingSystemName(new File("/this/file/does/not/exist"), ".*"), is("")); diff --git a/eslint.config.cjs b/eslint.config.cjs index f6c1c6181e46..0362bf627a7a 100644 --- a/eslint.config.cjs +++ b/eslint.config.cjs @@ -18,7 +18,7 @@ module.exports = [ // External scripts ".pnp.cjs", ".pnp.loader.mjs", - "war/src/main/js/plugin-setup-wizard/bootstrap-detached.js", + "src/main/js/plugin-setup-wizard/bootstrap-detached.js", "war/src/main/webapp/scripts/yui/*", ], }, @@ -91,8 +91,8 @@ module.exports = [ { files: [ "eslint.config.cjs", - "war/postcss.config.js", - "war/webpack.config.js", + "postcss.config.js", + "webpack.config.js", ".stylelintrc.js", ], languageOptions: { diff --git a/package.json b/package.json index 365fadb619ed..55785de7bdbc 100644 --- a/package.json +++ b/package.json @@ -10,45 +10,45 @@ }, "private": true, "scripts": { - "dev": "webpack --config war/webpack.config.js", - "prod": "webpack --config war/webpack.config.js --mode=production", + "dev": "webpack --config webpack.config.js", + "prod": "webpack --config webpack.config.js --mode=production", "build": "yarn prod", "start": "yarn dev --watch", "lint:js": "eslint . && prettier --check .", "lint:js-ci": "eslint . -f checkstyle -o target/eslint-warnings.xml && prettier --check .", - "lint:css": "stylelint war/src/main/scss", - "lint:css-ci": "stylelint war/src/main/scss --custom-formatter stylelint-checkstyle-reporter -o target/stylelint-warnings.xml", + "lint:css": "stylelint src/main/scss", + "lint:css-ci": "stylelint src/main/scss --custom-formatter stylelint-checkstyle-reporter -o target/stylelint-warnings.xml", "lint:ci": "yarn lint:js-ci && yarn lint:css-ci", - "lint:fix": "eslint --fix . && prettier --write . && stylelint war/src/main/scss --fix", + "lint:fix": "eslint --fix . && prettier --write . && stylelint src/main/scss --fix", "lint": "yarn lint:js && yarn lint:css" }, "devDependencies": { - "@babel/cli": "7.25.6", - "@babel/core": "7.25.2", - "@babel/preset-env": "7.25.4", - "@eslint/js": "9.11.0", + "@babel/cli": "7.25.9", + "@babel/core": "7.26.0", + "@babel/preset-env": "7.26.0", + "@eslint/js": "9.13.0", "babel-loader": "9.2.1", "clean-webpack-plugin": "4.0.0", "css-loader": "7.1.2", "css-minimizer-webpack-plugin": "7.0.0", - "eslint": "9.11.0", + "eslint": "9.13.0", "eslint-config-prettier": "9.1.0", "eslint-formatter-checkstyle": "8.40.0", - "globals": "15.9.0", + "globals": "15.11.0", "handlebars-loader": "1.7.3", "mini-css-extract-plugin": "2.9.1", "postcss": "8.4.47", "postcss-loader": "8.1.1", - "postcss-preset-env": "10.0.3", + "postcss-preset-env": "10.0.8", "postcss-scss": "4.0.9", "prettier": "3.3.3", - "sass": "1.79.3", + "sass": "1.80.5", "sass-loader": "16.0.2", "style-loader": "4.0.0", - "stylelint": "16.9.0", + "stylelint": "16.10.0", "stylelint-checkstyle-reporter": "1.0.0", "stylelint-config-standard": "36.0.1", - "webpack": "5.94.0", + "webpack": "5.95.0", "webpack-cli": "5.1.4", "webpack-remove-empty-scripts": "1.0.4" }, @@ -65,5 +65,8 @@ "defaults", "not IE 11" ], - "packageManager": "yarn@4.5.0" + "engines": { + "node": ">=20.0.0" + }, + "packageManager": "yarn@4.5.1" } diff --git a/pom.xml b/pom.xml index 61ca93c2edc6..7839cc10a7e8 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci jenkins - 1.123 + 1.125 @@ -73,9 +73,9 @@ THE SOFTWARE. - 2.479 + 2.484 -SNAPSHOT - 2024-09-24T13:48:23Z + 2024-10-29T13:43:58Z github @@ -87,23 +87,18 @@ THE SOFTWARE. https://www.jenkins.io/changelog - 3261.v9c670a_4748a_9 + 3273.v4cfe589b_fd83 Max Medium - 1.33 + 1.34 4.13.2 - 1.29 + 1.30 false - 8.1 - 20.17.0 - - 1.22.19 - - 4.5.0 - cc00dce5de4f68d11450519a0f69eadf2a1cbe5cc0d8e740bfac817a31d76874 + 8.2 + 20.18.0 yarn install - yarn + corepack initialize + + yarn install + yarn build - yarn + corepack generate-sources - build + yarn build + + org.apache.maven.plugins + maven-clean-plugin + + + + + .yarn + false + + + node + false + + + node_modules + false + + + war/src/main/webapp/jsbundles + false + + + + @@ -517,11 +511,11 @@ THE SOFTWARE. yarn lint:ci - yarn + corepack test - lint:ci + yarn lint:ci ${yarn.lint.skip} @@ -550,11 +544,11 @@ THE SOFTWARE. yarn lint - yarn + corepack test - lint + yarn lint ${yarn.lint.skip} @@ -563,38 +557,5 @@ THE SOFTWARE. - - - clean-node - - - cleanNode - - - package.json - - - - - - org.apache.maven.plugins - maven-clean-plugin - - - - - node - false - - - node_modules - false - - - - - - - diff --git a/war/postcss.config.js b/postcss.config.js similarity index 100% rename from war/postcss.config.js rename to postcss.config.js diff --git a/war/src/main/js/add-item.js b/src/main/js/add-item.js similarity index 100% rename from war/src/main/js/add-item.js rename to src/main/js/add-item.js diff --git a/war/src/main/js/add-item.scss b/src/main/js/add-item.scss similarity index 100% rename from war/src/main/js/add-item.scss rename to src/main/js/add-item.scss diff --git a/war/src/main/js/api/pluginManager.js b/src/main/js/api/pluginManager.js similarity index 100% rename from war/src/main/js/api/pluginManager.js rename to src/main/js/api/pluginManager.js diff --git a/war/src/main/js/api/securityConfig.js b/src/main/js/api/securityConfig.js similarity index 100% rename from war/src/main/js/api/securityConfig.js rename to src/main/js/api/securityConfig.js diff --git a/war/src/main/js/app.js b/src/main/js/app.js similarity index 87% rename from war/src/main/js/app.js rename to src/main/js/app.js index 0ac9a97cce38..63a35226d7d4 100644 --- a/war/src/main/js/app.js +++ b/src/main/js/app.js @@ -5,7 +5,6 @@ import Tooltips from "@/components/tooltips"; import StopButtonLink from "@/components/stop-button-link"; import ConfirmationLink from "@/components/confirmation-link"; import Dialogs from "@/components/dialogs"; -import Autocomplete from "@/components/autocomplete"; Dropdowns.init(); Notifications.init(); @@ -14,4 +13,3 @@ Tooltips.init(); StopButtonLink.init(); ConfirmationLink.init(); Dialogs.init(); -Autocomplete.init(); diff --git a/war/src/main/js/components/confirmation-link/index.js b/src/main/js/components/confirmation-link/index.js similarity index 100% rename from war/src/main/js/components/confirmation-link/index.js rename to src/main/js/components/confirmation-link/index.js diff --git a/war/src/main/js/components/dialogs/index.js b/src/main/js/components/dialogs/index.js similarity index 100% rename from war/src/main/js/components/dialogs/index.js rename to src/main/js/components/dialogs/index.js diff --git a/war/src/main/js/components/autocomplete/index.js b/src/main/js/components/dropdowns/autocomplete.js similarity index 76% rename from war/src/main/js/components/autocomplete/index.js rename to src/main/js/components/dropdowns/autocomplete.js index 9caefc6e242e..b6d982c44911 100644 --- a/war/src/main/js/components/autocomplete/index.js +++ b/src/main/js/components/dropdowns/autocomplete.js @@ -9,32 +9,20 @@ function init() { return prev + item + delimiter + " "; } - function validate(e) { - if (e.targetUrl) { - var method = e.getAttribute("checkMethod") || "post"; - try { - FormChecker.delayedCheck(e.targetUrl(), method, e.targetElement); - } catch (x) { - console.warn(x); - return; - } - } - } - function convertSuggestionToItem(suggestion, e) { const delimiter = e.getAttribute("autoCompleteDelimChar"); const confirm = () => { e.value = delimiter ? addValue(e.value, suggestion.name, delimiter) : suggestion.name; - validate(e); + Utils.validateDropdown(e); e.focus(); }; return { label: suggestion.name, onClick: confirm, onKeyPress: (evt) => { - if (evt.key == "Tab") { + if (evt.key === "Tab") { confirm(); e.dropdown.hide(); evt.preventDefault(); @@ -43,13 +31,9 @@ function init() { }; } - function getMaxSuggestionCount(e) { - return parseInt(e.dataset["maxsuggestions"]) || 10; - } - function createAndShowDropdown(e, suggestions) { const items = suggestions - .splice(0, getMaxSuggestionCount(e)) + .splice(0, Utils.getMaxSuggestionCount(e, 10)) .map((s) => convertSuggestionToItem(s, e)); if (!e.dropdown) { Utils.generateDropdown( @@ -82,19 +66,6 @@ function init() { .then((response) => createAndShowDropdown(e, response.suggestions || [])); } - function debounce(callback) { - callback.running = false; - return () => { - if (!callback.running) { - callback.running = true; - setTimeout(() => { - callback(); - callback.running = false; - }, 300); - } - }; - } - behaviorShim.specify( "INPUT.auto-complete", "input-auto-complete", @@ -111,7 +82,7 @@ function init() { ); e.addEventListener( "input", - debounce(() => { + Utils.debounce(() => { updateSuggestions(e); }), ); diff --git a/src/main/js/components/dropdowns/combo-box.js b/src/main/js/components/dropdowns/combo-box.js new file mode 100644 index 000000000000..f3edb3f3e032 --- /dev/null +++ b/src/main/js/components/dropdowns/combo-box.js @@ -0,0 +1,93 @@ +import behaviorShim from "@/util/behavior-shim"; +import Utils from "@/components/dropdowns/utils"; + +function init() { + function convertSuggestionToItem(suggestion, e) { + const confirm = () => { + e.value = suggestion.name; + Utils.validateDropdown(e); + e.focus(); + }; + return { + label: suggestion.name, + onClick: confirm, + onKeyPress: (evt) => { + if (evt.key === "Tab") { + confirm(); + e.dropdown.hide(); + evt.preventDefault(); + } + }, + }; + } + + function createAndShowDropdown(e, div, suggestions) { + const items = suggestions + .splice(0, Utils.getMaxSuggestionCount(e, 20)) + .map((s) => convertSuggestionToItem(s, e)); + if (!e.dropdown) { + Utils.generateDropdown( + div, + (instance) => { + e.dropdown = instance; + }, + true, + ); + } + e.dropdown.setContent(Utils.generateDropdownItems(items, true)); + e.dropdown.show(); + } + + function updateSuggestions(e, div, items) { + const text = e.value.trim(); + + let filteredItems = text + ? items.filter((item) => item.indexOf(text) === 0) + : items; + + const suggestions = filteredItems + .filter((item) => item.indexOf(text) === 0) + .map((item) => { + return { name: item }; + }); + createAndShowDropdown(e, div, suggestions || []); + } + + behaviorShim.specify("INPUT.combobox2", "combobox", 100, function (e) { + // form field with auto-completion support + // insert the auto-completion container + refillOnChange(e, function (params) { + const div = document.createElement("DIV"); + e.parentNode.insertBefore(div, e.nextElementSibling); + e.style.position = "relative"; + + const url = e.getAttribute("fillUrl"); + fetch(url, { + headers: crumb.wrap({ + "Content-Type": "application/x-www-form-urlencoded", + }), + method: "post", + body: new URLSearchParams(params), + }) + .then((rsp) => (rsp.ok ? rsp.json() : {})) + .then((items) => { + e.addEventListener("focus", () => updateSuggestions(e, div, items)); + + // otherwise menu won't hide on tab with nothing selected + // needs delay as without that it blocks click selection of an item + e.addEventListener("focusout", () => + setTimeout(() => e.dropdown.hide(), 200), + ); + + e.addEventListener( + "input", + Utils.debounce(() => { + updateSuggestions(e, div, items); + }), + ); + }); + }); + }); +} + +export default { init }; diff --git a/war/src/main/js/components/dropdowns/hetero-list.js b/src/main/js/components/dropdowns/hetero-list.js similarity index 100% rename from war/src/main/js/components/dropdowns/hetero-list.js rename to src/main/js/components/dropdowns/hetero-list.js diff --git a/war/src/main/js/components/dropdowns/index.js b/src/main/js/components/dropdowns/index.js similarity index 70% rename from war/src/main/js/components/dropdowns/index.js rename to src/main/js/components/dropdowns/index.js index 472c548e0425..014569fbc16f 100644 --- a/war/src/main/js/components/dropdowns/index.js +++ b/src/main/js/components/dropdowns/index.js @@ -2,12 +2,16 @@ import Jumplists from "@/components/dropdowns/jumplists"; import InpageJumplist from "@/components/dropdowns/inpage-jumplist"; import OverflowButton from "@/components/dropdowns/overflow-button"; import HeteroLists from "@/components/dropdowns/hetero-list"; +import ComboBox from "@/components/dropdowns/combo-box"; +import Autocomplete from "@/components/dropdowns/autocomplete"; function init() { Jumplists.init(); InpageJumplist.init(); OverflowButton.init(); HeteroLists.init(); + ComboBox.init(); + Autocomplete.init(); } export default { init }; diff --git a/war/src/main/js/components/dropdowns/inpage-jumplist.js b/src/main/js/components/dropdowns/inpage-jumplist.js similarity index 100% rename from war/src/main/js/components/dropdowns/inpage-jumplist.js rename to src/main/js/components/dropdowns/inpage-jumplist.js diff --git a/war/src/main/js/components/dropdowns/jumplists.js b/src/main/js/components/dropdowns/jumplists.js similarity index 89% rename from war/src/main/js/components/dropdowns/jumplists.js rename to src/main/js/components/dropdowns/jumplists.js index f831f452bafe..c1df72306c25 100644 --- a/war/src/main/js/components/dropdowns/jumplists.js +++ b/src/main/js/components/dropdowns/jumplists.js @@ -105,11 +105,19 @@ function mapChildrenItemsToDropdownItems(items) { fetch(item.url, { method: "post", headers: crumb.wrap({}), + }).then((rsp) => { + if (rsp.ok) { + notificationBar.show( + item.displayName + ": Done.", + notificationBar.SUCCESS, + ); + } else { + notificationBar.show( + item.displayName + ": Failed.", + notificationBar.ERROR, + ); + } }); - notificationBar.show( - item.displayName + ": Done.", - notificationBar.SUCCESS, - ); } } }, diff --git a/war/src/main/js/components/dropdowns/overflow-button.js b/src/main/js/components/dropdowns/overflow-button.js similarity index 100% rename from war/src/main/js/components/dropdowns/overflow-button.js rename to src/main/js/components/dropdowns/overflow-button.js diff --git a/war/src/main/js/components/dropdowns/templates.js b/src/main/js/components/dropdowns/templates.js similarity index 100% rename from war/src/main/js/components/dropdowns/templates.js rename to src/main/js/components/dropdowns/templates.js diff --git a/war/src/main/js/components/dropdowns/utils.js b/src/main/js/components/dropdowns/utils.js similarity index 87% rename from war/src/main/js/components/dropdowns/utils.js rename to src/main/js/components/dropdowns/utils.js index a15c4d2c2ba5..588e1c232b02 100644 --- a/war/src/main/js/components/dropdowns/utils.js +++ b/src/main/js/components/dropdowns/utils.js @@ -12,6 +12,10 @@ const SELECTED_ITEM_CLASS = "jenkins-dropdown__item--selected"; * @param callback - called to retrieve the list of dropdown items */ function generateDropdown(element, callback, immediate) { + if (element._tippy && element._tippy.props.theme === "dropdown") { + element._tippy.destroy(); + } + tippy( element, Object.assign({}, Templates.dropdown(), { @@ -202,8 +206,39 @@ function convertHtmlToItems(children) { return items; } +function validateDropdown(e) { + if (e.targetUrl) { + const method = e.getAttribute("checkMethod") || "post"; + try { + FormChecker.delayedCheck(e.targetUrl(), method, e.targetElement); + } catch (x) { + console.warn(x); + } + } +} + +function getMaxSuggestionCount(e, defaultValue) { + return parseInt(e.dataset["maxsuggestions"]) || defaultValue; +} + +function debounce(callback) { + callback.running = false; + return () => { + if (!callback.running) { + callback.running = true; + setTimeout(() => { + callback(); + callback.running = false; + }, 300); + } + }; +} + export default { convertHtmlToItems, generateDropdown, generateDropdownItems, + validateDropdown, + getMaxSuggestionCount, + debounce, }; diff --git a/war/src/main/js/components/notifications/index.js b/src/main/js/components/notifications/index.js similarity index 100% rename from war/src/main/js/components/notifications/index.js rename to src/main/js/components/notifications/index.js diff --git a/war/src/main/js/components/row-selection-controller/index.js b/src/main/js/components/row-selection-controller/index.js similarity index 100% rename from war/src/main/js/components/row-selection-controller/index.js rename to src/main/js/components/row-selection-controller/index.js diff --git a/war/src/main/js/components/search-bar/index.js b/src/main/js/components/search-bar/index.js similarity index 100% rename from war/src/main/js/components/search-bar/index.js rename to src/main/js/components/search-bar/index.js diff --git a/war/src/main/js/components/stop-button-link/index.js b/src/main/js/components/stop-button-link/index.js similarity index 100% rename from war/src/main/js/components/stop-button-link/index.js rename to src/main/js/components/stop-button-link/index.js diff --git a/war/src/main/js/components/tooltips/index.js b/src/main/js/components/tooltips/index.js similarity index 100% rename from war/src/main/js/components/tooltips/index.js rename to src/main/js/components/tooltips/index.js diff --git a/war/src/main/js/handlebars-helpers/id.js b/src/main/js/handlebars-helpers/id.js similarity index 100% rename from war/src/main/js/handlebars-helpers/id.js rename to src/main/js/handlebars-helpers/id.js diff --git a/war/src/main/js/handlebars-helpers/ifeq.js b/src/main/js/handlebars-helpers/ifeq.js similarity index 100% rename from war/src/main/js/handlebars-helpers/ifeq.js rename to src/main/js/handlebars-helpers/ifeq.js diff --git a/war/src/main/js/handlebars-helpers/ifneq.js b/src/main/js/handlebars-helpers/ifneq.js similarity index 100% rename from war/src/main/js/handlebars-helpers/ifneq.js rename to src/main/js/handlebars-helpers/ifneq.js diff --git a/war/src/main/js/handlebars-helpers/in-array.js b/src/main/js/handlebars-helpers/in-array.js similarity index 100% rename from war/src/main/js/handlebars-helpers/in-array.js rename to src/main/js/handlebars-helpers/in-array.js diff --git a/war/src/main/js/handlebars-helpers/replace.js b/src/main/js/handlebars-helpers/replace.js similarity index 100% rename from war/src/main/js/handlebars-helpers/replace.js rename to src/main/js/handlebars-helpers/replace.js diff --git a/war/src/main/js/keyboard-shortcuts.js b/src/main/js/keyboard-shortcuts.js similarity index 100% rename from war/src/main/js/keyboard-shortcuts.js rename to src/main/js/keyboard-shortcuts.js diff --git a/war/src/main/js/pages/cloud-set/index.js b/src/main/js/pages/cloud-set/index.js similarity index 100% rename from war/src/main/js/pages/cloud-set/index.js rename to src/main/js/pages/cloud-set/index.js diff --git a/war/src/main/js/pages/cloud-set/index.scss b/src/main/js/pages/cloud-set/index.scss similarity index 100% rename from war/src/main/js/pages/cloud-set/index.scss rename to src/main/js/pages/cloud-set/index.scss diff --git a/war/src/main/js/pages/computer-set/index.js b/src/main/js/pages/computer-set/index.js similarity index 100% rename from war/src/main/js/pages/computer-set/index.js rename to src/main/js/pages/computer-set/index.js diff --git a/war/src/main/js/pages/dashboard/index.js b/src/main/js/pages/dashboard/index.js similarity index 100% rename from war/src/main/js/pages/dashboard/index.js rename to src/main/js/pages/dashboard/index.js diff --git a/war/src/main/js/pages/manage-jenkins/index.js b/src/main/js/pages/manage-jenkins/index.js similarity index 100% rename from war/src/main/js/pages/manage-jenkins/index.js rename to src/main/js/pages/manage-jenkins/index.js diff --git a/war/src/main/js/pages/manage-jenkins/system-information/index.js b/src/main/js/pages/manage-jenkins/system-information/index.js similarity index 100% rename from war/src/main/js/pages/manage-jenkins/system-information/index.js rename to src/main/js/pages/manage-jenkins/system-information/index.js diff --git a/war/src/main/js/pages/project/builds-card.js b/src/main/js/pages/project/builds-card.js similarity index 100% rename from war/src/main/js/pages/project/builds-card.js rename to src/main/js/pages/project/builds-card.js diff --git a/war/src/main/js/pages/project/builds-card.types.js b/src/main/js/pages/project/builds-card.types.js similarity index 100% rename from war/src/main/js/pages/project/builds-card.types.js rename to src/main/js/pages/project/builds-card.types.js diff --git a/war/src/main/js/pages/register/index.js b/src/main/js/pages/register/index.js similarity index 100% rename from war/src/main/js/pages/register/index.js rename to src/main/js/pages/register/index.js diff --git a/war/src/main/js/plugin-manager-ui.js b/src/main/js/plugin-manager-ui.js similarity index 100% rename from war/src/main/js/plugin-manager-ui.js rename to src/main/js/plugin-manager-ui.js diff --git a/war/src/main/js/plugin-setup-wizard/bootstrap-detached.js b/src/main/js/plugin-setup-wizard/bootstrap-detached.js similarity index 100% rename from war/src/main/js/plugin-setup-wizard/bootstrap-detached.js rename to src/main/js/plugin-setup-wizard/bootstrap-detached.js diff --git a/war/src/main/js/pluginSetupWizard.js b/src/main/js/pluginSetupWizard.js similarity index 100% rename from war/src/main/js/pluginSetupWizard.js rename to src/main/js/pluginSetupWizard.js diff --git a/war/src/main/js/pluginSetupWizardGui.js b/src/main/js/pluginSetupWizardGui.js similarity index 100% rename from war/src/main/js/pluginSetupWizardGui.js rename to src/main/js/pluginSetupWizardGui.js diff --git a/war/src/main/js/section-to-sidebar-items.js b/src/main/js/section-to-sidebar-items.js similarity index 97% rename from war/src/main/js/section-to-sidebar-items.js rename to src/main/js/section-to-sidebar-items.js index 38683e995f5b..54a6ff6e10a5 100644 --- a/war/src/main/js/section-to-sidebar-items.js +++ b/src/main/js/section-to-sidebar-items.js @@ -1,7 +1,7 @@ import { createElementFromHtml, toId } from "./util/dom"; const HEADER_SELECTOR = - ".config-table .jenkins-app-bar h2, .config-table > .jenkins-section > .jenkins-section__title"; + ".config-table .jenkins-app-bar h2, .config-table > .jenkins-section > .jenkins-section__title, .config-table > section > .jenkins-section > .jenkins-section__title"; const DEFAULT_ICON = ``; window.addEventListener("load", function () { diff --git a/war/src/main/js/section-to-tabs.js b/src/main/js/section-to-tabs.js similarity index 100% rename from war/src/main/js/section-to-tabs.js rename to src/main/js/section-to-tabs.js diff --git a/war/src/main/js/sortable-drag-drop.js b/src/main/js/sortable-drag-drop.js similarity index 100% rename from war/src/main/js/sortable-drag-drop.js rename to src/main/js/sortable-drag-drop.js diff --git a/war/src/main/js/templates/configureInstance.hbs b/src/main/js/templates/configureInstance.hbs similarity index 100% rename from war/src/main/js/templates/configureInstance.hbs rename to src/main/js/templates/configureInstance.hbs diff --git a/war/src/main/js/templates/errorPanel.hbs b/src/main/js/templates/errorPanel.hbs similarity index 100% rename from war/src/main/js/templates/errorPanel.hbs rename to src/main/js/templates/errorPanel.hbs diff --git a/war/src/main/js/templates/firstUserPanel.hbs b/src/main/js/templates/firstUserPanel.hbs similarity index 100% rename from war/src/main/js/templates/firstUserPanel.hbs rename to src/main/js/templates/firstUserPanel.hbs diff --git a/war/src/main/js/templates/incompleteInstallationPanel.hbs b/src/main/js/templates/incompleteInstallationPanel.hbs similarity index 100% rename from war/src/main/js/templates/incompleteInstallationPanel.hbs rename to src/main/js/templates/incompleteInstallationPanel.hbs diff --git a/war/src/main/js/templates/loadingPanel.hbs b/src/main/js/templates/loadingPanel.hbs similarity index 100% rename from war/src/main/js/templates/loadingPanel.hbs rename to src/main/js/templates/loadingPanel.hbs diff --git a/war/src/main/js/templates/offlinePanel.hbs b/src/main/js/templates/offlinePanel.hbs similarity index 100% rename from war/src/main/js/templates/offlinePanel.hbs rename to src/main/js/templates/offlinePanel.hbs diff --git a/war/src/main/js/templates/plugin-manager/available.hbs b/src/main/js/templates/plugin-manager/available.hbs similarity index 100% rename from war/src/main/js/templates/plugin-manager/available.hbs rename to src/main/js/templates/plugin-manager/available.hbs diff --git a/war/src/main/js/templates/pluginSelectList.hbs b/src/main/js/templates/pluginSelectList.hbs similarity index 100% rename from war/src/main/js/templates/pluginSelectList.hbs rename to src/main/js/templates/pluginSelectList.hbs diff --git a/war/src/main/js/templates/pluginSelectionPanel.hbs b/src/main/js/templates/pluginSelectionPanel.hbs similarity index 100% rename from war/src/main/js/templates/pluginSelectionPanel.hbs rename to src/main/js/templates/pluginSelectionPanel.hbs diff --git a/war/src/main/js/templates/pluginSetupWizard.hbs b/src/main/js/templates/pluginSetupWizard.hbs similarity index 100% rename from war/src/main/js/templates/pluginSetupWizard.hbs rename to src/main/js/templates/pluginSetupWizard.hbs diff --git a/war/src/main/js/templates/progressPanel.hbs b/src/main/js/templates/progressPanel.hbs similarity index 100% rename from war/src/main/js/templates/progressPanel.hbs rename to src/main/js/templates/progressPanel.hbs diff --git a/war/src/main/js/templates/proxyConfigPanel.hbs b/src/main/js/templates/proxyConfigPanel.hbs similarity index 100% rename from war/src/main/js/templates/proxyConfigPanel.hbs rename to src/main/js/templates/proxyConfigPanel.hbs diff --git a/war/src/main/js/templates/setupCompletePanel.hbs b/src/main/js/templates/setupCompletePanel.hbs similarity index 100% rename from war/src/main/js/templates/setupCompletePanel.hbs rename to src/main/js/templates/setupCompletePanel.hbs diff --git a/war/src/main/js/templates/successPanel.hbs b/src/main/js/templates/successPanel.hbs similarity index 100% rename from war/src/main/js/templates/successPanel.hbs rename to src/main/js/templates/successPanel.hbs diff --git a/war/src/main/js/templates/welcomePanel.hbs b/src/main/js/templates/welcomePanel.hbs similarity index 100% rename from war/src/main/js/templates/welcomePanel.hbs rename to src/main/js/templates/welcomePanel.hbs diff --git a/war/src/main/js/util/behavior-shim.js b/src/main/js/util/behavior-shim.js similarity index 100% rename from war/src/main/js/util/behavior-shim.js rename to src/main/js/util/behavior-shim.js diff --git a/war/src/main/js/util/dom.js b/src/main/js/util/dom.js similarity index 100% rename from war/src/main/js/util/dom.js rename to src/main/js/util/dom.js diff --git a/war/src/main/js/util/i18n.js b/src/main/js/util/i18n.js similarity index 100% rename from war/src/main/js/util/i18n.js rename to src/main/js/util/i18n.js diff --git a/war/src/main/js/util/jenkins.js b/src/main/js/util/jenkins.js similarity index 100% rename from war/src/main/js/util/jenkins.js rename to src/main/js/util/jenkins.js diff --git a/war/src/main/js/util/jenkinsLocalStorage.js b/src/main/js/util/jenkinsLocalStorage.js similarity index 100% rename from war/src/main/js/util/jenkinsLocalStorage.js rename to src/main/js/util/jenkinsLocalStorage.js diff --git a/war/src/main/js/util/jquery-ext.js b/src/main/js/util/jquery-ext.js similarity index 100% rename from war/src/main/js/util/jquery-ext.js rename to src/main/js/util/jquery-ext.js diff --git a/war/src/main/js/util/keyboard.js b/src/main/js/util/keyboard.js similarity index 100% rename from war/src/main/js/util/keyboard.js rename to src/main/js/util/keyboard.js diff --git a/war/src/main/js/util/localStorage.js b/src/main/js/util/localStorage.js similarity index 100% rename from war/src/main/js/util/localStorage.js rename to src/main/js/util/localStorage.js diff --git a/war/src/main/js/util/page.js b/src/main/js/util/page.js similarity index 100% rename from war/src/main/js/util/page.js rename to src/main/js/util/page.js diff --git a/war/src/main/js/util/path.js b/src/main/js/util/path.js similarity index 100% rename from war/src/main/js/util/path.js rename to src/main/js/util/path.js diff --git a/war/src/main/js/util/security.js b/src/main/js/util/security.js similarity index 100% rename from war/src/main/js/util/security.js rename to src/main/js/util/security.js diff --git a/war/src/main/js/util/symbols.js b/src/main/js/util/symbols.js similarity index 100% rename from war/src/main/js/util/symbols.js rename to src/main/js/util/symbols.js diff --git a/war/src/main/js/widgets/add/addform.scss b/src/main/js/widgets/add/addform.scss similarity index 100% rename from war/src/main/js/widgets/add/addform.scss rename to src/main/js/widgets/add/addform.scss diff --git a/war/src/main/scss/_bootstrap.scss b/src/main/scss/_bootstrap.scss similarity index 100% rename from war/src/main/scss/_bootstrap.scss rename to src/main/scss/_bootstrap.scss diff --git a/war/src/main/scss/abstracts/_colors.scss b/src/main/scss/abstracts/_colors.scss similarity index 100% rename from war/src/main/scss/abstracts/_colors.scss rename to src/main/scss/abstracts/_colors.scss diff --git a/war/src/main/scss/abstracts/_index.scss b/src/main/scss/abstracts/_index.scss similarity index 100% rename from war/src/main/scss/abstracts/_index.scss rename to src/main/scss/abstracts/_index.scss diff --git a/war/src/main/scss/abstracts/_mixins.scss b/src/main/scss/abstracts/_mixins.scss similarity index 100% rename from war/src/main/scss/abstracts/_mixins.scss rename to src/main/scss/abstracts/_mixins.scss diff --git a/war/src/main/scss/abstracts/_theme.scss b/src/main/scss/abstracts/_theme.scss similarity index 96% rename from war/src/main/scss/abstracts/_theme.scss rename to src/main/scss/abstracts/_theme.scss index c108634f7c85..0558369c9ac3 100644 --- a/war/src/main/scss/abstracts/_theme.scss +++ b/src/main/scss/abstracts/_theme.scss @@ -331,12 +331,6 @@ $semantics: ( // Plugin manager --plugin-manager-bg-color-already-upgraded: var(--light-grey); - --plugin-manager-category-link-bg-color: var(--very-light-grey); - --plugin-manager-category-link-bg-color--hover: #f2f2f2; - --plugin-manager-category-link-border-color: var(--medium-grey); - --plugin-manager-category-link-border-color--hover: var(--black); - --plugin-manager-category-text-color: var(--text-color); - --plugin-manager-category-link-color--hover: var(--text-color); // Auto complete --auto-complete-bg-color--prehighlight: #b3d4ff; diff --git a/war/src/main/scss/base/_breakpoints.scss b/src/main/scss/base/_breakpoints.scss similarity index 100% rename from war/src/main/scss/base/_breakpoints.scss rename to src/main/scss/base/_breakpoints.scss diff --git a/war/src/main/scss/base/_core.scss b/src/main/scss/base/_core.scss similarity index 100% rename from war/src/main/scss/base/_core.scss rename to src/main/scss/base/_core.scss diff --git a/war/src/main/scss/base/_display.scss b/src/main/scss/base/_display.scss similarity index 100% rename from war/src/main/scss/base/_display.scss rename to src/main/scss/base/_display.scss diff --git a/war/src/main/scss/base/_index.scss b/src/main/scss/base/_index.scss similarity index 100% rename from war/src/main/scss/base/_index.scss rename to src/main/scss/base/_index.scss diff --git a/war/src/main/scss/base/_layout-commons.scss b/src/main/scss/base/_layout-commons.scss similarity index 100% rename from war/src/main/scss/base/_layout-commons.scss rename to src/main/scss/base/_layout-commons.scss diff --git a/war/src/main/scss/base/_spacing.scss b/src/main/scss/base/_spacing.scss similarity index 100% rename from war/src/main/scss/base/_spacing.scss rename to src/main/scss/base/_spacing.scss diff --git a/war/src/main/scss/base/_style.scss b/src/main/scss/base/_style.scss similarity index 98% rename from war/src/main/scss/base/_style.scss rename to src/main/scss/base/_style.scss index e586248d18a8..273d583d4ca9 100644 --- a/war/src/main/scss/base/_style.scss +++ b/src/main/scss/base/_style.scss @@ -406,14 +406,6 @@ img.icon-help { vertical-align: text-top; } -/* ============================ list view entries ======================== */ -div.listview-jobs { - max-height: 300px; - overflow: auto; - margin-left: -15px; - padding-left: 15px; -} - /* ============================ health report hover ========================== */ .healthReport a { diff --git a/war/src/main/scss/base/_typography.scss b/src/main/scss/base/_typography.scss similarity index 100% rename from war/src/main/scss/base/_typography.scss rename to src/main/scss/base/_typography.scss diff --git a/war/src/main/scss/base/_visibility-utils.scss b/src/main/scss/base/_visibility-utils.scss similarity index 100% rename from war/src/main/scss/base/_visibility-utils.scss rename to src/main/scss/base/_visibility-utils.scss diff --git a/war/src/main/scss/base/_yui-compatibility.scss b/src/main/scss/base/_yui-compatibility.scss similarity index 100% rename from war/src/main/scss/base/_yui-compatibility.scss rename to src/main/scss/base/_yui-compatibility.scss diff --git a/war/src/main/scss/components/_alert.scss b/src/main/scss/components/_alert.scss similarity index 100% rename from war/src/main/scss/components/_alert.scss rename to src/main/scss/components/_alert.scss diff --git a/war/src/main/scss/components/_app-bar.scss b/src/main/scss/components/_app-bar.scss similarity index 100% rename from war/src/main/scss/components/_app-bar.scss rename to src/main/scss/components/_app-bar.scss diff --git a/src/main/scss/components/_badges.scss b/src/main/scss/components/_badges.scss new file mode 100644 index 000000000000..45fc8b9dc803 --- /dev/null +++ b/src/main/scss/components/_badges.scss @@ -0,0 +1,24 @@ +.jenkins-badge { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 100px; + font-size: 0.6875rem; + font-weight: 400; + min-height: 20px; + min-width: 20px; + padding: 0 0.4rem; + background: color-mix( + in sRGB, + var(--text-color-secondary) 12.5%, + transparent + ); + + &[class*="color"] { + background: color-mix(in sRGB, var(--color) 85%, transparent); + color: var(--white) !important; + box-shadow: inset 0 -1px 2px var(--color, var(--text-color-secondary)); + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + backdrop-filter: blur(2.5px); + } +} diff --git a/war/src/main/scss/components/_breadcrumbs.scss b/src/main/scss/components/_breadcrumbs.scss similarity index 100% rename from war/src/main/scss/components/_breadcrumbs.scss rename to src/main/scss/components/_breadcrumbs.scss diff --git a/war/src/main/scss/components/_buttons-deprecated.scss b/src/main/scss/components/_buttons-deprecated.scss similarity index 100% rename from war/src/main/scss/components/_buttons-deprecated.scss rename to src/main/scss/components/_buttons-deprecated.scss diff --git a/war/src/main/scss/components/_buttons.scss b/src/main/scss/components/_buttons.scss similarity index 100% rename from war/src/main/scss/components/_buttons.scss rename to src/main/scss/components/_buttons.scss diff --git a/war/src/main/scss/components/_cards.scss b/src/main/scss/components/_cards.scss similarity index 100% rename from war/src/main/scss/components/_cards.scss rename to src/main/scss/components/_cards.scss diff --git a/war/src/main/scss/components/_content-blocks.scss b/src/main/scss/components/_content-blocks.scss similarity index 100% rename from war/src/main/scss/components/_content-blocks.scss rename to src/main/scss/components/_content-blocks.scss diff --git a/war/src/main/scss/components/_dialogs.scss b/src/main/scss/components/_dialogs.scss similarity index 100% rename from war/src/main/scss/components/_dialogs.scss rename to src/main/scss/components/_dialogs.scss diff --git a/war/src/main/scss/components/_dropdowns.scss b/src/main/scss/components/_dropdowns.scss similarity index 100% rename from war/src/main/scss/components/_dropdowns.scss rename to src/main/scss/components/_dropdowns.scss diff --git a/war/src/main/scss/components/_icons.scss b/src/main/scss/components/_icons.scss similarity index 100% rename from war/src/main/scss/components/_icons.scss rename to src/main/scss/components/_icons.scss diff --git a/war/src/main/scss/components/_index.scss b/src/main/scss/components/_index.scss similarity index 100% rename from war/src/main/scss/components/_index.scss rename to src/main/scss/components/_index.scss diff --git a/war/src/main/scss/components/_notice.scss b/src/main/scss/components/_notice.scss similarity index 100% rename from war/src/main/scss/components/_notice.scss rename to src/main/scss/components/_notice.scss diff --git a/war/src/main/scss/components/_notifications.scss b/src/main/scss/components/_notifications.scss similarity index 100% rename from war/src/main/scss/components/_notifications.scss rename to src/main/scss/components/_notifications.scss diff --git a/war/src/main/scss/components/_page-footer.scss b/src/main/scss/components/_page-footer.scss similarity index 100% rename from war/src/main/scss/components/_page-footer.scss rename to src/main/scss/components/_page-footer.scss diff --git a/war/src/main/scss/components/_page-header.scss b/src/main/scss/components/_page-header.scss similarity index 100% rename from war/src/main/scss/components/_page-header.scss rename to src/main/scss/components/_page-header.scss diff --git a/war/src/main/scss/components/_panes-and-bigtable.scss b/src/main/scss/components/_panes-and-bigtable.scss similarity index 100% rename from war/src/main/scss/components/_panes-and-bigtable.scss rename to src/main/scss/components/_panes-and-bigtable.scss diff --git a/war/src/main/scss/components/_progress-animation.scss b/src/main/scss/components/_progress-animation.scss similarity index 100% rename from war/src/main/scss/components/_progress-animation.scss rename to src/main/scss/components/_progress-animation.scss diff --git a/war/src/main/scss/components/_progress-bar.scss b/src/main/scss/components/_progress-bar.scss similarity index 100% rename from war/src/main/scss/components/_progress-bar.scss rename to src/main/scss/components/_progress-bar.scss diff --git a/war/src/main/scss/components/_row-selection-controller.scss b/src/main/scss/components/_row-selection-controller.scss similarity index 100% rename from war/src/main/scss/components/_row-selection-controller.scss rename to src/main/scss/components/_row-selection-controller.scss diff --git a/war/src/main/scss/components/_section.scss b/src/main/scss/components/_section.scss similarity index 98% rename from war/src/main/scss/components/_section.scss rename to src/main/scss/components/_section.scss index 4e0768d8f6e0..4519554ff849 100644 --- a/war/src/main/scss/components/_section.scss +++ b/src/main/scss/components/_section.scss @@ -36,7 +36,7 @@ .jenkins-section__description { // Tweaked margin so that it appears visually centred when placed next to `.jenkins-section__title` - margin: -0.5rem 0 1rem; + margin: -0.8125rem 0 1rem; color: var(--text-color-secondary); line-height: 1.66; } diff --git a/war/src/main/scss/components/_side-panel-tasks.scss b/src/main/scss/components/_side-panel-tasks.scss similarity index 100% rename from war/src/main/scss/components/_side-panel-tasks.scss rename to src/main/scss/components/_side-panel-tasks.scss diff --git a/war/src/main/scss/components/_side-panel-widgets.scss b/src/main/scss/components/_side-panel-widgets.scss similarity index 100% rename from war/src/main/scss/components/_side-panel-widgets.scss rename to src/main/scss/components/_side-panel-widgets.scss diff --git a/war/src/main/scss/components/_skip-link.scss b/src/main/scss/components/_skip-link.scss similarity index 100% rename from war/src/main/scss/components/_skip-link.scss rename to src/main/scss/components/_skip-link.scss diff --git a/war/src/main/scss/components/_spinner.scss b/src/main/scss/components/_spinner.scss similarity index 100% rename from war/src/main/scss/components/_spinner.scss rename to src/main/scss/components/_spinner.scss diff --git a/war/src/main/scss/components/_table.scss b/src/main/scss/components/_table.scss similarity index 100% rename from war/src/main/scss/components/_table.scss rename to src/main/scss/components/_table.scss diff --git a/war/src/main/scss/components/_tabs.scss b/src/main/scss/components/_tabs.scss similarity index 100% rename from war/src/main/scss/components/_tabs.scss rename to src/main/scss/components/_tabs.scss diff --git a/war/src/main/scss/components/_tooltips.scss b/src/main/scss/components/_tooltips.scss similarity index 100% rename from war/src/main/scss/components/_tooltips.scss rename to src/main/scss/components/_tooltips.scss diff --git a/war/src/main/scss/form/_checkbox.scss b/src/main/scss/form/_checkbox.scss similarity index 99% rename from war/src/main/scss/form/_checkbox.scss rename to src/main/scss/form/_checkbox.scss index d9cd5f18c951..6e5633dd991f 100644 --- a/war/src/main/scss/form/_checkbox.scss +++ b/src/main/scss/form/_checkbox.scss @@ -187,9 +187,7 @@ } .jenkins-checkbox__description { - margin-top: 0.3rem; margin-left: 34px; - margin-bottom: 1rem; color: var(--text-color-secondary); line-height: 1.66; } diff --git a/war/src/main/scss/form/_codemirror.scss b/src/main/scss/form/_codemirror.scss similarity index 100% rename from war/src/main/scss/form/_codemirror.scss rename to src/main/scss/form/_codemirror.scss diff --git a/war/src/main/scss/form/_file-upload.scss b/src/main/scss/form/_file-upload.scss similarity index 100% rename from war/src/main/scss/form/_file-upload.scss rename to src/main/scss/form/_file-upload.scss diff --git a/war/src/main/scss/form/_index.scss b/src/main/scss/form/_index.scss similarity index 100% rename from war/src/main/scss/form/_index.scss rename to src/main/scss/form/_index.scss diff --git a/war/src/main/scss/form/_input.scss b/src/main/scss/form/_input.scss similarity index 100% rename from war/src/main/scss/form/_input.scss rename to src/main/scss/form/_input.scss diff --git a/war/src/main/scss/form/_layout.scss b/src/main/scss/form/_layout.scss similarity index 100% rename from war/src/main/scss/form/_layout.scss rename to src/main/scss/form/_layout.scss diff --git a/war/src/main/scss/form/_radio.scss b/src/main/scss/form/_radio.scss similarity index 100% rename from war/src/main/scss/form/_radio.scss rename to src/main/scss/form/_radio.scss diff --git a/war/src/main/scss/form/_reorderable-list.scss b/src/main/scss/form/_reorderable-list.scss similarity index 100% rename from war/src/main/scss/form/_reorderable-list.scss rename to src/main/scss/form/_reorderable-list.scss diff --git a/war/src/main/scss/form/_search-bar.scss b/src/main/scss/form/_search-bar.scss similarity index 100% rename from war/src/main/scss/form/_search-bar.scss rename to src/main/scss/form/_search-bar.scss diff --git a/war/src/main/scss/form/_select.scss b/src/main/scss/form/_select.scss similarity index 100% rename from war/src/main/scss/form/_select.scss rename to src/main/scss/form/_select.scss diff --git a/war/src/main/scss/form/_textarea.scss b/src/main/scss/form/_textarea.scss similarity index 100% rename from war/src/main/scss/form/_textarea.scss rename to src/main/scss/form/_textarea.scss diff --git a/war/src/main/scss/form/_toggle-switch.scss b/src/main/scss/form/_toggle-switch.scss similarity index 100% rename from war/src/main/scss/form/_toggle-switch.scss rename to src/main/scss/form/_toggle-switch.scss diff --git a/war/src/main/scss/form/_validation.scss b/src/main/scss/form/_validation.scss similarity index 100% rename from war/src/main/scss/form/_validation.scss rename to src/main/scss/form/_validation.scss diff --git a/war/src/main/scss/pages/_about.scss b/src/main/scss/pages/_about.scss similarity index 100% rename from war/src/main/scss/pages/_about.scss rename to src/main/scss/pages/_about.scss diff --git a/war/src/main/scss/pages/_build.scss b/src/main/scss/pages/_build.scss similarity index 100% rename from war/src/main/scss/pages/_build.scss rename to src/main/scss/pages/_build.scss diff --git a/war/src/main/scss/pages/_dashboard.scss b/src/main/scss/pages/_dashboard.scss similarity index 92% rename from war/src/main/scss/pages/_dashboard.scss rename to src/main/scss/pages/_dashboard.scss index 3ace60fac309..4d6f49017566 100644 --- a/war/src/main/scss/pages/_dashboard.scss +++ b/src/main/scss/pages/_dashboard.scss @@ -180,3 +180,17 @@ $min-button-size: 36px; height: 1rem; } } + +div.listview-jobs { + display: flex; + flex-direction: column; + gap: 0.3rem; + + &--nested { + display: flex; + flex-direction: column; + border-left: 2px solid color-mix(in sRGB, var(--input-border), transparent); + margin-left: 10px; + padding-left: 22px; + } +} diff --git a/war/src/main/scss/pages/_icon-legend.scss b/src/main/scss/pages/_icon-legend.scss similarity index 100% rename from war/src/main/scss/pages/_icon-legend.scss rename to src/main/scss/pages/_icon-legend.scss diff --git a/war/src/main/scss/pages/_index.scss b/src/main/scss/pages/_index.scss similarity index 100% rename from war/src/main/scss/pages/_index.scss rename to src/main/scss/pages/_index.scss diff --git a/war/src/main/scss/pages/_job.scss b/src/main/scss/pages/_job.scss similarity index 95% rename from war/src/main/scss/pages/_job.scss rename to src/main/scss/pages/_job.scss index 3b982fcffcf4..8692d19dc3f9 100644 --- a/war/src/main/scss/pages/_job.scss +++ b/src/main/scss/pages/_job.scss @@ -129,9 +129,12 @@ font-weight: 450; flex-grow: 1; padding: 0.45rem 0 0; + word-break: normal; + overflow-wrap: anywhere; .app-builds-container__item__time { color: var(--text-color-secondary); + white-space: nowrap; } } @@ -168,6 +171,8 @@ padding-left: 2.25rem; margin-top: -2px; grid-column: 1 / span 2; + word-break: normal; + overflow-wrap: anywhere; &::before { content: ""; diff --git a/war/src/main/scss/pages/_manage-jenkins.scss b/src/main/scss/pages/_manage-jenkins.scss similarity index 100% rename from war/src/main/scss/pages/_manage-jenkins.scss rename to src/main/scss/pages/_manage-jenkins.scss diff --git a/war/src/main/scss/pages/_plugin-manager.scss b/src/main/scss/pages/_plugin-manager.scss similarity index 100% rename from war/src/main/scss/pages/_plugin-manager.scss rename to src/main/scss/pages/_plugin-manager.scss diff --git a/war/src/main/scss/pages/_setupWizardConfigureInstance.scss b/src/main/scss/pages/_setupWizardConfigureInstance.scss similarity index 100% rename from war/src/main/scss/pages/_setupWizardConfigureInstance.scss rename to src/main/scss/pages/_setupWizardConfigureInstance.scss diff --git a/war/src/main/scss/pages/_setupWizardFirstUser.scss b/src/main/scss/pages/_setupWizardFirstUser.scss similarity index 100% rename from war/src/main/scss/pages/_setupWizardFirstUser.scss rename to src/main/scss/pages/_setupWizardFirstUser.scss diff --git a/war/src/main/scss/pages/_sign-in-register.scss b/src/main/scss/pages/_sign-in-register.scss similarity index 100% rename from war/src/main/scss/pages/_sign-in-register.scss rename to src/main/scss/pages/_sign-in-register.scss diff --git a/war/src/main/scss/pluginSetupWizard.scss b/src/main/scss/pluginSetupWizard.scss similarity index 100% rename from war/src/main/scss/pluginSetupWizard.scss rename to src/main/scss/pluginSetupWizard.scss diff --git a/war/src/main/scss/simple-page.scss b/src/main/scss/simple-page.scss similarity index 100% rename from war/src/main/scss/simple-page.scss rename to src/main/scss/simple-page.scss diff --git a/war/src/main/scss/styles.scss b/src/main/scss/styles.scss similarity index 100% rename from war/src/main/scss/styles.scss rename to src/main/scss/styles.scss diff --git a/test/pom.xml b/test/pom.xml index 0f3aa999e08e..3933966bdadb 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -106,19 +106,19 @@ THE SOFTWARE. org.jenkins-ci.plugins display-url-api - 2.204.vf6fddd8a_8b_e9 + 2.209.v582ed814ff2f org.jenkins-ci.plugins scm-api - 696.v778d637b_a_762 + 698.v8e3b_c788f0a_6 org.jenkins-ci.plugins script-security - 1362.v67dc1f0e1b_b_3 + 1367.vdf2fc45f229c org.jenkins-ci.plugins.workflow @@ -134,7 +134,7 @@ THE SOFTWARE. org.jenkins-ci.plugins.workflow workflow-support - 926.v9f4f9b_b_98c19 + 930.vf51d22b_ce488 @@ -178,7 +178,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-test-harness - 2289.vfd344a_6d1660 + 2345.v699712948764 test @@ -206,7 +206,7 @@ THE SOFTWARE. org.jenkins-ci.modules instance-identity - 185.v303dc7c645f9 + 201.vd2a_b_5a_468a_a_6 test @@ -218,37 +218,37 @@ THE SOFTWARE. org.jenkins-ci.plugins cloudbees-folder - 6.951.v5f91d88d76b_b_ + 6.955.v81e2a_35c08d3 test org.jenkins-ci.plugins credentials - 1378.v81ef4269d764 + 1389.vd7a_b_f5fa_50a_2 test org.jenkins-ci.plugins junit - 1300.v03d9d8a_cf1fb_ + 1307.vdd5b_2646279e test org.jenkins-ci.plugins mailer - 472.vf7c289a_4b_420 + 489.vd4b_25144138f test org.jenkins-ci.plugins matrix-auth - 3.2.2 + 3.2.3 test org.jenkins-ci.plugins matrix-project - 832.va_66e270d2946 + 840.v812f627cb_578 test diff --git a/test/src/test/java/hudson/PluginManagerTest.java b/test/src/test/java/hudson/PluginManagerTest.java index b75d8fc2f66f..ec25bc96a39f 100644 --- a/test/src/test/java/hudson/PluginManagerTest.java +++ b/test/src/test/java/hudson/PluginManagerTest.java @@ -759,7 +759,7 @@ public void verifyUploadedPluginPermission() throws Exception { File dir = tmp.newFolder(); File plugin = new File(dir, "htmlpublisher.jpi"); FileUtils.copyURLToFile(Objects.requireNonNull(getClass().getClassLoader().getResource("plugins/htmlpublisher.jpi")), plugin); - f.getInputByName("name").setValueAttribute(plugin.getAbsolutePath()); + f.getInputByName("name").setValue(plugin.getAbsolutePath()); r.submit(f); File filesRef = Files.createTempFile("tmp", ".tmp").toFile(); diff --git a/test/src/test/java/hudson/cli/DeleteBuildsCommandTest.java b/test/src/test/java/hudson/cli/DeleteBuildsCommandTest.java index dfac64fc1b5a..08e6552f610e 100644 --- a/test/src/test/java/hudson/cli/DeleteBuildsCommandTest.java +++ b/test/src/test/java/hudson/cli/DeleteBuildsCommandTest.java @@ -32,21 +32,19 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.junit.Assert.assertNotNull; -import static org.junit.Assume.assumeFalse; -import hudson.Functions; import hudson.model.ExecutorTest; import hudson.model.FreeStyleProject; import hudson.model.Item; +import hudson.model.Result; import hudson.model.Run; import hudson.model.labels.LabelAtom; import hudson.tasks.Shell; -import java.io.IOException; import jenkins.model.Jenkins; -import org.junit.AssumptionViolatedException; import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; /** @@ -139,24 +137,21 @@ public class DeleteBuildsCommandTest { assertThat(result.stdout(), containsString("Deleted 0 builds")); } - @Test public void deleteBuildsShouldSuccessEvenTheBuildIsRunning() throws Exception { - assumeFalse("You can't delete files that are in use on Windows", Functions.isWindows()); + @Issue("JENKINS-73835") + @Test public void deleteBuildsShouldFailIfTheBuildIsRunning() throws Exception { FreeStyleProject project = j.createFreeStyleProject("aProject"); - ExecutorTest.startBlockingBuild(project); + var build = ExecutorTest.startBlockingBuild(project); assertThat(((FreeStyleProject) j.jenkins.getItem("aProject")).getBuilds(), hasSize(1)); final CLICommandInvoker.Result result = command .authorizedTo(Jenkins.READ, Item.READ, Run.DELETE) .invokeWithArgs("aProject", "1"); - assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Deleted 1 builds")); - assertThat(((FreeStyleProject) j.jenkins.getItem("aProject")).getBuilds(), hasSize(0)); - assertThat(project.isBuilding(), equalTo(false)); - try { - project.delete(); - } catch (IOException | InterruptedException x) { - throw new AssumptionViolatedException("Could not delete test project (race condition?)", x); - } + assertThat(result, failedWith(1)); + assertThat(result, hasNoStandardOutput()); + assertThat(result.stderr(), containsString("Unable to delete aProject #1 because it is still running")); + + build.doStop(); + j.assertBuildStatus(Result.ABORTED, j.waitForCompletion(build)); } @Test public void deleteBuildsShouldSuccessEvenTheBuildIsStuckInTheQueue() throws Exception { diff --git a/test/src/test/java/hudson/cli/OfflineNodeCommandTest.java b/test/src/test/java/hudson/cli/OfflineNodeCommandTest.java index 564c1b098baf..878001e1b145 100644 --- a/test/src/test/java/hudson/cli/OfflineNodeCommandTest.java +++ b/test/src/test/java/hudson/cli/OfflineNodeCommandTest.java @@ -118,7 +118,7 @@ public void offlineNodeShouldSucceedOnOfflineNode() throws Exception { slave.toComputer().setTemporarilyOffline(true, null); assertThat(slave.toComputer().isOffline(), equalTo(true)); assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(true)); - assertThat(slave.toComputer().getOfflineCause(), equalTo(null)); + assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.LegacyOfflineCause.class)); final CLICommandInvoker.Result result = command .authorizedTo(Computer.DISCONNECT, Jenkins.READ) @@ -177,7 +177,7 @@ public void offlineNodeShouldSucceedOnOfflineNodeWithCause() throws Exception { slave.toComputer().setTemporarilyOffline(true, null); assertThat(slave.toComputer().isOffline(), equalTo(true)); assertThat(slave.toComputer().isTemporarilyOffline(), equalTo(true)); - assertThat(slave.toComputer().getOfflineCause(), equalTo(null)); + assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.LegacyOfflineCause.class)); final CLICommandInvoker.Result result = command .authorizedTo(Computer.DISCONNECT, Jenkins.READ) diff --git a/test/src/test/java/hudson/cli/PlainCLIProtocolTest.java b/test/src/test/java/hudson/cli/PlainCLIProtocolTest.java new file mode 100644 index 000000000000..d9081ed6910f --- /dev/null +++ b/test/src/test/java/hudson/cli/PlainCLIProtocolTest.java @@ -0,0 +1,61 @@ +package hudson.cli; + +import static org.awaitility.Awaitility.await; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.hasItem; + +import java.io.IOException; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.util.logging.Level; +import org.junit.Rule; +import org.junit.jupiter.api.Test; +import org.jvnet.hudson.test.LoggerRule; + +public class PlainCLIProtocolTest { + + @Rule public LoggerRule logger = new LoggerRule().record(PlainCLIProtocol.class, Level.FINE).capture(50); + + @Test + public void streamCorruption() throws Exception { + final PipedOutputStream upload = new PipedOutputStream(); + final PipedOutputStream download = new PipedOutputStream(); + + class Server extends PlainCLIProtocol.ServerSide { + Server() throws IOException { + super(new PlainCLIProtocol.FramedOutput(download)); + } + + @Override + protected void onArg(String text) {} + + @Override + protected void onLocale(String text) {} + + @Override + protected void onEncoding(String text) {} + + @Override + protected synchronized void onStart() {} + + @Override + protected void onStdin(byte[] chunk) throws IOException {} + + @Override + protected void onEndStdin() throws IOException {} + + @Override + protected void handleClose() {} + } + + Server server = new Server(); + new PlainCLIProtocol.FramedReader(server, new PipedInputStream(upload)).start(); + // Trigger corruption + upload.write(0xFF); + upload.write(0xFF); + upload.write(0xFF); + upload.write(0xFF); + upload.flush(); + await().until(logger::getMessages, hasItem(containsString("Read back: 0xff 0xff 0xff 0xff"))); + } +} diff --git a/test/src/test/java/hudson/logging/LogRecorderManagerTest.java b/test/src/test/java/hudson/logging/LogRecorderManagerTest.java index 608e7eb0b464..101729038a33 100644 --- a/test/src/test/java/hudson/logging/LogRecorderManagerTest.java +++ b/test/src/test/java/hudson/logging/LogRecorderManagerTest.java @@ -229,7 +229,7 @@ public static class DeletingLogRecorderListener extends SaveableListener { private static boolean recordDeletion; @Override - public void onChange(Saveable o, XmlFile file) { + public void onDeleted(Saveable o, XmlFile file) { if (o instanceof LogRecorder && "dummy".equals(((LogRecorder) o).getName())) { if (!file.exists()) { recordDeletion = true; diff --git a/test/src/test/java/hudson/model/AbstractItemTest.java b/test/src/test/java/hudson/model/AbstractItemTest.java index 165c39a96e6e..8e2a5036b14a 100644 --- a/test/src/test/java/hudson/model/AbstractItemTest.java +++ b/test/src/test/java/hudson/model/AbstractItemTest.java @@ -6,6 +6,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; import hudson.ExtensionList; import hudson.XmlFile; @@ -33,6 +34,7 @@ import org.jvnet.hudson.test.MockAuthorizationStrategy; import org.jvnet.hudson.test.SleepBuilder; import org.jvnet.hudson.test.TestExtension; +import org.springframework.security.core.Authentication; public class AbstractItemTest { @@ -45,12 +47,21 @@ public class AbstractItemTest { @Test public void reload() throws Exception { Jenkins jenkins = j.jenkins; - FreeStyleProject p = jenkins.createProject(FreeStyleProject.class, "foo"); - p.setDescription("Hello World"); + jenkins.setSecurityRealm(j.createDummySecurityRealm()); + MockAuthorizationStrategy mas = new MockAuthorizationStrategy(); + mas.grant(Item.CONFIGURE).everywhere().to("alice", "bob"); + mas.grant(Item.READ).everywhere().to("alice"); - FreeStyleBuild b = j.buildAndAssertSuccess(p); - b.setDescription("This is my build"); + FreeStyleProject p; + FreeStyleBuild b; + var alice = User.getById("alice", true); + try (ACLContext ignored = ACL.as(alice)) { + p = jenkins.createProject(FreeStyleProject.class, "foo"); + p.setDescription("Hello World"); + b = j.buildAndAssertSuccess(p); + b.setDescription("This is my build"); + } // update on disk representation Path path = p.getConfigFile().getFile().toPath(); Files.writeString(path, Files.readString(path, StandardCharsets.UTF_8).replaceAll("Hello World", "Good Evening"), StandardCharsets.UTF_8); @@ -61,15 +72,25 @@ public void reload() throws Exception { // reload away p.doReload(); - assertFalse(SaveableListener.class.getSimpleName() + " should not have been called", testSaveableListener.wasCalled()); - - + assertFalse(SaveableListener.class.getSimpleName() + " should not have been called", testSaveableListener.isChangeCalled()); assertEquals("Good Evening", p.getDescription()); FreeStyleBuild b2 = p.getBuildByNumber(1); assertNotEquals(b, b2); // should be different object assertEquals(b.getDescription(), b2.getDescription()); // but should have the same properties + + try (var ignored = ACL.as(alice)) { + p.setDescription("This is Alice's project"); + } + assertTrue(SaveableListener.class.getSimpleName() + " should have been called", testSaveableListener.isChangeCalled()); + assertThat(testSaveableListener.getChangeUser(), equalTo(alice.impersonate2())); + + try (var ignored = ACL.as(alice)) { + p.delete(); + } + assertTrue(SaveableListener.class.getSimpleName() + " should have been called", testSaveableListener.isDeleteCalled()); + assertThat(testSaveableListener.getDeleteUser(), equalTo(alice.impersonate2())); } @Test @@ -158,20 +179,45 @@ private String getPath(URL u) { public static class TestSaveableListener extends SaveableListener { private Saveable saveable; - private boolean called; + private boolean changeCalled; + private Authentication changeUser; + + private boolean deleteCalled; + private Authentication deleteUser; private void setSaveable(Saveable saveable) { this.saveable = saveable; } - public boolean wasCalled() { - return called; + public boolean isChangeCalled() { + return changeCalled; + } + + public Authentication getChangeUser() { + return changeUser; + } + + public boolean isDeleteCalled() { + return deleteCalled; + } + + public Authentication getDeleteUser() { + return deleteUser; } @Override public void onChange(Saveable o, XmlFile file) { if (o == saveable) { - this.called = true; + changeCalled = true; + changeUser = Jenkins.getAuthentication2(); + } + } + + @Override + public void onDeleted(Saveable o, XmlFile file) { + if (o == saveable) { + deleteCalled = true; + deleteUser = Jenkins.getAuthentication2(); } } } diff --git a/test/src/test/java/hudson/model/ComputerSetTest.java b/test/src/test/java/hudson/model/ComputerSetTest.java index f40cf3e00c96..e137cbfec823 100644 --- a/test/src/test/java/hudson/model/ComputerSetTest.java +++ b/test/src/test/java/hudson/model/ComputerSetTest.java @@ -26,7 +26,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.is; @@ -91,10 +90,10 @@ public void nodeOfflineCli() throws Exception { @Test public void getComputerNames() throws Exception { assertThat(ComputerSet.getComputerNames(), is(empty())); - j.createSlave("aNode", "", null); - assertThat(ComputerSet.getComputerNames(), contains("aNode")); j.createSlave("anAnotherNode", "", null); - assertThat(ComputerSet.getComputerNames(), containsInAnyOrder("aNode", "anAnotherNode")); + assertThat(ComputerSet.getComputerNames(), contains("anAnotherNode")); + j.createSlave("aNode", "", null); + assertThat(ComputerSet.getComputerNames(), contains("aNode", "anAnotherNode")); } @Test diff --git a/test/src/test/java/hudson/model/ComputerTest.java b/test/src/test/java/hudson/model/ComputerTest.java index a3392ee448af..3acac9b9fcc9 100644 --- a/test/src/test/java/hudson/model/ComputerTest.java +++ b/test/src/test/java/hudson/model/ComputerTest.java @@ -128,6 +128,30 @@ public void doNotShowUserDetailsInOfflineCause() throws Exception { verifyOfflineCause(computer); } + @Test + public void offlineCauseRemainsAfterTemporaryCauseRemoved() throws Exception { + var agent = j.createSlave(); + var computer = agent.toComputer(); + var initialOfflineCause = new OfflineCause.UserCause(User.getOrCreateByIdOrFullName("username"), "Initial cause"); + computer.setOfflineCause(initialOfflineCause); + assertThat(computer.getOfflineCause(), equalTo(initialOfflineCause)); + var temporaryCause = new OfflineCause.UserCause(User.getOrCreateByIdOrFullName("username"), "msg"); + computer.setTemporarilyOffline(true, temporaryCause); + assertThat(computer.getOfflineCause(), equalTo(temporaryCause)); + computer.setTemporarilyOffline(false, null); + assertThat(computer.getOfflineCause(), equalTo(initialOfflineCause)); + } + + @Test + public void computerIconDependsOnOfflineCause() throws Exception { + var agent = j.createSlave(); + var computer = agent.toComputer(); + assertThat(computer.getIcon(), equalTo("symbol-computer-offline")); + var cause = new OfflineCause.IdleOfflineCause(); + computer.setOfflineCause(cause); + assertThat(computer.getIcon(), equalTo(cause.getComputerIcon())); + } + @Test @LocalData public void removeUserDetailsFromOfflineCause() throws Exception { Computer computer = j.jenkins.getComputer("deserialized"); diff --git a/test/src/test/java/hudson/model/NodeTest.java b/test/src/test/java/hudson/model/NodeTest.java index 39ffe25f7643..cae1c2120982 100644 --- a/test/src/test/java/hudson/model/NodeTest.java +++ b/test/src/test/java/hudson/model/NodeTest.java @@ -27,6 +27,8 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.endsWith; import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -102,7 +104,10 @@ public void testSetTemporaryOfflineCause() throws Exception { assertEquals("Node should have offline cause which was set.", cause, node.toComputer().getOfflineCause()); OfflineCause cause2 = new OfflineCause.ByCLI("another message"); node.setTemporaryOfflineCause(cause2); - assertEquals("Node should have original offline cause after setting another.", cause, node.toComputer().getOfflineCause()); + assertEquals("Node should have the new offline cause.", cause2, node.toComputer().getOfflineCause()); + // Exists in some plugins + node.toComputer().setTemporarilyOffline(false, new OfflineCause.ByCLI("A third message")); + assertThat(node.getTemporaryOfflineCause(), nullValue()); } @Test @@ -115,6 +120,8 @@ public void testOfflineCause() throws Exception { try (ACLContext ignored = ACL.as2(someone.impersonate2())) { computer.doToggleOffline("original message"); cause = (OfflineCause.UserCause) computer.getOfflineCause(); + assertThat(computer.getOfflineCauseReason(), is("original message")); + assertThat(computer.getTemporaryOfflineCauseReason(), is("original message")); assertTrue(cause.toString(), cause.toString().matches("^.*?Disconnected by someone@somewhere.com : original message")); assertEquals(someone, cause.getUser()); } @@ -122,6 +129,7 @@ public void testOfflineCause() throws Exception { try (ACLContext ignored = ACL.as2(root.impersonate2())) { computer.doChangeOfflineCause("new message"); cause = (OfflineCause.UserCause) computer.getOfflineCause(); + assertThat(computer.getTemporaryOfflineCauseReason(), is("new message")); assertTrue(cause.toString(), cause.toString().matches("^.*?Disconnected by root@localhost : new message")); assertEquals(root, cause.getUser()); diff --git a/test/src/test/java/hudson/model/RunTest.java b/test/src/test/java/hudson/model/RunTest.java index b6a145857020..4df895309abb 100644 --- a/test/src/test/java/hudson/model/RunTest.java +++ b/test/src/test/java/hudson/model/RunTest.java @@ -30,10 +30,14 @@ import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; +import hudson.ExtensionList; import hudson.FilePath; import hudson.Launcher; +import hudson.XmlFile; +import hudson.model.listeners.SaveableListener; import hudson.tasks.ArtifactArchiver; import hudson.tasks.BuildTrigger; import hudson.tasks.Builder; @@ -59,6 +63,7 @@ import org.junit.experimental.categories.Category; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.SleepBuilder; import org.jvnet.hudson.test.SmokeTest; import org.jvnet.hudson.test.TestExtension; import org.kohsuke.stapler.DataBoundConstructor; @@ -112,6 +117,29 @@ public class RunTest { FreeStyleBuild b = j.buildAndAssertSuccess(p); b.delete(); assertTrue(Mgr.deleted.get()); + assertTrue(ExtensionList.lookupSingleton(SaveableListenerImpl.class).deleted); + } + + @TestExtension("deleteArtifactsCustom") + public static class SaveableListenerImpl extends SaveableListener { + boolean deleted; + + @Override + public void onDeleted(Saveable o, XmlFile file) { + deleted = true; + } + } + + @Issue("JENKINS-73835") + @Test public void buildsMayNotBeDeletedWhileRunning() throws Exception { + var p = j.createFreeStyleProject(); + p.getBuildersList().add(new SleepBuilder(999999)); + var b = p.scheduleBuild2(0).waitForStart(); + var ex = assertThrows(IOException.class, () -> b.delete()); + assertThat(ex.getMessage(), containsString("Unable to delete " + b + " because it is still running")); + b.getExecutor().interrupt(); + j.waitForCompletion(b); + b.delete(); // Works fine. } @Issue("SECURITY-1902") diff --git a/test/src/test/java/hudson/model/UpdateCenterMigrationTest.java b/test/src/test/java/hudson/model/UpdateCenterMigrationTest.java new file mode 100644 index 000000000000..6d002dbcad91 --- /dev/null +++ b/test/src/test/java/hudson/model/UpdateCenterMigrationTest.java @@ -0,0 +1,35 @@ +package hudson.model; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.recipes.LocalData; + +public class UpdateCenterMigrationTest { + + @Rule + public JenkinsRule j = new JenkinsRule() { + @Override + protected void configureUpdateCenter() { + // Avoid reverse proxy + DownloadService.neverUpdate = true; + UpdateSite.neverUpdate = true; + } + }; + + @Issue("JENKINS-73760") + @LocalData + @Test + public void updateCenterMigration() { + UpdateSite site = j.jenkins.getUpdateCenter().getSites().stream() + .filter(s -> UpdateCenter.PREDEFINED_UPDATE_SITE_ID.equals(s.getId())) + .findFirst() + .orElseThrow(); + assertFalse(site.isLegacyDefault()); + assertEquals(j.jenkins.getUpdateCenter().getDefaultBaseUrl() + "update-center.json", site.getUrl()); + } +} diff --git a/test/src/test/java/hudson/model/UpdateSiteTest.java b/test/src/test/java/hudson/model/UpdateSiteTest.java index 629c7c7f46e8..293cca2de768 100644 --- a/test/src/test/java/hudson/model/UpdateSiteTest.java +++ b/test/src/test/java/hudson/model/UpdateSiteTest.java @@ -72,6 +72,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; public class UpdateSiteTest { @@ -205,6 +206,19 @@ public void shutdownWebserver() throws Exception { assertNotEquals("plugin data is present", Collections.emptyMap(), site.getData().plugins); } + @Issue("JENKINS-73760") + @Test + public void isLegacyDefault() { + assertFalse("isLegacyDefault should be false with null id", new UpdateSite(null, "url").isLegacyDefault()); + assertFalse( + "isLegacyDefault should be false when id is not default and url is http://updates.jenkins-ci.org/", + new UpdateSite("dummy", "http://updates.jenkins-ci.org/").isLegacyDefault()); + assertTrue( + "isLegacyDefault should be true when id is default and url is http://updates.jenkins-ci.org/", + new UpdateSite(UpdateCenter.PREDEFINED_UPDATE_SITE_ID, "http://updates.jenkins-ci.org/").isLegacyDefault()); + assertFalse("isLegacyDefault should be false with null url", new UpdateSite(null, null).isLegacyDefault()); + } + @Test public void getAvailables() throws Exception { UpdateSite site = getUpdateSite("/plugins/available-update-center.json"); List available = site.getAvailables(); diff --git a/test/src/test/java/hudson/tasks/LogRotatorTest.java b/test/src/test/java/hudson/tasks/LogRotatorTest.java index b72e837dbd86..d30d4d8115bc 100644 --- a/test/src/test/java/hudson/tasks/LogRotatorTest.java +++ b/test/src/test/java/hudson/tasks/LogRotatorTest.java @@ -31,7 +31,9 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeFalse; +import hudson.Functions; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.BuildListener; @@ -96,6 +98,19 @@ public void successVsFailureWithRemoveLastBuild() throws Exception { assertEquals(2, numberOf(project.getLastFailedBuild())); } + @Test + public void ableToDeleteCurrentBuild() throws Exception { + assumeFalse("Deleting the current build while is is completing does not work consistently on Windows", + Functions.isWindows()); + var p = j.createFreeStyleProject(); + // Keep 0 builds, i.e. immediately delete builds as they complete. + LogRotator logRotator = new LogRotator(-1, 0, -1, -1); + logRotator.setRemoveLastBuild(true); + p.setBuildDiscarder(logRotator); + j.buildAndAssertStatus(Result.SUCCESS, p); + assertNull(p.getBuildByNumber(1)); + } + @Test @Issue("JENKINS-2417") public void stableVsUnstable() throws Exception { diff --git a/test/src/test/java/jenkins/AgentProtocolTest.java b/test/src/test/java/jenkins/AgentProtocolTest.java deleted file mode 100644 index 531281109db7..000000000000 --- a/test/src/test/java/jenkins/AgentProtocolTest.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2017 CloudBees, Inc. - * - * 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: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package jenkins; - -import static org.junit.Assert.fail; - -import edu.umd.cs.findbugs.annotations.CheckForNull; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import jenkins.model.Jenkins; -import org.junit.Rule; -import org.junit.Test; -import org.jvnet.hudson.test.Issue; -import org.jvnet.hudson.test.JenkinsRule; -import org.jvnet.hudson.test.recipes.LocalData; - -/** - * Tests for {@link AgentProtocol}. - * - * @author Oleg Nenashev - */ -public class AgentProtocolTest { - - @Rule - public JenkinsRule j = new JenkinsRule(); - - @Test - @LocalData - @Issue("JENKINS-45841") - public void testShouldNotOverrideUserConfiguration() throws Exception { - assertEnabled("JNLP4-connect"); - assertDisabled("JNLP2-connect", "JNLP3-connect"); - assertProtocols(true, "System protocols should be always enabled", "Ping"); - } - - private void assertEnabled(String ... protocolNames) { - assertProtocols(true, null, protocolNames); - } - - private void assertDisabled(String ... protocolNames) { - assertProtocols(false, null, protocolNames); - } - - private void assertProtocols(boolean shouldBeEnabled, @CheckForNull String why, String ... protocolNames) { - assertProtocols(j.jenkins, shouldBeEnabled, why, protocolNames); - } - - public static void assertProtocols(Jenkins jenkins, boolean shouldBeEnabled, @CheckForNull String why, String ... protocolNames) { - Set agentProtocols = jenkins.getAgentProtocols(); - List failedChecks = new ArrayList<>(); - for (String protocol : protocolNames) { - if (shouldBeEnabled && !agentProtocols.contains(protocol)) { - failedChecks.add(protocol); - } - if (!shouldBeEnabled && agentProtocols.contains(protocol)) { - failedChecks.add(protocol); - } - } - - if (!failedChecks.isEmpty()) { - String message = String.format("Protocol(s) are not %s: %s. %sEnabled protocols: %s", - shouldBeEnabled ? "enabled" : "disabled", - String.join(",", failedChecks), - why != null ? "Reason: " + why + ". " : "", - String.join(",", agentProtocols)); - fail(message); - } - } - -} diff --git a/test/src/test/java/jenkins/agents/JnlpProtocol4ProxyHandlerTest.java b/test/src/test/java/jenkins/agents/JnlpProtocol4ProxyHandlerTest.java index 76f11d455f4d..e4c031922ded 100644 --- a/test/src/test/java/jenkins/agents/JnlpProtocol4ProxyHandlerTest.java +++ b/test/src/test/java/jenkins/agents/JnlpProtocol4ProxyHandlerTest.java @@ -94,11 +94,6 @@ public String getName() { return JnlpProtocol4ProxyHandler.NAME; } - @Override - public String getDisplayName() { - return "Test handler"; - } - @Override public void handle(Socket socket) throws IOException, InterruptedException { var agentIO = socket.getChannel(); diff --git a/test/src/test/java/jenkins/model/JenkinsTest.java b/test/src/test/java/jenkins/model/JenkinsTest.java index c44b12cdd037..3f3f615a6c5f 100644 --- a/test/src/test/java/jenkins/model/JenkinsTest.java +++ b/test/src/test/java/jenkins/model/JenkinsTest.java @@ -32,19 +32,15 @@ import static org.hamcrest.Matchers.arrayContaining; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; -import edu.umd.cs.findbugs.annotations.CheckForNull; import hudson.ExtensionList; import hudson.Functions; import hudson.XmlFile; @@ -76,7 +72,6 @@ import java.io.File; import java.io.IOException; import java.net.HttpURLConnection; -import java.net.Socket; import java.net.URI; import java.net.URL; import java.nio.file.Files; @@ -84,7 +79,6 @@ import java.nio.file.attribute.PosixFilePermission; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.Comparator; import java.util.EnumSet; import java.util.HashSet; @@ -94,7 +88,6 @@ import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.stream.Stream; -import jenkins.AgentProtocol; import org.apache.commons.io.FileUtils; import org.htmlunit.FailingHttpStatusCodeException; import org.htmlunit.HttpMethod; @@ -600,174 +593,6 @@ public void onOnline(Computer c, TaskListener listener) throws IOException, Inte } } - @Test - @Issue("JENKINS-39465") - public void agentProtocols_singleEnable_roundtrip() throws Exception { - final Set defaultProtocols = Collections.unmodifiableSet(j.jenkins.getAgentProtocols()); - - final Set newProtocols = new HashSet<>(defaultProtocols); - newProtocols.add(MockOptInProtocol1.NAME); - j.jenkins.setAgentProtocols(newProtocols); - j.jenkins.save(); - final Set agentProtocolsBeforeReload = j.jenkins.getAgentProtocols(); - assertProtocolEnabled(MockOptInProtocol1.NAME, "before the roundtrip"); - - j.jenkins.reload(); - - final Set reloadedProtocols = j.jenkins.getAgentProtocols(); - assertNotSame("The protocol list must have been really reloaded", agentProtocolsBeforeReload, reloadedProtocols); - assertThat("We should have additional enabled protocol", - reloadedProtocols.size(), equalTo(defaultProtocols.size() + 1)); - assertProtocolEnabled(MockOptInProtocol1.NAME, "after the roundtrip"); - } - - @Test - @Issue("JENKINS-39465") - public void agentProtocols_multipleDisable_roundtrip() throws Exception { - final Set defaultProtocols = Collections.unmodifiableSet(j.jenkins.getAgentProtocols()); - assertProtocolEnabled(MockOptOutProtocol1.NAME, "after startup"); - - final Set newProtocols = new HashSet<>(defaultProtocols); - newProtocols.remove(MockOptOutProtocol1.NAME); - j.jenkins.setAgentProtocols(newProtocols); - j.jenkins.save(); - assertProtocolDisabled(MockOptOutProtocol1.NAME, "before the roundtrip"); - final Set agentProtocolsBeforeReload = j.jenkins.getAgentProtocols(); - j.jenkins.reload(); - - assertNotSame("The protocol list must have been really refreshed", agentProtocolsBeforeReload, j.jenkins.getAgentProtocols()); - assertThat("We should have disabled one protocol", - j.jenkins.getAgentProtocols().size(), equalTo(defaultProtocols.size() - 1)); - - assertProtocolDisabled(MockOptOutProtocol1.NAME, "after the roundtrip"); - } - - @Test - @Issue("JENKINS-39465") - public void agentProtocols_multipleEnable_roundtrip() throws Exception { - final Set defaultProtocols = Collections.unmodifiableSet(j.jenkins.getAgentProtocols()); - final Set newProtocols = new HashSet<>(defaultProtocols); - newProtocols.add(MockOptInProtocol1.NAME); - newProtocols.add(MockOptInProtocol2.NAME); - j.jenkins.setAgentProtocols(newProtocols); - j.jenkins.save(); - - final Set agentProtocolsBeforeReload = j.jenkins.getAgentProtocols(); - assertProtocolEnabled(MockOptInProtocol1.NAME, "before the roundtrip"); - assertProtocolEnabled(MockOptInProtocol2.NAME, "before the roundtrip"); - - j.jenkins.reload(); - - final Set reloadedProtocols = j.jenkins.getAgentProtocols(); - assertNotSame("The protocol list must have been really reloaded", agentProtocolsBeforeReload, reloadedProtocols); - assertThat("There should be two additional enabled protocols", - reloadedProtocols.size(), equalTo(defaultProtocols.size() + 2)); - assertProtocolEnabled(MockOptInProtocol1.NAME, "after the roundtrip"); - assertProtocolEnabled(MockOptInProtocol2.NAME, "after the roundtrip"); - } - - @Test - @Issue("JENKINS-39465") - public void agentProtocols_singleDisable_roundtrip() throws Exception { - final Set defaultProtocols = Collections.unmodifiableSet(j.jenkins.getAgentProtocols()); - final String protocolToDisable1 = MockOptOutProtocol1.NAME; - final String protocolToDisable2 = MockOptOutProtocol2.NAME; - - final Set newProtocols = new HashSet<>(defaultProtocols); - newProtocols.remove(protocolToDisable1); - newProtocols.remove(protocolToDisable2); - j.jenkins.setAgentProtocols(newProtocols); - j.jenkins.save(); - assertProtocolDisabled(protocolToDisable1, "before the roundtrip"); - assertProtocolDisabled(protocolToDisable2, "before the roundtrip"); - final Set agentProtocolsBeforeReload = j.jenkins.getAgentProtocols(); - j.jenkins.reload(); - - assertNotSame("The protocol list must have been really reloaded", agentProtocolsBeforeReload, j.jenkins.getAgentProtocols()); - assertThat("We should have disabled two protocols", - j.jenkins.getAgentProtocols().size(), equalTo(defaultProtocols.size() - 2)); - assertProtocolDisabled(protocolToDisable1, "after the roundtrip"); - assertProtocolDisabled(protocolToDisable2, "after the roundtrip"); - } - - private void assertProtocolDisabled(String protocolName, @CheckForNull String stage) { - assertThat(protocolName + " must be disabled. Stage=" + (stage != null ? stage : "undefined"), - j.jenkins.getAgentProtocols(), not(hasItem(protocolName))); - } - - private void assertProtocolEnabled(String protocolName, @CheckForNull String stage) { - assertThat(protocolName + " must be enabled. Stage=" + (stage != null ? stage : "undefined"), - j.jenkins.getAgentProtocols(), hasItem(protocolName)); - } - - @TestExtension - public static class MockOptInProtocol1 extends MockOptInProtocol { - - static final String NAME = "MOCK-OPTIN-1"; - - @Override - public String getName() { - return NAME; - } - } - - @TestExtension - public static class MockOptInProtocol2 extends MockOptInProtocol { - - static final String NAME = "MOCK-OPTIN-2"; - - @Override - public String getName() { - return NAME; - } - } - - private abstract static class MockOptInProtocol extends AgentProtocol { - @Override - public boolean isOptIn() { - return true; - } - - @Override - public void handle(Socket socket) throws IOException, InterruptedException { - throw new IOException("This is a mock agent protocol. It cannot be used for connection"); - } - } - - @TestExtension - public static class MockOptOutProtocol1 extends MockOptOutProtocol { - - static final String NAME = "MOCK-OPTOUT-1"; - - @Override - public String getName() { - return NAME; - } - } - - @TestExtension - public static class MockOptOutProtocol2 extends MockOptOutProtocol { - - static final String NAME = "MOCK-OPTOUT-2"; - - @Override - public String getName() { - return NAME; - } - } - - private abstract static class MockOptOutProtocol extends AgentProtocol { - @Override - public boolean isOptIn() { - return false; - } - - @Override - public void handle(Socket socket) throws IOException, InterruptedException { - throw new IOException("This is a mock agent protocol. It cannot be used for connection"); - } - } - @Test public void getComputers() throws Exception { List agents = new ArrayList<>(); diff --git a/test/src/test/java/jenkins/model/JenkinsVersionTest.java b/test/src/test/java/jenkins/model/JenkinsVersionTest.java new file mode 100644 index 000000000000..dd72747ac889 --- /dev/null +++ b/test/src/test/java/jenkins/model/JenkinsVersionTest.java @@ -0,0 +1,24 @@ +package jenkins.model; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.hasItem; + +import java.util.logging.Level; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.LoggerRule; + +public class JenkinsVersionTest { + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Rule + public LoggerRule logging = new LoggerRule().record(Jenkins.class, Level.INFO).capture(100); + + @Test + public void printsVersion() { + assertThat(logging.getMessages(), hasItem(containsString(Jenkins.getVersion().toString()))); + } +} diff --git a/test/src/test/java/jenkins/model/NodesTest.java b/test/src/test/java/jenkins/model/NodesTest.java index 275dd9a3e5fb..ef2bee08ef4a 100644 --- a/test/src/test/java/jenkins/model/NodesTest.java +++ b/test/src/test/java/jenkins/model/NodesTest.java @@ -25,7 +25,10 @@ package jenkins.model; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.Matchers.sameInstance; @@ -37,13 +40,21 @@ import edu.umd.cs.findbugs.annotations.NonNull; import hudson.ExtensionList; +import hudson.XmlFile; import hudson.model.Descriptor; import hudson.model.Failure; import hudson.model.Node; +import hudson.model.Saveable; import hudson.model.Slave; +import hudson.model.listeners.SaveableListener; import hudson.slaves.ComputerLauncher; import hudson.slaves.DumbSlave; import java.io.IOException; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; +import org.hamcrest.Description; +import org.hamcrest.TypeSafeMatcher; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.Issue; @@ -52,7 +63,6 @@ import org.jvnet.hudson.test.recipes.LocalData; public class NodesTest { - @Rule public JenkinsRule r = new JenkinsRule(); @@ -99,6 +109,10 @@ public void addNodeShouldReplaceExistingNode() throws Exception { assertEquals(0, l.deleted); assertEquals(1, l.updated); assertEquals(1, l.created); + var saveableListener = ExtensionList.lookupSingleton(SaveableListenerImpl.class); + assertEquals(0, saveableListener.deleted); + r.jenkins.removeNode(newNode); + assertEquals(1, saveableListener.deleted); } @TestExtension("addNodeShouldReplaceExistingNode") @@ -122,6 +136,16 @@ protected void onCreated(Node node) { } } + @TestExtension("addNodeShouldReplaceExistingNode") + public static final class SaveableListenerImpl extends SaveableListener { + int deleted; + + @Override + public void onDeleted(Saveable o, XmlFile file) { + deleted++; + } + } + @Test @Issue("JENKINS-56403") public void replaceNodeShouldRemoveOldNode() throws Exception { @@ -222,4 +246,81 @@ protected boolean allowLoad(@NonNull Node node) { } } + @Test + public void listenersCalledOnSetNodes() throws URISyntaxException, IOException, Descriptor.FormException { + var agentA = new DumbSlave("nodeA", "temp", r.createComputerLauncher(null)); + var agentB = new DumbSlave("nodeB", "temp", r.createComputerLauncher(null)); + var agentA2 = new DumbSlave("nodeA", "temp2", r.createComputerLauncher(null)); + Jenkins.get().setNodes(List.of(agentA, agentB)); + assertThat(CheckSetNodes.created, containsInAnyOrder("nodeA", "nodeB")); + assertThat(CheckSetNodes.updated, empty()); + assertThat(CheckSetNodes.deleted, empty()); + Jenkins.get().setNodes(List.of(agentA2)); + assertThat(CheckSetNodes.created, containsInAnyOrder("nodeA", "nodeB")); + assertThat(CheckSetNodes.updated, contains(new DumbSlaveNameAndRemoteFSMatcher(new DumbSlavePair(agentA, agentA2)))); + assertThat(CheckSetNodes.deleted, contains("nodeB")); + Jenkins.get().setNodes(List.of()); + assertThat(CheckSetNodes.created, containsInAnyOrder("nodeA", "nodeB")); + assertThat(CheckSetNodes.updated, contains(new DumbSlaveNameAndRemoteFSMatcher(new DumbSlavePair(agentA, agentA2)))); + assertThat(CheckSetNodes.deleted, containsInAnyOrder("nodeA", "nodeB")); + } + + private record DumbSlavePair(DumbSlave oldNode, DumbSlave newNode) { + @Override + public String toString() { + return "NodePair{" + + "oldNode=" + toStringNode(oldNode) + + ", newNode=" + toStringNode(newNode) + + '}'; + } + + private String toStringNode(DumbSlave node) { + return "(name=" + node.getNodeName() + ",remoteFS=" + node.getRemoteFS() + ")"; + } + } + + @TestExtension("listenersCalledOnSetNodes") + public static class CheckSetNodes extends NodeListener { + private static final List created = new ArrayList<>(); + private static final List updated = new ArrayList<>(); + private static final List deleted = new ArrayList<>(); + + @Override + protected void onCreated(@NonNull Node node) { + created.add(node.getNodeName()); + } + + @Override + protected void onUpdated(@NonNull Node oldOne, @NonNull Node newOne) { + if (oldOne instanceof DumbSlave oldDumbSlave && newOne instanceof DumbSlave newDumbSlave) { + updated.add(new DumbSlavePair(oldDumbSlave, newDumbSlave)); + } + } + + @Override + protected void onDeleted(@NonNull Node node) { + deleted.add(node.getNodeName()); + } + } + + private static class DumbSlaveNameAndRemoteFSMatcher extends TypeSafeMatcher { + private final DumbSlavePair expected; + + public DumbSlaveNameAndRemoteFSMatcher(DumbSlavePair expected) { + this.expected = expected; + } + + @Override + protected boolean matchesSafely(DumbSlavePair dumbSlavePair) { + return expected.oldNode.getNodeName().equals(dumbSlavePair.oldNode.getNodeName()) + && expected.oldNode.getRemoteFS().equals(dumbSlavePair.oldNode.getRemoteFS()) + && expected.newNode.getNodeName().equals(dumbSlavePair.newNode.getNodeName()) + && expected.newNode.getRemoteFS().equals(dumbSlavePair.newNode.getRemoteFS()); + } + + @Override + public void describeTo(Description description) { + description.appendText("NodePair(").appendValue(expected).appendText(")"); + } + } } diff --git a/test/src/test/java/jenkins/security/RedactSecretJsonInErrorMessageSanitizerHtmlTest.java b/test/src/test/java/jenkins/security/RedactSecretJsonInErrorMessageSanitizerHtmlTest.java index 0fe9b8865d16..b1435951f0e2 100644 --- a/test/src/test/java/jenkins/security/RedactSecretJsonInErrorMessageSanitizerHtmlTest.java +++ b/test/src/test/java/jenkins/security/RedactSecretJsonInErrorMessageSanitizerHtmlTest.java @@ -31,19 +31,24 @@ import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.not; +import hudson.ExtensionList; import hudson.model.Describable; import hudson.model.Descriptor; import hudson.model.RootAction; import hudson.util.Secret; +import jakarta.servlet.ServletException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.logging.Level; import jenkins.model.Jenkins; import net.sf.json.JSONObject; import org.htmlunit.Page; +import org.htmlunit.html.HtmlElement; +import org.htmlunit.html.HtmlElementUtil; import org.htmlunit.html.HtmlForm; import org.htmlunit.html.HtmlInput; import org.htmlunit.html.HtmlPage; +import org.htmlunit.html.HtmlTextArea; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.Issue; @@ -223,6 +228,81 @@ public void checkSanitizationIsApplied_inStapler() throws Exception { )); } + @Test + @Issue("SECURITY-3451") + public void secretTextAreaSubmissionRedaction() throws Exception { + final TestSecretTextarea action = ExtensionList.lookupSingleton(TestSecretTextarea.class); + + logging.record("", Level.WARNING).capture(100); + + final String secretValue = "s3cr3t"; + + try (JenkinsRule.WebClient wc = j.createWebClient().withThrowExceptionOnFailingStatusCode(false)) { + + HtmlPage page = wc.goTo("test"); + + final HtmlForm form = page.getFormByName("config"); + final HtmlElement button = form.getElementsByTagName("button").stream().filter(b -> HtmlElementUtil.hasClassName(b, "secret-update-btn")).findFirst().orElseThrow(); + HtmlElementUtil.click(button); + + ((HtmlTextArea) form.getElementsByTagName("textarea").stream().filter(field -> HtmlElementUtil.hasClassName(field, "secretTextarea-redact")).findFirst().orElseThrow()).setText(secretValue); + + Page formSubmitPage = j.submit(form); + assertThat(formSubmitPage.getWebResponse().getContentAsString(), allOf( + containsString(RedactSecretJsonInErrorMessageSanitizer.REDACT_VALUE), + not(containsString(secretValue)) + )); + } + + // check the system log also + Throwable thrown = logging.getRecords().stream().filter(r -> r.getMessage().contains("Error while serving")).findAny().get().getThrown(); + // the exception from RequestImpl + assertThat(thrown.getCause().getMessage(), allOf( + containsString(RedactSecretJsonInErrorMessageSanitizer.REDACT_VALUE), + not(containsString(secretValue)) + )); + + StringWriter buffer = new StringWriter(); + thrown.printStackTrace(new PrintWriter(buffer)); + String fullStack = buffer.getBuffer().toString(); + assertThat(fullStack, allOf( + containsString(RedactSecretJsonInErrorMessageSanitizer.REDACT_VALUE), + not(containsString(secretValue)) + )); + } + + public static class SecretTextareaDescribable { + @DataBoundConstructor + public SecretTextareaDescribable(Secret secret) { + throw new IllegalArgumentException("there is something wrong with the secret"); + } + } + + @TestExtension("secretTextAreaSubmissionRedaction") + public static class TestSecretTextarea implements RootAction { + + public JSONObject lastJsonReceived; + + public void doSubmitTest(StaplerRequest2 req) throws ServletException { + req.bindJSON(SecretTextareaDescribable.class, req.getSubmittedForm()); + } + + @Override + public String getIconFileName() { + return null; + } + + @Override + public String getDisplayName() { + return null; + } + + @Override + public String getUrlName() { + return "test"; + } + } + public static class TestDescribable implements Describable { @DataBoundConstructor diff --git a/test/src/test/java/jenkins/security/ResourceDomainTest.java b/test/src/test/java/jenkins/security/ResourceDomainTest.java index b8f2d551b094..a2eb9de0b89a 100644 --- a/test/src/test/java/jenkins/security/ResourceDomainTest.java +++ b/test/src/test/java/jenkins/security/ResourceDomainTest.java @@ -55,6 +55,34 @@ public void prepare() throws Exception { configuration.setUrl(resourceRoot); } + @Test + public void groupPermissionsWork() throws Exception { + final JenkinsRule.DummySecurityRealm securityRealm = j.createDummySecurityRealm(); + securityRealm.addGroups("alice", "admins"); + j.jenkins.setSecurityRealm(securityRealm); + MockAuthorizationStrategy a = new MockAuthorizationStrategy().grant(Jenkins.READ).everywhere().to("admins"); + j.jenkins.setAuthorizationStrategy(a); + + JenkinsRule.WebClient webClient = j.createWebClient().login("alice"); + + { // DBS directory listing is shown as always + Page page = webClient.goTo("userContent"); + Assert.assertEquals("successful request", 200, page.getWebResponse().getStatusCode()); + Assert.assertTrue("still on the original URL", page.getUrl().toString().contains("/userContent")); + Assert.assertTrue("web page", page.isHtmlPage()); + Assert.assertTrue("complex web page", page.getWebResponse().getContentAsString().contains("javascript")); + } + { // DBS on primary domain forwards to second domain when trying to access a file URL + webClient.setRedirectEnabled(true); + Page page = webClient.goTo("userContent/readme.txt", "text/plain"); + final String resourceResponseUrl = page.getUrl().toString(); + Assert.assertEquals("resource response success", 200, page.getWebResponse().getStatusCode()); + Assert.assertNull("no CSP headers", page.getWebResponse().getResponseHeaderValue("Content-Security-Policy")); + Assert.assertTrue("Served from resource domain", resourceResponseUrl.contains(RESOURCE_DOMAIN)); + Assert.assertTrue("Served from resource action", resourceResponseUrl.contains("static-files")); + } + } + @Test public void secondDomainBasics() throws Exception { JenkinsRule.WebClient webClient = j.createWebClient(); diff --git a/test/src/test/java/jenkins/security/Security3448Test.java b/test/src/test/java/jenkins/security/Security3448Test.java new file mode 100644 index 000000000000..d2a4695317cf --- /dev/null +++ b/test/src/test/java/jenkins/security/Security3448Test.java @@ -0,0 +1,171 @@ +package jenkins.security; + +import static hudson.cli.CLICommandInvoker.Matcher.failedWith; +import static hudson.cli.CLICommandInvoker.Matcher.succeededSilently; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertTrue; + +import edu.umd.cs.findbugs.annotations.NonNull; +import hudson.cli.CLICommand; +import hudson.cli.CLICommandInvoker; +import hudson.cli.CreateJobCommand; +import hudson.model.Build; +import hudson.model.Descriptor; +import hudson.model.FreeStyleProject; +import hudson.model.ItemGroup; +import hudson.model.Project; +import hudson.model.TopLevelItem; +import hudson.model.TopLevelItemDescriptor; +import hudson.security.ACL; +import hudson.security.AuthorizationStrategy; +import hudson.security.Permission; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Collection; +import java.util.Collections; +import jenkins.model.Jenkins; +import org.hamcrest.Matchers; +import org.htmlunit.HttpMethod; +import org.htmlunit.WebRequest; +import org.htmlunit.WebResponse; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.TestExtension; +import org.kohsuke.stapler.DataBoundConstructor; +import org.springframework.security.core.Authentication; + +public class Security3448Test { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Issue("SECURITY-3448") + @Test + public void jobCreationFromCLI() { + CLICommand cmd = new CreateJobCommand(); + CLICommandInvoker invoker = new CLICommandInvoker(j, cmd); + + j.jenkins.setAuthorizationStrategy(AuthorizationStrategy.UNSECURED); + + assertThat(j.jenkins.getItems(), Matchers.hasSize(0)); + assertThat(invoker.withStdin(new ByteArrayInputStream("".getBytes(StandardCharsets.UTF_8))).invokeWithArgs("job1"), succeededSilently()); + assertThat(j.jenkins.getItems(), Matchers.hasSize(1)); + + assertThat(invoker.withStdin(new ByteArrayInputStream("".getBytes(StandardCharsets.UTF_8))).invokeWithArgs("job2"), failedWith(6)); + assertThat(j.jenkins.getItems(), Matchers.hasSize(1)); + + j.jenkins.setAuthorizationStrategy(new UnsecuredNoFreestyleAuthorizationStrategy()); + + assertThat(invoker.withStdin(new ByteArrayInputStream("".getBytes(StandardCharsets.UTF_8))).invokeWithArgs("job2"), failedWith(6)); + assertThat(j.jenkins.getItems(), Matchers.hasSize(1)); + } + + @Test + @Issue("SECURITY-3448") + public void jobCreationFromREST() throws Exception { + j.jenkins.setCrumbIssuer(null); + + try (JenkinsRule.WebClient wc = j.createWebClient().withThrowExceptionOnFailingStatusCode(false)) { + String doCreateItem = j.getURL().toString() + "createItem?name="; + URL job1 = new URL(doCreateItem + "job1"); + WebRequest req = new WebRequest(job1, HttpMethod.POST); + req.setAdditionalHeader("Content-Type", "application/xml"); + req.setRequestBody(""); + j.jenkins.setAuthorizationStrategy(AuthorizationStrategy.UNSECURED); + + assertThat(j.jenkins.getItems(), Matchers.hasSize(0)); + wc.getPage(req); + assertThat(j.jenkins.getItems(), Matchers.hasSize(1)); + + URL job2 = new URL(doCreateItem + "job2"); + req.setUrl(job2); + req.setRequestBody(""); + + WebResponse rspJob2 = wc.getPage(req).getWebResponse(); + assertTrue(rspJob2.getContentAsString().contains("Security3448Test$NotApplicableProject is not applicable in")); + assertThat(j.jenkins.getItems(), Matchers.hasSize(1)); + + URL job3 = new URL(doCreateItem + "job3"); + req.setUrl(job3); + req.setRequestBody(""); + j.jenkins.setAuthorizationStrategy(new UnsecuredNoFreestyleAuthorizationStrategy()); + + WebResponse rspJob3 = wc.getPage(req).getWebResponse(); + assertTrue(rspJob3.getContentAsString().contains("does not have required permissions to create hudson.model.FreeStyleProject")); + assertThat(j.jenkins.getItems(), Matchers.hasSize(1)); + } + } + + public static class UnsecuredNoFreestyleAuthorizationStrategy extends AuthorizationStrategy { + + @DataBoundConstructor + public UnsecuredNoFreestyleAuthorizationStrategy() {} + + @Override + public ACL getRootACL() { + return new ACL() { + + @Override + public boolean hasPermission2(Authentication a, Permission permission) { + return true; + } + + @Override + public boolean hasCreatePermission2( + @NonNull Authentication a, @NonNull ItemGroup c, @NonNull TopLevelItemDescriptor d) { + return d.clazz != FreeStyleProject.class; + } + }; + } + + @Override + public Collection getGroups() { + return Collections.emptyList(); + } + + @TestExtension + public static class DescriptorImpl extends Descriptor {} + } + + public static class NotApplicableProject extends Project implements TopLevelItem { + + NotApplicableProject(ItemGroup parent, String name) { + super(parent, name); + } + + @Override + protected Class getBuildClass() { + return NotApplicableBuild.class; + } + + @Override + public TopLevelItemDescriptor getDescriptor() { + return (NotApplicableProject.DescriptorImpl) Jenkins.get().getDescriptorOrDie(getClass()); + } + + @TestExtension + public static class DescriptorImpl extends AbstractProjectDescriptor { + + @Override + public boolean isApplicableIn(ItemGroup parent) { + return false; + } + + @Override + public TopLevelItem newInstance(ItemGroup parent, String name) { + return new NotApplicableProject(parent, name); + } + } + } + + public static class NotApplicableBuild extends Build { + + protected NotApplicableBuild(NotApplicableProject project) throws IOException { + super(project); + } + } +} diff --git a/test/src/test/java/lib/form/PasswordTest.java b/test/src/test/java/lib/form/PasswordTest.java index facb1d7418df..526ef1586ae9 100644 --- a/test/src/test/java/lib/form/PasswordTest.java +++ b/test/src/test/java/lib/form/PasswordTest.java @@ -67,6 +67,7 @@ import jenkins.model.GlobalConfiguration; import jenkins.model.Jenkins; import jenkins.model.TransientActionFactory; +import jenkins.security.ExtendedReadSecretRedaction; import jenkins.tasks.SimpleBuildStep; import org.htmlunit.Page; import org.htmlunit.html.DomElement; @@ -76,6 +77,7 @@ import org.htmlunit.html.HtmlTextInput; import org.junit.Rule; import org.junit.Test; +import org.jvnet.hudson.test.For; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockAuthorizationStrategy; @@ -124,6 +126,7 @@ public String getUrlName() { @Issue({"SECURITY-266", "SECURITY-304"}) @Test + @For(ExtendedReadSecretRedaction.class) public void testExposedCiphertext() throws Exception { boolean saveEnabled = Item.EXTENDED_READ.getEnabled(); Item.EXTENDED_READ.setEnabled(true); diff --git a/test/src/test/resources/hudson/model/UpdateCenterMigrationTest/updateCenterMigration/hudson.model.UpdateCenter.xml b/test/src/test/resources/hudson/model/UpdateCenterMigrationTest/updateCenterMigration/hudson.model.UpdateCenter.xml new file mode 100644 index 000000000000..4f317e783647 --- /dev/null +++ b/test/src/test/resources/hudson/model/UpdateCenterMigrationTest/updateCenterMigration/hudson.model.UpdateCenter.xml @@ -0,0 +1,7 @@ + + + + default + http://updates.jenkins-ci.org/update-center.json + + \ No newline at end of file diff --git a/test/src/test/resources/jenkins/AgentProtocolTest/config.xml b/test/src/test/resources/jenkins/AgentProtocolTest/config.xml deleted file mode 100644 index b072a16fa96e..000000000000 --- a/test/src/test/resources/jenkins/AgentProtocolTest/config.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - 1.0 - 2 - NORMAL - true - - - false - - ${ITEM_ROOTDIR}/workspace - ${ITEM_ROOTDIR}/builds - - - - - - 0 - - - - all - false - false - - - - all - 0 - - JNLP4-connect - - - JNLP2-connect - JNLP3-connect - - - - - \ No newline at end of file diff --git a/war/src/main/webapp/help/view-config/filter-executors_ja.html b/test/src/test/resources/jenkins/security/RedactSecretJsonInErrorMessageSanitizerHtmlTest/TestSecretTextarea/index.jelly similarity index 61% rename from war/src/main/webapp/help/view-config/filter-executors_ja.html rename to test/src/test/resources/jenkins/security/RedactSecretJsonInErrorMessageSanitizerHtmlTest/TestSecretTextarea/index.jelly index efe9214b79d3..05b146af865b 100644 --- a/war/src/main/webapp/help/view-config/filter-executors_ja.html +++ b/test/src/test/resources/jenkins/security/RedactSecretJsonInErrorMessageSanitizerHtmlTest/TestSecretTextarea/index.jelly @@ -1,7 +1,7 @@ -
このビューのジョブを実行可能なエグゼキューターのみ表示します。
+ + + + + + + + + + + + + + + + diff --git a/war/.gitignore b/war/.gitignore deleted file mode 100644 index 045972f591e6..000000000000 --- a/war/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -work -/rebel.xml -junit.xml - -# Yarn -# https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored -.pnp.* -.yarn/* -.yarnrc.yml -!.yarn/patches -!.yarn/plugins -!.yarn/sdks -!.yarn/versions - -# Node -node/ -node_modules/ - -# Generated JavaScript Bundles -jsbundles diff --git a/war/pom.xml b/war/pom.xml index f256a95017ca..933dcab0193a 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -46,7 +46,7 @@ THE SOFTWARE. localhost 8080 - 2.13.2-125.v200281b_61d59 + 2.14.0-133.vcc091215a_358 3107.v665000b_51092 @@ -148,13 +148,21 @@ THE SOFTWARE. 11 + com.infradna.tool:bridge-method-annotation + org.jenkins-ci:annotation-indexer org.jenkins-ci:commons-jelly + org.jenkins-ci:crypto-util org.jenkins-ci.main:cli org.jenkins-ci.main:jenkins-core org.jenkins-ci.main:websocket-jetty12-ee9 org.jenkins-ci.main:websocket-spi + org.jenkins-ci:memory-monitor + org.jenkins-ci:symbol-annotation + org.jenkins-ci:task-reactor + org.jenkins-ci:version-number org.jvnet.hudson:commons-jelly-tags-define org.jvnet.winp:winp + org.kohsuke:access-modifier-annotation org.kohsuke.stapler:stapler org.kohsuke.stapler:stapler-groovy org.kohsuke.stapler:stapler-jelly @@ -264,21 +272,21 @@ THE SOFTWARE. org.jenkins-ci.plugins display-url-api - 2.204.vf6fddd8a_8b_e9 + 2.209.v582ed814ff2f hpi org.jenkins-ci.plugins mailer - 472.vf7c289a_4b_420 + 489.vd4b_25144138f hpi org.jenkins-ci.plugins matrix-auth - 3.2.2 + 3.2.3 hpi @@ -292,21 +300,21 @@ THE SOFTWARE. org.jenkins-ci.plugins matrix-project - 832.va_66e270d2946 + 840.v812f627cb_578 hpi org.jenkins-ci.plugins script-security - 1362.v67dc1f0e1b_b_3 + 1367.vdf2fc45f229c hpi org.jenkins-ci.plugins junit - 1300.v03d9d8a_cf1fb_ + 1307.vdd5b_2646279e hpi @@ -342,7 +350,7 @@ THE SOFTWARE. org.jenkins-ci.plugins.workflow workflow-support - 926.v9f4f9b_b_98c19 + 930.vf51d22b_ce488 hpi @@ -357,7 +365,7 @@ THE SOFTWARE. io.jenkins.plugins echarts-api - 5.5.1-1 + 5.5.1-4 hpi @@ -410,7 +418,7 @@ THE SOFTWARE. org.jenkins-ci.plugins scm-api - 696.v778d637b_a_762 + 698.v8e3b_c788f0a_6 hpi @@ -480,7 +488,7 @@ THE SOFTWARE. org.jenkins-ci.modules instance-identity - 185.v303dc7c645f9 + 201.vd2a_b_5a_468a_a_6 hpi @@ -494,7 +502,7 @@ THE SOFTWARE. io.jenkins.plugins asm-api - 9.7-33.v4d23ef79fcc8 + 9.7.1-97.v4cc844130d97 hpi @@ -515,7 +523,7 @@ THE SOFTWARE. io.jenkins.plugins gson-api - 2.11.0-41.v019fcf6125dc + 2.11.0-85.v1f4e87273c33 hpi @@ -543,7 +551,7 @@ THE SOFTWARE. io.jenkins.plugins json-api - 20240303-41.v94e11e6de726 + 20240303-101.v7a_8666713110 hpi @@ -580,7 +588,7 @@ THE SOFTWARE. io.jenkins.lib support-log-formatter - 1.2 + 1.3 ${project.build.directory} @@ -637,7 +645,7 @@ THE SOFTWARE. org.eclipse.jetty.ee9 jetty-ee9-maven-plugin - 12.0.13 + 12.0.14 -
- If checked, only those build executors will be shown that could execute the - jobs in this view. -
diff --git a/war/src/main/webapp/help/view-config/filter-executors_bg.html b/war/src/main/webapp/help/view-config/filter-executors_bg.html deleted file mode 100644 index 6b36c6989ca7..000000000000 --- a/war/src/main/webapp/help/view-config/filter-executors_bg.html +++ /dev/null @@ -1,4 +0,0 @@ -
- Когато е избрано, ще се показват само компютрите, които могат да изпълняват - задачите в този изглед. -
diff --git a/war/src/main/webapp/help/view-config/filter-executors_de.html b/war/src/main/webapp/help/view-config/filter-executors_de.html deleted file mode 100644 index 52e6465c770c..000000000000 --- a/war/src/main/webapp/help/view-config/filter-executors_de.html +++ /dev/null @@ -1,27 +0,0 @@ - -
- Wenn angewählt, werden nur diejenigen Build-Prozessoren angezeigt, welche Jobs - in dieser Ansicht ausführen könnten. -
diff --git a/war/src/main/webapp/help/view-config/filter-executors_pt_BR.html b/war/src/main/webapp/help/view-config/filter-executors_pt_BR.html deleted file mode 100644 index 053df68e3154..000000000000 --- a/war/src/main/webapp/help/view-config/filter-executors_pt_BR.html +++ /dev/null @@ -1,27 +0,0 @@ - -
- Caso selecionado, apenas executores de build que podem executar jobs nessa - view aparecerão. -
diff --git a/war/src/main/webapp/help/view-config/filter-executors_zh_TW.html b/war/src/main/webapp/help/view-config/filter-executors_zh_TW.html deleted file mode 100644 index ff504373040c..000000000000 --- a/war/src/main/webapp/help/view-config/filter-executors_zh_TW.html +++ /dev/null @@ -1 +0,0 @@ -
啟用後,就只會顯示能建置視景中作業的那些執行程式。
diff --git a/war/src/main/webapp/help/view-config/filter-queue.html b/war/src/main/webapp/help/view-config/filter-queue.html deleted file mode 100644 index e658f998232a..000000000000 --- a/war/src/main/webapp/help/view-config/filter-queue.html +++ /dev/null @@ -1,24 +0,0 @@ - -
If checked, only jobs in this view will be shown in the queue.
diff --git a/war/src/main/webapp/help/view-config/filter-queue_bg.html b/war/src/main/webapp/help/view-config/filter-queue_bg.html deleted file mode 100644 index 7b22a78abde0..000000000000 --- a/war/src/main/webapp/help/view-config/filter-queue_bg.html +++ /dev/null @@ -1,4 +0,0 @@ -
- Когато е избрано, ще се показват само тези задачи в опашката, които са също и - в изгледа. -
diff --git a/war/src/main/webapp/help/view-config/filter-queue_de.html b/war/src/main/webapp/help/view-config/filter-queue_de.html deleted file mode 100644 index 2c2ec446239c..000000000000 --- a/war/src/main/webapp/help/view-config/filter-queue_de.html +++ /dev/null @@ -1,27 +0,0 @@ - -
- Wenn angewählt, werden in der Build-Warteschlange nur Jobs dieser Ansicht - angezeigt. -
diff --git a/war/src/main/webapp/help/view-config/filter-queue_it.html b/war/src/main/webapp/help/view-config/filter-queue_it.html deleted file mode 100644 index e7258892a005..000000000000 --- a/war/src/main/webapp/help/view-config/filter-queue_it.html +++ /dev/null @@ -1,27 +0,0 @@ - -
- Se quest'opzione è selezionata solo i processi che compaiono in questa vista - saranno visualizzati nella coda. -
diff --git a/war/src/main/webapp/help/view-config/filter-queue_ja.html b/war/src/main/webapp/help/view-config/filter-queue_ja.html deleted file mode 100644 index 26da33be36a1..000000000000 --- a/war/src/main/webapp/help/view-config/filter-queue_ja.html +++ /dev/null @@ -1,24 +0,0 @@ - -
このビューのジョブのみキューに表示されます。
diff --git a/war/src/main/webapp/help/view-config/filter-queue_pt_BR.html b/war/src/main/webapp/help/view-config/filter-queue_pt_BR.html deleted file mode 100644 index f92dd00bb380..000000000000 --- a/war/src/main/webapp/help/view-config/filter-queue_pt_BR.html +++ /dev/null @@ -1,24 +0,0 @@ - -
Caso selecionado, apenas jobs nessa view aparecerão na fila.
diff --git a/war/src/main/webapp/help/view-config/filter-queue_zh_TW.html b/war/src/main/webapp/help/view-config/filter-queue_zh_TW.html deleted file mode 100644 index 717957f1529e..000000000000 --- a/war/src/main/webapp/help/view-config/filter-queue_zh_TW.html +++ /dev/null @@ -1 +0,0 @@ -
選用後,佇列中只會顯示視景裡的作業。
diff --git a/war/src/main/webapp/scripts/apply.js b/war/src/main/webapp/scripts/apply.js new file mode 100644 index 000000000000..b82153250bf6 --- /dev/null +++ b/war/src/main/webapp/scripts/apply.js @@ -0,0 +1,8 @@ +window.applyCompletionHandler = function (w) { + let scriptTagData = document.getElementById("form-apply-data-holder").dataset; + + w.notificationBar.show( + scriptTagData.message, + w.notificationBar[scriptTagData.notificationType], + ); +}; diff --git a/war/src/main/webapp/scripts/hudson-behavior.js b/war/src/main/webapp/scripts/hudson-behavior.js index 6f877b5f8332..da691e76c97f 100644 --- a/war/src/main/webapp/scripts/hudson-behavior.js +++ b/war/src/main/webapp/scripts/hudson-behavior.js @@ -2531,6 +2531,9 @@ function buildFormTree(form) { if (e.classList.contains("complex-password-field")) { addProperty(p, "$redact", shortenName(e.name)); } + if (e.classList.contains("secretTextarea-redact")) { + addProperty(p, "$redact", shortenName(e.name)); + } break; } } diff --git a/war/webpack.config.js b/webpack.config.js similarity index 97% rename from war/webpack.config.js rename to webpack.config.js index b9f012095ff4..579157b91ee4 100644 --- a/war/webpack.config.js +++ b/webpack.config.js @@ -57,7 +57,7 @@ module.exports = (env, argv) => ({ styles: [path.join(__dirname, "src/main/scss/styles.scss")], }, output: { - path: path.join(__dirname, "src/main/webapp/jsbundles"), + path: path.join(__dirname, "war/src/main/webapp/jsbundles"), }, devtool: argv.mode === "production" @@ -89,7 +89,7 @@ module.exports = (env, argv) => ({ options: { sourceMap: true, // ignore the URLS on the base styles as they are picked - // from the src/main/webapp/images dir + // from the war/src/main/webapp/images dir url: { filter: (url, resourcePath) => { return !resourcePath.includes("styles.scss"); diff --git a/yarn.lock b/yarn.lock index 28ee807765bc..d3296cb5b08a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,9 +15,9 @@ __metadata: languageName: node linkType: hard -"@babel/cli@npm:7.25.6": - version: 7.25.6 - resolution: "@babel/cli@npm:7.25.6" +"@babel/cli@npm:7.25.9": + version: 7.25.9 + resolution: "@babel/cli@npm:7.25.9" dependencies: "@jridgewell/trace-mapping": "npm:^0.3.25" "@nicolo-ribaudo/chokidar-2": "npm:2.1.8-no-fsevents.3" @@ -38,121 +38,123 @@ __metadata: bin: babel: ./bin/babel.js babel-external-helpers: ./bin/babel-external-helpers.js - checksum: 10c0/861d3c2ed6c47b25a322c2f6127f56783d8d333fc2d02d3815f86301fe1102eca5f61b8a5c8610a6a2872d1ccfce24fd6d4a91f4f73536e43b8e2f28f9dcf5ed + checksum: 10c0/2e8228c3715e220fa902888c643ce1a89c4ee90be3d9f7a31218d5bb2500456e0cef12cb90fd5877ab3e5a4498df8f27670425d346422a3eb52052fd3184d520 languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/code-frame@npm:7.24.7" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/code-frame@npm:7.26.0" dependencies: - "@babel/highlight": "npm:^7.24.7" + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" picocolors: "npm:^1.0.0" - checksum: 10c0/ab0af539473a9f5aeaac7047e377cb4f4edd255a81d84a76058595f8540784cc3fbe8acf73f1e073981104562490aabfb23008cd66dc677a456a4ed5390fdde6 + checksum: 10c0/46f7e367714be736b52ea3c01b24f47e2102e210fb83021d1c8237d8fc511b9538909e16e2fcdbb5cb6173e0794e28624309a59014e52fcfb7bde908f5284388 languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.2, @babel/compat-data@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/compat-data@npm:7.25.4" - checksum: 10c0/50d79734d584a28c69d6f5b99adfaa064d0f41609a378aef04eb06accc5b44f8520e68549eba3a082478180957b7d5783f1bfb1672e4ae8574e797ce8bae79fa +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.9, @babel/compat-data@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/compat-data@npm:7.26.0" + checksum: 10c0/6325c9151a3c9b0a3a807e854a26255ef66d989bff331475a935af9bb18f160e0fffe6aed550e4e96b63f91efcd874bfbaab2a1f4a2f8d25645d712a0de590fb languageName: node linkType: hard -"@babel/core@npm:7.25.2": - version: 7.25.2 - resolution: "@babel/core@npm:7.25.2" +"@babel/core@npm:7.26.0": + version: 7.26.0 + resolution: "@babel/core@npm:7.26.0" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.0" - "@babel/helper-compilation-targets": "npm:^7.25.2" - "@babel/helper-module-transforms": "npm:^7.25.2" - "@babel/helpers": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.0" - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.2" - "@babel/types": "npm:^7.25.2" + "@babel/code-frame": "npm:^7.26.0" + "@babel/generator": "npm:^7.26.0" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helpers": "npm:^7.26.0" + "@babel/parser": "npm:^7.26.0" + "@babel/template": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.26.0" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/a425fa40e73cb72b6464063a57c478bc2de9dbcc19c280f1b55a3d88b35d572e87e8594e7d7b4880331addb6faef641bbeb701b91b41b8806cd4deae5d74f401 + checksum: 10c0/91de73a7ff5c4049fbc747930aa039300e4d2670c2a91f5aa622f1b4868600fc89b01b6278385fbcd46f9574186fa3d9b376a9e7538e50f8d118ec13cfbcb63e languageName: node linkType: hard -"@babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/generator@npm:7.25.6" +"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/generator@npm:7.26.0" dependencies: - "@babel/types": "npm:^7.25.6" + "@babel/parser": "npm:^7.26.0" + "@babel/types": "npm:^7.26.0" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 10c0/f89282cce4ddc63654470b98086994d219407d025497f483eb03ba102086e11e2b685b27122f6ff2e1d93b5b5fa0c3a6b7e974fbf2e4a75b685041a746a4291e + jsesc: "npm:^3.0.2" + checksum: 10c0/b6bb9185f19a97eaf58e04a6d39a13237076678e7ed16b6321dea914535d4bf6a8d7727c9dcb65539845aa0096b326eb67be4bab764bd74bcfd848e2eda68609 languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" +"@babel/helper-annotate-as-pure@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" dependencies: - "@babel/types": "npm:^7.24.7" - checksum: 10c0/4679f7df4dffd5b3e26083ae65228116c3da34c3fff2c11ae11b259a61baec440f51e30fd236f7a0435b9d471acd93d0bc5a95df8213cbf02b1e083503d81b9a + "@babel/types": "npm:^7.25.9" + checksum: 10c0/095b6ba50489d797733abebc4596a81918316a99e3632755c9f02508882912b00c2ae5e468532a25a5c2108d109ddbe9b7da78333ee7cc13817fc50c00cf06fe languageName: node linkType: hard -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.24.7" +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.25.9" dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/0ed84abf848c79fb1cd4c1ddac12c771d32c1904d87fc3087f33cfdeb0c2e0db4e7892b74b407d9d8d0c000044f3645a7391a781f788da8410c290bb123a1f13 + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/a6068bb813e7f72d12b72edeecb99167f60cd7964cacedfb60e01fff5e7bed4a5a7f4f7414de7cf352a1b71487df5f8dab8c2b5230de4ad5aea16adf32e14219 languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.7, @babel/helper-compilation-targets@npm:^7.24.8, @babel/helper-compilation-targets@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-compilation-targets@npm:7.25.2" +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-compilation-targets@npm:7.25.9" dependencies: - "@babel/compat-data": "npm:^7.25.2" - "@babel/helper-validator-option": "npm:^7.24.8" - browserslist: "npm:^4.23.1" + "@babel/compat-data": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10c0/de10e986b5322c9f807350467dc845ec59df9e596a5926a3b5edbb4710d8e3b8009d4396690e70b88c3844fe8ec4042d61436dd4b92d1f5f75655cf43ab07e99 + checksum: 10c0/a6b26a1e4222e69ef8e62ee19374308f060b007828bc11c65025ecc9e814aba21ff2175d6d3f8bf53c863edd728ee8f94ba7870f8f90a37d39552ad9933a8aaa languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.24.7, @babel/helper-create-class-features-plugin@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/helper-create-class-features-plugin@npm:7.25.4" +"@babel/helper-create-class-features-plugin@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-create-class-features-plugin@npm:7.25.9" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-member-expression-to-functions": "npm:^7.24.8" - "@babel/helper-optimise-call-expression": "npm:^7.24.7" - "@babel/helper-replace-supers": "npm:^7.25.0" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.4" + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-member-expression-to-functions": "npm:^7.25.9" + "@babel/helper-optimise-call-expression": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/a765d9e0482e13cf96642fa8aa28e6f7d4d7d39f37840d6246e5e10a7c47f47c52d52522edd3073f229449d17ec0db6f9b7b5e398bff6bb0b4994d65957a164c + checksum: 10c0/b2bdd39f38056a76b9ba00ec5b209dd84f5c5ebd998d0f4033cf0e73d5f2c357fbb49d1ce52db77a2709fb29ee22321f84a5734dc9914849bdfee9ad12ce8caf languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.24.7, @babel/helper-create-regexp-features-plugin@npm:^7.25.0, @babel/helper-create-regexp-features-plugin@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.2" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.9" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - regexpu-core: "npm:^5.3.1" + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + regexpu-core: "npm:^6.1.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/85a7e3639c118856fb1113f54fb7e3bf7698171ddfd0cd6fccccd5426b3727bc1434fe7f69090441dcde327feef9de917e00d35e47ab820047057518dd675317 + checksum: 10c0/3adc60a758febbf07d65a15eaccab1f7b9fcc55e7141e59122f13c9f81fc0d1cce4525b7f4af50285d27c93b34c859fd2c39c39820c5fb92211898c3bbdc77ef languageName: node linkType: hard @@ -171,223 +173,210 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-member-expression-to-functions@npm:7.24.8" +"@babel/helper-member-expression-to-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-member-expression-to-functions@npm:7.25.9" dependencies: - "@babel/traverse": "npm:^7.24.8" - "@babel/types": "npm:^7.24.8" - checksum: 10c0/7e14a5acc91f6cd26305a4441b82eb6f616bd70b096a4d2099a968f16b26d50207eec0b9ebfc466fefd62bd91587ac3be878117cdfec819b7151911183cb0e5a + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/e08c7616f111e1fb56f398365e78858e26e466d4ac46dff25921adc5ccae9b232f66e952a2f4162bbe336627ba336c7fd9eca4835b6548935973d3380d77eaff languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-module-imports@npm:7.24.7" +"@babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/97c57db6c3eeaea31564286e328a9fb52b0313c5cfcc7eee4bc226aebcf0418ea5b6fe78673c0e4a774512ec6c86e309d0f326e99d2b37bfc16a25a032498af0 + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.24.7, @babel/helper-module-transforms@npm:^7.24.8, @babel/helper-module-transforms@npm:^7.25.0, @babel/helper-module-transforms@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-module-transforms@npm:7.25.2" +"@babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" dependencies: - "@babel/helper-module-imports": "npm:^7.24.7" - "@babel/helper-simple-access": "npm:^7.24.7" - "@babel/helper-validator-identifier": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.2" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/adaa15970ace0aee5934b5a633789b5795b6229c6a9cf3e09a7e80aa33e478675eee807006a862aa9aa517935d81f88a6db8a9f5936e3a2a40ec75f8062bc329 + checksum: 10c0/ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a languageName: node linkType: hard -"@babel/helper-optimise-call-expression@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-optimise-call-expression@npm:7.24.7" +"@babel/helper-optimise-call-expression@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-optimise-call-expression@npm:7.25.9" dependencies: - "@babel/types": "npm:^7.24.7" - checksum: 10c0/ca6a9884705dea5c95a8b3ce132d1e3f2ae951ff74987d400d1d9c215dae9c0f9e29924d8f8e131e116533d182675bc261927be72f6a9a2968eaeeaa51eb1d0f + "@babel/types": "npm:^7.25.9" + checksum: 10c0/90203e6607edeadd2a154940803fd616c0ed92c1013d6774c4b8eb491f1a5a3448b68faae6268141caa5c456e55e3ee49a4ed2bd7ddaf2365daea321c435914c languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.24.8, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.24.8 - resolution: "@babel/helper-plugin-utils@npm:7.24.8" - checksum: 10c0/0376037f94a3bfe6b820a39f81220ac04f243eaee7193774b983e956c1750883ff236b30785795abbcda43fac3ece74750566830c2daa4d6e3870bb0dff34c2d +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-plugin-utils@npm:7.25.9" + checksum: 10c0/483066a1ba36ff16c0116cd24f93de05de746a603a777cd695ac7a1b034928a65a4ecb35f255761ca56626435d7abdb73219eba196f9aa83b6c3c3169325599d languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.24.7, @babel/helper-remap-async-to-generator@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helper-remap-async-to-generator@npm:7.25.0" +"@babel/helper-remap-async-to-generator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-remap-async-to-generator@npm:7.25.9" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-wrap-function": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.0" + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-wrap-function": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/0d17b5f7bb6a607edc9cc62fff8056dd9f341bf2f919884f97b99170d143022a5e7ae57922c4891e4fc360ad291e708d2f8cd8989f1d3cd7a17600159984f5a6 + checksum: 10c0/6798b562f2788210980f29c5ee96056d90dc73458c88af5bd32f9c82e28e01975588aa2a57bb866c35556bd9b76bac937e824ee63ba472b6430224b91b4879e9 languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.24.7, @babel/helper-replace-supers@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helper-replace-supers@npm:7.25.0" +"@babel/helper-replace-supers@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-replace-supers@npm:7.25.9" dependencies: - "@babel/helper-member-expression-to-functions": "npm:^7.24.8" - "@babel/helper-optimise-call-expression": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.0" + "@babel/helper-member-expression-to-functions": "npm:^7.25.9" + "@babel/helper-optimise-call-expression": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/b4b6650ab3d56c39a259367cd97f8df2f21c9cebb3716fea7bca40a150f8847bfb82f481e98927c7c6579b48a977b5a8f77318a1c6aeb497f41ecd6dbc3fdfef + checksum: 10c0/0b40d7d2925bd3ba4223b3519e2e4d2456d471ad69aa458f1c1d1783c80b522c61f8237d3a52afc9e47c7174129bbba650df06393a6787d5722f2ec7f223c3f4 languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-simple-access@npm:7.24.7" +"@babel/helper-simple-access@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-simple-access@npm:7.25.9" dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/7230e419d59a85f93153415100a5faff23c133d7442c19e0cd070da1784d13cd29096ee6c5a5761065c44e8164f9f80e3a518c41a0256df39e38f7ad6744fed7 + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/3f1bcdb88ee3883ccf86959869a867f6bbf8c4737cd44fb9f799c38e54f67474590bc66802500ae9fe18161792875b2cfb7ec15673f48ed6c8663f6d09686ca8 languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.7" +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9" dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/e3a9b8ac9c262ac976a1bcb5fe59694db5e6f0b4f9e7bdba5c7693b8b5e28113c23bdaa60fe8d3ec32a337091b67720b2053bcb3d5655f5406536c3d0584242b + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/09ace0c6156961624ac9524329ce7f45350bab94bbe24335cbe0da7dfaa1448e658771831983cb83fe91cf6635b15d0a3cab57c03b92657480bfb49fb56dd184 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-string-parser@npm:7.24.8" - checksum: 10c0/6361f72076c17fabf305e252bf6d580106429014b3ab3c1f5c4eb3e6d465536ea6b670cc0e9a637a77a9ad40454d3e41361a2909e70e305116a23d68ce094c08 +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10c0/7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-validator-identifier@npm:7.24.7" - checksum: 10c0/87ad608694c9477814093ed5b5c080c2e06d44cb1924ae8320474a74415241223cc2a725eea2640dd783ff1e3390e5f95eede978bc540e870053152e58f1d651 +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-validator-option@npm:7.24.8" - checksum: 10c0/73db93a34ae89201351288bee7623eed81a54000779462a986105b54ffe82069e764afd15171a428b82e7c7a9b5fec10b5d5603b216317a414062edf5c67a21f +"@babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 10c0/27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helper-wrap-function@npm:7.25.0" +"@babel/helper-wrap-function@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-wrap-function@npm:7.25.9" dependencies: - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10c0/d54601a98384c191cbc1ff07b03a19e288ef8d5c6bfafe270b2a303d96e7304eb296002921ed464cc1b105a547d1db146eb86b0be617924dee1ba1b379cdc216 + "@babel/template": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/b6627d83291e7b80df020f8ee2890c52b8d49272962cac0114ef90f189889c90f1027985873d1b5261a4e986e109b2754292dc112392f0b1fcbfc91cc08bd003 languageName: node linkType: hard -"@babel/helpers@npm:^7.25.0": - version: 7.25.6 - resolution: "@babel/helpers@npm:7.25.6" +"@babel/helpers@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helpers@npm:7.26.0" dependencies: - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.6" - checksum: 10c0/448c1cdabccca42fd97a252f73f1e4bcd93776dbf24044f3b4f49b756bf2ece73ee6df05177473bb74ea7456dddd18d6f481e4d96d2cc7839d078900d48c696c + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.26.0" + checksum: 10c0/343333cced6946fe46617690a1d0789346960910225ce359021a88a60a65bc0d791f0c5d240c0ed46cf8cc63b5fd7df52734ff14e43b9c32feae2b61b1647097 languageName: node linkType: hard -"@babel/highlight@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/highlight@npm:7.24.7" +"@babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/parser@npm:7.26.0" dependencies: - "@babel/helper-validator-identifier": "npm:^7.24.7" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10c0/674334c571d2bb9d1c89bdd87566383f59231e16bcdcf5bb7835babdf03c9ae585ca0887a7b25bdf78f303984af028df52831c7989fecebb5101cc132da9393a - languageName: node - linkType: hard - -"@babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/parser@npm:7.25.6" - dependencies: - "@babel/types": "npm:^7.25.6" + "@babel/types": "npm:^7.26.0" bin: parser: ./bin/babel-parser.js - checksum: 10c0/f88a0e895dbb096fd37c4527ea97d12b5fc013720602580a941ac3a339698872f0c911e318c292b184c36b5fbe23b612f05aff9d24071bc847c7b1c21552c41d + checksum: 10c0/05619e239be811f4d8a9f471534c0d7dbc44faf38f6a6445663710982d2f9b057be43b4d18906d4e28830958752bdadbf88903abf687304a2bda86c4b3489455 languageName: node linkType: hard -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.3": - version: 7.25.3 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.3" +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/traverse": "npm:^7.25.3" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/814b4d3f102e7556a5053d1acf57ef601cfcff39a2c81b8cdc6a5c842e3cb9838f5925d1466a5f1e6416e74c9c83586a3c07fbd7fb8610a396c2becdf9ae5790 + checksum: 10c0/7aab47fcbb8c1ddc195a3cd66609edcad54c5022f018db7de40185f0182950389690e953e952f117a1737b72f665ff02ad30de6c02b49b97f1d8f4ccdffedc34 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.0" +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/9645a1f47b3750acadb1353c02e71cc712d072aafe5ce115ed3a886bc14c5d9200cfb0b5b5e60e813baa549b800cf798f8714019fd246c699053cf68c428e426 + checksum: 10c0/3a652b3574ca62775c5f101f8457950edc540c3581226579125da535d67765f41ad7f0e6327f8efeb2540a5dad5bb0c60a89fb934af3f67472e73fb63612d004 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.0" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/ed1ce1c90cac46c01825339fd0f2a96fa071b016fb819d8dfaf8e96300eae30e74870cb47e4dc80d4ce2fb287869f102878b4f3b35bc927fec8b1d0d76bcf612 + checksum: 10c0/18fc9004104a150f9f5da9f3307f361bc3104d16778bb593b7523d5110f04a8df19a2587e6bdd5e726fb1d397191add45223f4f731bb556c33f14f2779d596e8 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.7" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.13.0 - checksum: 10c0/aeb6e7aa363a47f815cf956ea1053c5dd8b786a17799f065c9688ba4b0051fe7565d258bbe9400bfcbfb3114cb9fda66983e10afe4d750bc70ff75403e15dd36 + checksum: 10c0/3f6c8781a2f7aa1791a31d2242399ca884df2ab944f90c020b6f112fb19f05fa6dad5be143d274dad1377e40415b63d24d5489faf5060b9c4a99e55d8f0c317c languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.0" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/traverse": "npm:^7.25.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/45988025537a9d4a27b610fd696a18fd9ba9336621a69b4fb40560eeb10c79657f85c92a37f30c7c8fb29c22970eea0b373315795a891f1a05549a6cfe5a6bfe + checksum: 10c0/02b365f0cc4df8b8b811c68697c93476da387841e5f153fe42766f34241b685503ea51110d5ed6df7132759820b93e48d9fa3743cffc091eed97c19f7e5fe272 languageName: node linkType: hard @@ -400,190 +389,25 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-async-generators@npm:^7.8.4": - version: 7.8.4 - resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/d13efb282838481348c71073b6be6245b35d4f2f964a8f71e4174f235009f929ef7613df25f8d2338e2d3e44bc4265a9f8638c6aaa136d7a61fe95985f9725c8 - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-properties@npm:^7.12.13": - version: 7.12.13 - resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.12.13" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/95168fa186416195280b1264fb18afcdcdcea780b3515537b766cb90de6ce042d42dd6a204a39002f794ae5845b02afb0fd4861a3308a861204a55e68310a120 - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-static-block@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/4464bf9115f4a2d02ce1454411baf9cfb665af1da53709c5c56953e5e2913745b0fcce82982a00463d6facbdd93445c691024e310b91431a1e2f024b158f6371 - languageName: node - linkType: hard - -"@babel/plugin-syntax-dynamic-import@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-dynamic-import@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/9c50927bf71adf63f60c75370e2335879402648f468d0172bc912e303c6a3876927d8eb35807331b57f415392732ed05ab9b42c68ac30a936813ab549e0246c5 - languageName: node - linkType: hard - -"@babel/plugin-syntax-export-namespace-from@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-export-namespace-from@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/5100d658ba563829700cd8d001ddc09f4c0187b1a13de300d729c5b3e87503f75a6d6c99c1794182f7f1a9f546ee009df4f15a0ce36376e206ed0012fa7cdc24 - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-assertions@npm:^7.24.7": - version: 7.25.6 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.25.6" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/55afa63b1b1355bcc1d85a9ad9d2c78983e27beee38e232d5c1ab59eac39127ce3c3817d6686e3ab1d0aff5edd8e38a6852885c65d3e518accdd183a445ef411 - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-attributes@npm:^7.24.7": - version: 7.25.6 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.25.6" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/0e9359cf2d117476310961dfcfd7204ed692e933707da10d6194153d3996cd2ea5b7635fc90d720dce3612083af89966bb862561064a509c350320dc98644751 - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-meta@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/0b08b5e4c3128523d8e346f8cfc86824f0da2697b1be12d71af50a31aff7a56ceb873ed28779121051475010c28d6146a6bfea8518b150b71eeb4e46190172ee - languageName: node - linkType: hard - -"@babel/plugin-syntax-json-strings@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/e98f31b2ec406c57757d115aac81d0336e8434101c224edd9a5c93cefa53faf63eacc69f3138960c8b25401315af03df37f68d316c151c4b933136716ed6906e - languageName: node - linkType: hard - -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/2594cfbe29411ad5bc2ad4058de7b2f6a8c5b86eda525a993959438615479e59c012c14aec979e538d60a584a1a799b60d1b8942c3b18468cb9d99b8fd34cd0b - languageName: node - linkType: hard - -"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/2024fbb1162899094cfc81152449b12bd0cc7053c6d4bda8ac2852545c87d0a851b1b72ed9560673cbf3ef6248257262c3c04aabf73117215c1b9cc7dd2542ce - languageName: node - linkType: hard - -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9 - languageName: node - linkType: hard - -"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/ee1eab52ea6437e3101a0a7018b0da698545230015fc8ab129d292980ec6dff94d265e9e90070e8ae5fed42f08f1622c14c94552c77bcac784b37f503a82ff26 - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/27e2493ab67a8ea6d693af1287f7e9acec206d1213ff107a928e85e173741e1d594196f99fec50e9dde404b09164f39dec5864c767212154ffe1caa6af0bc5af - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/46edddf2faa6ebf94147b8e8540dfc60a5ab718e2de4d01b2c0bdf250a4d642c2bd47cbcbb739febcb2bf75514dbcefad3c52208787994b8d0f8822490f55e81 - languageName: node - linkType: hard - -"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" +"@babel/plugin-syntax-import-assertions@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.26.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/69822772561706c87f0a65bc92d0772cea74d6bc0911537904a676d5ff496a6d3ac4e05a166d8125fce4a16605bace141afc3611074e170a994e66e5397787f3 + checksum: 10c0/525b174e60b210d96c1744c1575fc2ddedcc43a479cba64a5344cf77bd0541754fc58120b5a11ff832ba098437bb05aa80900d1f49bb3d888c5e349a4a3a356e languageName: node linkType: hard -"@babel/plugin-syntax-top-level-await@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" +"@babel/plugin-syntax-import-attributes@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/14bf6e65d5bc1231ffa9def5f0ef30b19b51c218fcecaa78cd1bdf7939dfdf23f90336080b7f5196916368e399934ce5d581492d8292b46a2fb569d8b2da106f + checksum: 10c0/e594c185b12bfe0bbe7ca78dfeebe870e6d569a12128cac86f3164a075fe0ff70e25ddbd97fd0782906b91f65560c9dc6957716b7b4a68aba2516c9b7455e352 languageName: node linkType: hard @@ -599,685 +423,671 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.7" +"@babel/plugin-transform-arrow-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6ac05a54e5582f34ac6d5dc26499e227227ec1c7fa6fc8de1f3d40c275f140d3907f79bbbd49304da2d7008a5ecafb219d0b71d78ee3290ca22020d878041245 + checksum: 10c0/851fef9f58be60a80f46cc0ce1e46a6f7346a6f9d50fa9e0fa79d46ec205320069d0cc157db213e2bea88ef5b7d9bd7618bb83f0b1996a836e2426c3a3a1f622 languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.4" +"@babel/plugin-transform-async-generator-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-remap-async-to-generator": "npm:^7.25.0" - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - "@babel/traverse": "npm:^7.25.4" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-remap-async-to-generator": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/efed6f6be90b25ad77c15a622a0dc0b22dbf5d45599c207ab8fbc4e959aef21f574fa467d9cf872e45de664a46c32334e78dee2332d82f5f27e26249a34a0920 + checksum: 10c0/e3fcb9fc3d6ab6cbd4fcd956b48c17b5e92fe177553df266ffcd2b2c1f2f758b893e51b638e77ed867941e0436487d2b8b505908d615c41799241699b520dec6 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.7" +"@babel/plugin-transform-async-to-generator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9" dependencies: - "@babel/helper-module-imports": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-remap-async-to-generator": "npm:^7.24.7" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-remap-async-to-generator": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/83c82e243898875af8457972a26ab29baf8a2078768ee9f35141eb3edff0f84b165582a2ff73e90a9e08f5922bf813dbf15a85c1213654385198f4591c0dc45d + checksum: 10c0/c443d9e462ddef733ae56360064f32fc800105803d892e4ff32d7d6a6922b3765fa97b9ddc9f7f1d3f9d8c2d95721d85bef9dbf507804214c6cf6466b105c168 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.7" +"@babel/plugin-transform-block-scoped-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/113e86de4612ae91773ff5cb6b980f01e1da7e26ae6f6012127415d7ae144e74987bc23feb97f63ba4bc699331490ddea36eac004d76a20d5369e4cc6a7f61cd + checksum: 10c0/e92ba0e3d72c038513844d8fca1cc8437dcb35cd42778e97fd03cb8303380b201468611e7ecfdcae3de33473b2679fe2de1552c5f925d112c5693425cf851f10 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-block-scoping@npm:7.25.0" +"@babel/plugin-transform-block-scoping@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-block-scoping@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/382931c75a5d0ea560387e76cb57b03461300527e4784efcb2fb62f36c1eb0ab331327b6034def256baa0cad9050925a61f9c0d56261b6afd6a29c3065fb0bd4 + checksum: 10c0/a76e30becb6c75b4d87a2cd53556fddb7c88ddd56bfadb965287fd944810ac159aa8eb5705366fc37336041f63154ed9fab3862fb10482a45bf5ede63fd55fda languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/plugin-transform-class-properties@npm:7.25.4" +"@babel/plugin-transform-class-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-class-properties@npm:7.25.9" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.4" - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/0b41bc8a5920d3d17c7c06220b601cf43e0a32ac34f05f05cd0cdf08915e4521b1b707cb1e60942b4fc68a5dfac09f0444a8720e0c72ce76fb039e8ec5263115 + checksum: 10c0/f0603b6bd34d8ba62c03fc0572cb8bbc75874d097ac20cc7c5379e001081210a84dba1749e7123fca43b978382f605bb9973c99caf2c5b4c492d5c0a4a441150 languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-class-static-block@npm:7.24.7" +"@babel/plugin-transform-class-static-block@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-transform-class-static-block@npm:7.26.0" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.12.0 - checksum: 10c0/b0ade39a3d09dce886f79dbd5907c3d99b48167eddb6b9bbde24a0598129654d7017e611c20494cdbea48b07ac14397cd97ea34e3754bbb2abae4e698128eccb + checksum: 10c0/cdcf5545ae6514ed75fbd73cccfa209c6a5dfdf0c2bb7bb62c0fb4ec334a32281bcf1bc16ace494d9dbe93feb8bdc0bd3cf9d9ccb6316e634a67056fa13b741b languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/plugin-transform-classes@npm:7.25.4" +"@babel/plugin-transform-classes@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-classes@npm:7.25.9" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-compilation-targets": "npm:^7.25.2" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-replace-supers": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.4" + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/c68424d9dd64860825111aa4a4ed5caf29494b7a02ddb9c36351d768c41e8e05127d89274795cdfcade032d9d299e6c677418259df58c71e68f1741583dcf467 + checksum: 10c0/02742ea7cd25be286c982e672619effca528d7a931626a6f3d6cea11852951b7ee973276127eaf6418ac0e18c4d749a16b520709c707e86a67012bd23ff2927d languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-computed-properties@npm:7.24.7" +"@babel/plugin-transform-computed-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-computed-properties@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/template": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/template": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/25636dbc1f605c0b8bc60aa58628a916b689473d11551c9864a855142e36742fe62d4a70400ba3b74902338e77fb3d940376c0a0ba154b6b7ec5367175233b49 + checksum: 10c0/948c0ae3ce0ba2375241d122a9bc7cda4a7ac8110bd8a62cd804bc46a5fdb7a7a42c7799c4cd972e14e0a579d2bd0999b92e53177b73f240bb0d4b09972c758b languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-destructuring@npm:7.24.8" +"@babel/plugin-transform-destructuring@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-destructuring@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/804968c1d5f5072c717505296c1e5d5ec33e90550423de66de82bbcb78157156e8470bbe77a04ab8c710a88a06360a30103cf223ac7eff4829adedd6150de5ce + checksum: 10c0/7beec5fda665d108f69d5023aa7c298a1e566b973dd41290faa18aeea70f6f571295c1ece0a058f3ceb6c6c96de76de7cd34f5a227fbf09a1b8d8a735d28ca49 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.7" +"@babel/plugin-transform-dotall-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.9" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/793f14c9494972d294b7e7b97b747f47874b6d57d7804d3443c701becf5db192c9311be6a1835c07664486df1f5c60d33196c36fb7e11a53015e476b4c145b33 + checksum: 10c0/7c3471ae5cf7521fd8da5b03e137e8d3733fc5ee4524ce01fb0c812f0bb77cb2c9657bc8a6253186be3a15bb4caa8974993c7ddc067f554ecc6a026f0a3b5e12 languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.7" +"@babel/plugin-transform-duplicate-keys@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/75ff7ec1117ac500e77bf20a144411d39c0fdd038f108eec061724123ce6d1bb8d5bd27968e466573ee70014f8be0043361cdb0ef388f8a182d1d97ad67e51b9 + checksum: 10c0/d0c74894b9bf6ff2a04189afffb9cd43d87ebd7b7943e51a827c92d2aaa40fa89ac81565a2fd6fbeabf9e38413a9264c45862eee2b017f1d49046cc3c8ff06b4 languageName: node linkType: hard -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.0" +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.9" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.0" - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/1c9b57ddd9b33696e88911d0e7975e1573ebc46219c4b30eb1dc746cbb71aedfac6f6dab7fdfdec54dd58f31468bf6ab56b157661ea4ffe58f906d71f89544c8 + checksum: 10c0/a8039a6d2b90e011c7b30975edee47b5b1097cf3c2f95ec1f5ddd029898d783a995f55f7d6eb8d6bb8873c060fb64f9f1ccba938dfe22d118d09cf68e0cd3bf6 languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.7" +"@babel/plugin-transform-dynamic-import@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/eeda48372efd0a5103cb22dadb13563c975bce18ae85daafbb47d57bb9665d187da9d4fe8d07ac0a6e1288afcfcb73e4e5618bf75ff63fddf9736bfbf225203b + checksum: 10c0/5e643a8209072b668350f5788f23c64e9124f81f958b595c80fecca6561086d8ef346c04391b9e5e4cad8b8cbe22c258f0cd5f4ea89b97e74438e7d1abfd98cf languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.7" +"@babel/plugin-transform-exponentiation-operator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.25.9" dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/ace3e11c94041b88848552ba8feb39ae4d6cad3696d439ff51445bd2882d8b8775d85a26c2c0edb9b5e38c9e6013cc11b0dea89ec8f93c7d9d7ee95e3645078c + checksum: 10c0/3b42f65bab3fee28c385115ce6bcb6ba544dff187012df408a432c9fb44c980afd898911020c723dc1c9257aaf3d7d0131ad83ba15102bf30ad9a86fc2a8a912 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.7" +"@babel/plugin-transform-export-namespace-from@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4e144d7f1c57bc63b4899dbbbdfed0880f2daa75ea9c7251c7997f106e4b390dc362175ab7830f11358cb21f6b972ca10a43a2e56cd789065f7606b082674c0c + checksum: 10c0/f291ea2ec5f36de9028a00cbd5b32f08af281b8183bf047200ff001f4cb260be56f156b2449f42149448a4a033bd6e86a3a7f06d0c2825532eb0ae6b03058dfb languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-for-of@npm:7.24.7" +"@babel/plugin-transform-for-of@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-for-of@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/77629b1173e55d07416f05ba7353caa09d2c2149da2ca26721ab812209b63689d1be45116b68eadc011c49ced59daf5320835b15245eb7ae93ae0c5e8277cfc0 + checksum: 10c0/bf11abc71934a1f369f39cd7a33cf3d4dc5673026a53f70b7c1238c4fcc44e68b3ca1bdbe3db2076f60defb6ffe117cbe10b90f3e1a613b551d88f7c4e693bbe languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.25.1": - version: 7.25.1 - resolution: "@babel/plugin-transform-function-name@npm:7.25.1" +"@babel/plugin-transform-function-name@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-function-name@npm:7.25.9" dependencies: - "@babel/helper-compilation-targets": "npm:^7.24.8" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/traverse": "npm:^7.25.1" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e74912174d5e33d1418b840443c2e226a7b76cc017c1ed20ee30a566e4f1794d4a123be03180da046241576e8b692731807ba1f52608922acf1cb2cb6957593f + checksum: 10c0/8e67fbd1dd367927b8b6afdf0a6e7cb3a3fd70766c52f700ca77428b6d536f6c9d7ec643e7762d64b23093233765c66bffa40e31aabe6492682879bcb45423e1 languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-json-strings@npm:7.24.7" +"@babel/plugin-transform-json-strings@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-json-strings@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/17c72cd5bf3e90e722aabd333559275f3309e3fa0b9cea8c2944ab83ae01502c71a2be05da5101edc02b3fc8df15a8dbb9b861cbfcc8a52bf5e797cf01d3a40a + checksum: 10c0/00bc2d4751dfc9d44ab725be16ee534de13cfd7e77dfb386e5dac9e48101ce8fcbc5971df919dc25b3f8a0fa85d6dc5f2a0c3cf7ec9d61c163d9823c091844f0 languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/plugin-transform-literals@npm:7.25.2" +"@babel/plugin-transform-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-literals@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/0796883217b0885d37e7f6d350773be349e469a812b6bf11ccf862a6edf65103d3e7c849529d65381b441685c12e756751d8c2489a0fd3f8139bb5ef93185f58 + checksum: 10c0/00b14e9c14cf1e871c1f3781bf6334cac339c360404afd6aba63d2f6aca9270854d59a2b40abff1c4c90d4ffdca614440842d3043316c2f0ceb155fdf7726b3b languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.7" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/dbe882eb9053931f2ab332c50fc7c2a10ef507d6421bd9831adbb4cb7c9f8e1e5fbac4fbd2e007f6a1bf1df1843547559434012f118084dc0bf42cda3b106272 + checksum: 10c0/6e2051e10b2d6452980fc4bdef9da17c0d6ca48f81b8529e8804b031950e4fff7c74a7eb3de4a2b6ad22ffb631d0b67005425d232cce6e2b29ce861c78ed04f5 languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.7" +"@babel/plugin-transform-member-expression-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e789ae359bdf2d20e90bedef18dfdbd965c9ebae1cee398474a0c349590fda7c8b874e1a2ceee62e47e5e6ec1730e76b0f24e502164357571854271fc12cc684 + checksum: 10c0/91d17b451bcc5ea9f1c6f8264144057ade3338d4b92c0b248366e4db3a7790a28fd59cc56ac433a9627a9087a17a5684e53f4995dd6ae92831cb72f1bd540b54 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-amd@npm:7.24.7" +"@babel/plugin-transform-modules-amd@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-amd@npm:7.25.9" dependencies: - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6df7de7fce34117ca4b2fa07949b12274c03668cbfe21481c4037b6300796d50ae40f4f170527b61b70a67f26db906747797e30dbd0d9809a441b6e220b5728f + checksum: 10c0/849957d9484d0a2d93331226ed6cf840cee7d57454549534c447c93f8b839ef8553eae9877f8f550e3c39f14d60992f91244b2e8e7502a46064b56c5d68ba855 languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.8" +"@babel/plugin-transform-modules-commonjs@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.25.9" dependencies: - "@babel/helper-module-transforms": "npm:^7.24.8" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-simple-access": "npm:^7.24.7" + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-simple-access": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f1cf552307ebfced20d3907c1dd8be941b277f0364aa655e2b5fee828c84c54065745183104dae86f1f93ea0406db970a463ef7ceaaed897623748e99640e5a7 + checksum: 10c0/6ce771fb04d4810257fc8900374fece877dacaed74b05eaa16ad9224b390f43795c4d046cbe9ae304e1eb5aad035d37383895e3c64496d647c2128d183916e74 languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.0" +"@babel/plugin-transform-modules-systemjs@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.9" dependencies: - "@babel/helper-module-transforms": "npm:^7.25.0" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-validator-identifier": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.0" + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/fca6198da71237e4bb1274b3b67a0c81d56013c9535361242b6bfa87d70a9597854aadb45d4d8203369be4a655e158be2a5d20af0040b1f8d1bfc47db3ad7b68 + checksum: 10c0/8299e3437542129c2684b86f98408c690df27db4122a79edded4782cf04e755d6ecb05b1e812c81a34224a81e664303392d5f3c36f3d2d51fdc99bb91c881e9a languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-umd@npm:7.24.7" +"@babel/plugin-transform-modules-umd@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-umd@npm:7.25.9" dependencies: - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/7791d290121db210e4338b94b4a069a1a79e4c7a8d7638d8159a97b281851bbed3048dac87a4ae718ad963005e6c14a5d28e6db2eeb2b04e031cee92fb312f85 + checksum: 10c0/fa11a621f023e2ac437b71d5582f819e667c94306f022583d77da9a8f772c4128861a32bbb63bef5cba581a70cd7dbe87a37238edaafcfacf889470c395e7076 languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.7" +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.9" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/41a0b0f2d0886318237440aa3b489f6d0305361d8671121777d9ff89f9f6de9d0c02ce93625049061426c8994064ef64deae8b819d1b14c00374a6a2336fb5d9 + checksum: 10c0/32b14fda5c885d1706863f8af2ee6c703d39264355b57482d3a24fce7f6afbd4c7a0896e501c0806ed2b0759beb621bf7f3f7de1fbbc82026039a98d961e78ef languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-new-target@npm:7.24.7" +"@babel/plugin-transform-new-target@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-new-target@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/2540808a35e1a978e537334c43dab439cf24c93e7beb213a2e71902f6710e60e0184316643790c0a6644e7a8021e52f7ab8165e6b3e2d6651be07bdf517b67df + checksum: 10c0/7b5f1b7998f1cf183a7fa646346e2f3742e5805b609f28ad5fee22d666a15010f3e398b7e1ab78cddb7901841a3d3f47135929af23d54e8bf4ce69b72051f71e languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.7" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/7243c8ff734ed5ef759dd8768773c4b443c12e792727e759a1aec2c7fa2bfdd24f1ecb42e292a7b3d8bd3d7f7b861cf256a8eb4ba144fc9cc463892c303083d9 + checksum: 10c0/eb623db5be078a1c974afe7c7797b0309ba2ea9e9237c0b6831ade0f56d8248bb4ab3432ab34495ff8c877ec2fe412ff779d1e9b3c2b8139da18e1753d950bc3 languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.7" +"@babel/plugin-transform-numeric-separator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e18e09ca5a6342645d00ede477731aa6e8714ff357efc9d7cda5934f1703b3b6fb7d3298dce3ce3ba53e9ff1158eab8f1aadc68874cc21a6099d33a1ca457789 + checksum: 10c0/ad63ad341977844b6f9535fcca15ca0d6d6ad112ed9cc509d4f6b75e9bf4b1b1a96a0bcb1986421a601505d34025373608b5f76d420d924b4e21f86b1a1f2749 languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.7" +"@babel/plugin-transform-object-rest-spread@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9" dependencies: - "@babel/helper-compilation-targets": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.24.7" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/plugin-transform-parameters": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/9ad64bc003f583030f9da50614b485852f8edac93f8faf5d1cd855201a4852f37c5255ae4daf70dd4375bdd4874e16e39b91f680d4668ec219ba05441ce286eb + checksum: 10c0/02077d8abd83bf6a48ff0b59e98d7561407cf75b591cffd3fdc5dc5e9a13dec1c847a7a690983762a3afecddb244831e897e0515c293e7c653b262c30cd614af languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-object-super@npm:7.24.7" +"@babel/plugin-transform-object-super@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-object-super@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-replace-supers": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/770cebb4b4e1872c216b17069db9a13b87dfee747d359dc56d9fcdd66e7544f92dc6ab1861a4e7e0528196aaff2444e4f17dc84efd8eaf162d542b4ba0943869 + checksum: 10c0/0348d00e76f1f15ada44481a76e8c923d24cba91f6e49ee9b30d6861eb75344e7f84d62a18df8a6f9e9a7eacf992f388174b7f9cc4ce48287bcefca268c07600 languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.7" +"@babel/plugin-transform-optional-catch-binding@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/1e2f10a018f7d03b3bde6c0b70d063df8d5dd5209861d4467726cf834f5e3d354e2276079dc226aa8e6ece35f5c9b264d64b8229a8bb232829c01e561bcfb07a + checksum: 10c0/722fd5ee12ab905309d4e84421584fce4b6d9e6b639b06afb20b23fa809e6ab251e908a8d5e8b14d066a28186b8ef8f58d69fd6eca9ce1b9ef7af08333378f6c languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.24.7, @babel/plugin-transform-optional-chaining@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.8" +"@babel/plugin-transform-optional-chaining@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4ffbe1aad7dec7c9aa2bf6ceb4b2f91f96815b2784f2879bde80e46934f59d64a12cb2c6262e40897c4754d77d2c35d8a5cfed63044fdebf94978b1ed3d14b17 + checksum: 10c0/041ad2beae5affb8e68a0bcb6882a2dadb758db3c629a0e012f57488ab43a822ac1ea17a29db8ef36560a28262a5dfa4dbbbf06ed6e431db55abe024b7cd3961 languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-parameters@npm:7.24.7" +"@babel/plugin-transform-parameters@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-parameters@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/53bf190d6926771545d5184f1f5f3f5144d0f04f170799ad46a43f683a01fab8d5fe4d2196cf246774530990c31fe1f2b9f0def39f0a5ddbb2340b924f5edf01 + checksum: 10c0/aecb446754b9e09d6b6fa95fd09e7cf682f8aaeed1d972874ba24c0a30a7e803ad5f014bb1fffc7bfeed22f93c0d200947407894ea59bf7687816f2f464f8df3 languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/plugin-transform-private-methods@npm:7.25.4" +"@babel/plugin-transform-private-methods@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.4" - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/7abdb427c3984a2c8a2e9d806297d8509b02f78a3501b7760e544be532446e9df328b876daa8fc38718f3dce7ccc45083016ee7aeaab169b81c142bc18700794 + checksum: 10c0/64bd71de93d39daefa3e6c878d6f2fd238ed7d4ecfb13b0e771ddbbc131487def3ceb405b62b534a5cbb5043046b504e1b189b0a45229cc75af979a9fbcaa7bd languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.7" +"@babel/plugin-transform-private-property-in-object@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.9" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/c6fa7defb90b1b0ed46f24ff94ff2e77f44c1f478d1090e81712f33cf992dda5ba347016f030082a2f770138bac6f4a9c2c1565e9f767a125901c77dd9c239ba + checksum: 10c0/d4965de19d9f204e692cc74dbc39f0bb469e5f29df96dd4457ea23c5e5596fba9d5af76eaa96f9d48a9fc20ec5f12a94c679285e36b8373406868ea228109e27 languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-property-literals@npm:7.24.7" +"@babel/plugin-transform-property-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-property-literals@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/52564b58f3d111dc02d241d5892a4b01512e98dfdf6ef11b0ed62f8b11b0acacccef0fc229b44114fe8d1a57a8b70780b11bdd18b807d3754a781a07d8f57433 + checksum: 10c0/1639e35b2438ccf3107af760d34e6a8e4f9acdd3ae6186ae771a6e3029bd59dfe778e502d67090f1185ecda5c16addfed77561e39c518a3f51ff10d41790e106 languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-regenerator@npm:7.24.7" +"@babel/plugin-transform-regenerator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-regenerator@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" regenerator-transform: "npm:^0.15.2" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/d2dc2c788fdae9d97217e70d46ba8ca9db0035c398dc3e161552b0c437113719a75c04f201f9c91ddc8d28a1da60d0b0853f616dead98a396abb9c845c44892b + checksum: 10c0/eef3ffc19f7d291b863635f32b896ad7f87806d9219a0d3404a470219abcfc5b43aabecd691026c48e875b965760d9c16abee25e6447272233f30cd07f453ec7 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-reserved-words@npm:7.24.7" +"@babel/plugin-transform-regexp-modifiers@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.26.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/4abc1db6c964efafc7a927cda814c7275275afa4b530483e0936fd614de23cb5802f7ca43edaa402008a723d4e7eac282b6f5283aa2eeb3b27da6d6c1dd7f8ed + languageName: node + linkType: hard + +"@babel/plugin-transform-reserved-words@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-reserved-words@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/2229de2768615e7f5dc0bbc55bc121b5678fd6d2febd46c74a58e42bb894d74cd5955c805880f4e02d0e1cf94f6886270eda7fafc1be9305a1ec3b9fd1d063f5 + checksum: 10c0/8b028b80d1983e3e02f74e21924323cc66ba930e5c5758909a122aa7d80e341b8b0f42e1698e42b50d47a6ba911332f584200b28e1a4e2104b7514d9dc011e96 languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.7" +"@babel/plugin-transform-shorthand-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/41b155bdbb3be66618358488bf7731b3b2e8fff2de3dbfd541847720a9debfcec14db06a117abedd03c9cd786db20a79e2a86509a4f19513f6e1b610520905cf + checksum: 10c0/05a20d45f0fb62567644c507ccd4e379c1a74dacf887d2b2cac70247415e3f6d7d3bf4850c8b336053144715fedb6200fc38f7130c4b76c94eec9b9c0c2a8e9b languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-spread@npm:7.24.7" +"@babel/plugin-transform-spread@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-spread@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/facba1553035f76b0d2930d4ada89a8cd0f45b79579afd35baefbfaf12e3b86096995f4b0c402cf9ee23b3f2ea0a4460c3b1ec0c192d340962c948bb223d4e66 + checksum: 10c0/996c8fed238efc30e0664f9f58bd7ec8c148f4659f84425f68923a094fe891245711d26eb10d1f815f50c124434e076e860dbe9662240844d1b77cd09907dcdf languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.7" +"@babel/plugin-transform-sticky-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/5a74ed2ed0a3ab51c3d15fcaf09d9e2fe915823535c7a4d7b019813177d559b69677090e189ec3d5d08b619483eb5ad371fbcfbbff5ace2a76ba33ee566a1109 + checksum: 10c0/e9612b0615dab4c4fba1c560769616a9bd7b9226c73191ef84b6c3ee185c8b719b4f887cdd8336a0a13400ce606ab4a0d33bc8fa6b4fcdb53e2896d07f2568f6 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-template-literals@npm:7.24.7" +"@babel/plugin-transform-template-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-template-literals@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3630f966257bcace122f04d3157416a09d40768c44c3a800855da81146b009187daa21859d1c3b7d13f4e19e8888e60613964b175b2275d451200fb6d8d6cfe6 + checksum: 10c0/5144da6036807bbd4e9d2a8b92ae67a759543929f34f4db9b463448a77298f4a40bf1e92e582db208fe08ee116224806a3bd0bed75d9da404fc2c0af9e6da540 languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.8" +"@babel/plugin-transform-typeof-symbol@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/2f570a4fbbdc5fd85f48165a97452826560051e3b8efb48c3bb0a0a33ee8485633439e7b71bfe3ef705583a1df43f854f49125bd759abdedc195b2cf7e60012a + checksum: 10c0/2b19fd88608589d9bc6b607ff17b06791d35c67ef3249f4659283454e6a9984241e3bd4c4eb72bb8b3d860a73223f3874558b861adb7314aa317c1c6a2f0cafb languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.7" +"@babel/plugin-transform-unicode-escapes@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/8b18e2e66af33471a6971289492beff5c240e56727331db1d34c4338a6a368a82a7ed6d57ec911001b6d65643aed76531e1e7cac93265fb3fb2717f54d845e69 + checksum: 10c0/615c84d7c53e1575d54ba9257e753e0b98c5de1e3225237d92f55226eaab8eb5bceb74df43f50f4aa162b0bbcc934ed11feafe2b60b8ec4934ce340fad4b8828 languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.7" +"@babel/plugin-transform-unicode-property-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.9" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/bc57656eb94584d1b74a385d378818ac2b3fca642e3f649fead8da5fb3f9de22f8461185936915dfb33d5a9104e62e7a47828331248b09d28bb2d59e9276de3e + checksum: 10c0/1685836fc38af4344c3d2a9edbd46f7c7b28d369b63967d5b83f2f6849ec45b97223461cea3d14cc3f0be6ebb284938e637a5ca3955c0e79c873d62f593d615c languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.7" +"@babel/plugin-transform-unicode-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.25.9" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/83f72a345b751566b601dc4d07e9f2c8f1bc0e0c6f7abb56ceb3095b3c9d304de73f85f2f477a09f8cc7edd5e65afd0ff9e376cdbcbea33bc0c28f3705b38fd9 + checksum: 10c0/448004f978279e726af26acd54f63f9002c9e2582ecd70d1c5c4436f6de490fcd817afb60016d11c52f5ef17dbaac2590e8cc7bfaf4e91b58c452cf188c7920f languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.4" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.9" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.2" - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/f65749835a98d8d6242e961f9276bdcdb09020e791d151ccc145acaca9a66f025b2c7cb761104f139180d35eb066a429596ee6edece81f5fd9244e0edb97d7ec + checksum: 10c0/56ee04fbe236b77cbcd6035cbf0be7566d1386b8349154ac33244c25f61170c47153a9423cd1d92855f7d6447b53a4a653d9e8fd1eaeeee14feb4b2baf59bd9f languageName: node linkType: hard -"@babel/preset-env@npm:7.25.4": - version: 7.25.4 - resolution: "@babel/preset-env@npm:7.25.4" +"@babel/preset-env@npm:7.26.0": + version: 7.26.0 + resolution: "@babel/preset-env@npm:7.26.0" dependencies: - "@babel/compat-data": "npm:^7.25.4" - "@babel/helper-compilation-targets": "npm:^7.25.2" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-validator-option": "npm:^7.24.8" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.3" - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.0" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.0" + "@babel/compat-data": "npm:^7.26.0" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.9" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - "@babel/plugin-syntax-class-properties": "npm:^7.12.13" - "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.24.7" - "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" - "@babel/plugin-syntax-import-meta": "npm:^7.10.4" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" - "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" + "@babel/plugin-syntax-import-assertions": "npm:^7.26.0" + "@babel/plugin-syntax-import-attributes": "npm:^7.26.0" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.24.7" - "@babel/plugin-transform-async-generator-functions": "npm:^7.25.4" - "@babel/plugin-transform-async-to-generator": "npm:^7.24.7" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.7" - "@babel/plugin-transform-block-scoping": "npm:^7.25.0" - "@babel/plugin-transform-class-properties": "npm:^7.25.4" - "@babel/plugin-transform-class-static-block": "npm:^7.24.7" - "@babel/plugin-transform-classes": "npm:^7.25.4" - "@babel/plugin-transform-computed-properties": "npm:^7.24.7" - "@babel/plugin-transform-destructuring": "npm:^7.24.8" - "@babel/plugin-transform-dotall-regex": "npm:^7.24.7" - "@babel/plugin-transform-duplicate-keys": "npm:^7.24.7" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.0" - "@babel/plugin-transform-dynamic-import": "npm:^7.24.7" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.7" - "@babel/plugin-transform-export-namespace-from": "npm:^7.24.7" - "@babel/plugin-transform-for-of": "npm:^7.24.7" - "@babel/plugin-transform-function-name": "npm:^7.25.1" - "@babel/plugin-transform-json-strings": "npm:^7.24.7" - "@babel/plugin-transform-literals": "npm:^7.25.2" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" - "@babel/plugin-transform-member-expression-literals": "npm:^7.24.7" - "@babel/plugin-transform-modules-amd": "npm:^7.24.7" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" - "@babel/plugin-transform-modules-systemjs": "npm:^7.25.0" - "@babel/plugin-transform-modules-umd": "npm:^7.24.7" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" - "@babel/plugin-transform-new-target": "npm:^7.24.7" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.7" - "@babel/plugin-transform-numeric-separator": "npm:^7.24.7" - "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" - "@babel/plugin-transform-object-super": "npm:^7.24.7" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.8" - "@babel/plugin-transform-parameters": "npm:^7.24.7" - "@babel/plugin-transform-private-methods": "npm:^7.25.4" - "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" - "@babel/plugin-transform-property-literals": "npm:^7.24.7" - "@babel/plugin-transform-regenerator": "npm:^7.24.7" - "@babel/plugin-transform-reserved-words": "npm:^7.24.7" - "@babel/plugin-transform-shorthand-properties": "npm:^7.24.7" - "@babel/plugin-transform-spread": "npm:^7.24.7" - "@babel/plugin-transform-sticky-regex": "npm:^7.24.7" - "@babel/plugin-transform-template-literals": "npm:^7.24.7" - "@babel/plugin-transform-typeof-symbol": "npm:^7.24.8" - "@babel/plugin-transform-unicode-escapes": "npm:^7.24.7" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.7" - "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.25.4" + "@babel/plugin-transform-arrow-functions": "npm:^7.25.9" + "@babel/plugin-transform-async-generator-functions": "npm:^7.25.9" + "@babel/plugin-transform-async-to-generator": "npm:^7.25.9" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.25.9" + "@babel/plugin-transform-block-scoping": "npm:^7.25.9" + "@babel/plugin-transform-class-properties": "npm:^7.25.9" + "@babel/plugin-transform-class-static-block": "npm:^7.26.0" + "@babel/plugin-transform-classes": "npm:^7.25.9" + "@babel/plugin-transform-computed-properties": "npm:^7.25.9" + "@babel/plugin-transform-destructuring": "npm:^7.25.9" + "@babel/plugin-transform-dotall-regex": "npm:^7.25.9" + "@babel/plugin-transform-duplicate-keys": "npm:^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.9" + "@babel/plugin-transform-dynamic-import": "npm:^7.25.9" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.25.9" + "@babel/plugin-transform-export-namespace-from": "npm:^7.25.9" + "@babel/plugin-transform-for-of": "npm:^7.25.9" + "@babel/plugin-transform-function-name": "npm:^7.25.9" + "@babel/plugin-transform-json-strings": "npm:^7.25.9" + "@babel/plugin-transform-literals": "npm:^7.25.9" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.25.9" + "@babel/plugin-transform-member-expression-literals": "npm:^7.25.9" + "@babel/plugin-transform-modules-amd": "npm:^7.25.9" + "@babel/plugin-transform-modules-commonjs": "npm:^7.25.9" + "@babel/plugin-transform-modules-systemjs": "npm:^7.25.9" + "@babel/plugin-transform-modules-umd": "npm:^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.25.9" + "@babel/plugin-transform-new-target": "npm:^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.25.9" + "@babel/plugin-transform-numeric-separator": "npm:^7.25.9" + "@babel/plugin-transform-object-rest-spread": "npm:^7.25.9" + "@babel/plugin-transform-object-super": "npm:^7.25.9" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.25.9" + "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" + "@babel/plugin-transform-parameters": "npm:^7.25.9" + "@babel/plugin-transform-private-methods": "npm:^7.25.9" + "@babel/plugin-transform-private-property-in-object": "npm:^7.25.9" + "@babel/plugin-transform-property-literals": "npm:^7.25.9" + "@babel/plugin-transform-regenerator": "npm:^7.25.9" + "@babel/plugin-transform-regexp-modifiers": "npm:^7.26.0" + "@babel/plugin-transform-reserved-words": "npm:^7.25.9" + "@babel/plugin-transform-shorthand-properties": "npm:^7.25.9" + "@babel/plugin-transform-spread": "npm:^7.25.9" + "@babel/plugin-transform-sticky-regex": "npm:^7.25.9" + "@babel/plugin-transform-template-literals": "npm:^7.25.9" + "@babel/plugin-transform-typeof-symbol": "npm:^7.25.9" + "@babel/plugin-transform-unicode-escapes": "npm:^7.25.9" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.25.9" + "@babel/plugin-transform-unicode-regex": "npm:^7.25.9" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.25.9" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2: "npm:^0.4.10" babel-plugin-polyfill-corejs3: "npm:^0.10.6" babel-plugin-polyfill-regenerator: "npm:^0.6.1" - core-js-compat: "npm:^3.37.1" + core-js-compat: "npm:^3.38.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/ed210a1974b5a1e7f80a933c87253907ec869457cea900bc97892642fa9a690c47627a9bac08a7c9495deb992a2b15f308ffca2741e1876ba47172c96fa27e14 + checksum: 10c0/26e19dc407cfa1c5166be638b4c54239d084fe15d8d7e6306d8c6dc7bc1decc51070a8dcf28352c1a2feeefbe52a06d193a12e302327ad5f529583df75fb7a26 languageName: node linkType: hard @@ -1294,13 +1104,6 @@ __metadata: languageName: node linkType: hard -"@babel/regjsgen@npm:^0.8.0": - version: 0.8.0 - resolution: "@babel/regjsgen@npm:0.8.0" - checksum: 10c0/4f3ddd8c7c96d447e05c8304c1d5ba3a83fcabd8a716bc1091c2f31595cdd43a3a055fff7cb5d3042b8cb7d402d78820fcb4e05d896c605a7d8bcf30f2424c4a - languageName: node - linkType: hard - "@babel/runtime@npm:^7.8.4": version: 7.25.6 resolution: "@babel/runtime@npm:7.25.6" @@ -1310,50 +1113,49 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.24.7, @babel/template@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/template@npm:7.25.0" +"@babel/template@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/parser": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10c0/4e31afd873215744c016e02b04f43b9fa23205d6d0766fb2e93eb4091c60c1b88897936adb895fb04e3c23de98dfdcbe31bc98daaa1a4e0133f78bb948e1209b + "@babel/code-frame": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/ebe677273f96a36c92cc15b7aa7b11cc8bc8a3bb7a01d55b2125baca8f19cae94ff3ce15f1b1880fb8437f3a690d9f89d4e91f16fc1dc4d3eb66226d128983ab languageName: node linkType: hard -"@babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.25.4": - version: 7.25.6 - resolution: "@babel/traverse@npm:7.25.6" +"@babel/traverse@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/traverse@npm:7.25.9" dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.6" - "@babel/parser": "npm:^7.25.6" - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.6" + "@babel/code-frame": "npm:^7.25.9" + "@babel/generator": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/964304c6fa46bd705428ba380bf73177eeb481c3f26d82ea3d0661242b59e0dd4329d23886035e9ca9a4ceb565c03a76fd615109830687a27bcd350059d6377e + checksum: 10c0/e90be586a714da4adb80e6cb6a3c5cfcaa9b28148abdafb065e34cc109676fc3db22cf98cd2b2fff66ffb9b50c0ef882cab0f466b6844be0f6c637b82719bba1 languageName: node linkType: hard -"@babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.6, @babel/types@npm:^7.4.4": - version: 7.25.6 - resolution: "@babel/types@npm:7.25.6" +"@babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.4.4": + version: 7.26.0 + resolution: "@babel/types@npm:7.26.0" dependencies: - "@babel/helper-string-parser": "npm:^7.24.8" - "@babel/helper-validator-identifier": "npm:^7.24.7" - to-fast-properties: "npm:^2.0.0" - checksum: 10c0/89d45fbee24e27a05dca2d08300a26b905bd384a480448823f6723c72d3a30327c517476389b7280ce8cb9a2c48ef8f47da7f9f6d326faf6f53fd6b68237bdc4 + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/b694f41ad1597127e16024d766c33a641508aad037abd08d0d1f73af753e1119fa03b4a107d04b5f92cc19c095a594660547ae9bead1db2299212d644b0a5cb8 languageName: node linkType: hard -"@csstools/cascade-layer-name-parser@npm:^2.0.1": - version: 2.0.1 - resolution: "@csstools/cascade-layer-name-parser@npm:2.0.1" +"@csstools/cascade-layer-name-parser@npm:^2.0.3": + version: 2.0.3 + resolution: "@csstools/cascade-layer-name-parser@npm:2.0.3" peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.1 - "@csstools/css-tokenizer": ^3.0.1 - checksum: 10c0/e1f9030285d1a16ca0424018289e5288e58dee2d6f6cc392e27d9e8eca0deeea4ced9b749eef09a8322746cb15b6304bc7e2d04bb9dc7405c29b3717ec80e736 + "@csstools/css-parser-algorithms": ^3.0.3 + "@csstools/css-tokenizer": ^3.0.2 + checksum: 10c0/a0f0d6c94122d0a82b0da94ee2619915a9e6e98211de6e1f28afebe34332a29cab1b7905a34b6e5c1df30a125df9f9860ce5fa960c676484417d4ef2c4db4757 languageName: node linkType: hard @@ -1364,42 +1166,42 @@ __metadata: languageName: node linkType: hard -"@csstools/css-calc@npm:^2.0.1": - version: 2.0.1 - resolution: "@csstools/css-calc@npm:2.0.1" +"@csstools/css-calc@npm:^2.0.3": + version: 2.0.3 + resolution: "@csstools/css-calc@npm:2.0.3" peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.1 - "@csstools/css-tokenizer": ^3.0.1 - checksum: 10c0/84c0ba3dac51466c9ac22c3540360f6058cf351a3676d71d4412584b165a91abc7c69a4ddf5a5dacc6e6082806d2317cf50ddbc0a0562275b2aedaee41cb87a9 + "@csstools/css-parser-algorithms": ^3.0.3 + "@csstools/css-tokenizer": ^3.0.2 + checksum: 10c0/a3dacda66bde67edab0f2384e85462dcd46b5bb62bc2a6396f0577a006d9ad59eae270353cbd6fe1a5f7081d0546fe4b1fd9b2df242758da54ec8b7022296570 languageName: node linkType: hard -"@csstools/css-color-parser@npm:^3.0.2": - version: 3.0.2 - resolution: "@csstools/css-color-parser@npm:3.0.2" +"@csstools/css-color-parser@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/css-color-parser@npm:3.0.4" dependencies: "@csstools/color-helpers": "npm:^5.0.1" - "@csstools/css-calc": "npm:^2.0.1" + "@csstools/css-calc": "npm:^2.0.3" peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.1 - "@csstools/css-tokenizer": ^3.0.1 - checksum: 10c0/31f42cc22426c937f5c6999889f72b40aec8504189a6badf3319552f27a5af73dd5f46be9ebc54eb87e526468eb2546ffbd60a6879fe599efa6c98e51d6cfa3d + "@csstools/css-parser-algorithms": ^3.0.3 + "@csstools/css-tokenizer": ^3.0.2 + checksum: 10c0/8f05264254d3768e45e46ce10e9355fe8ca0f6e4d2f648a22572f46c6d05b2378c37c2e5d970ed3b7bdfa0b152ea2af0c56a0556249bd85973aee9db7b091aa7 languageName: node linkType: hard -"@csstools/css-parser-algorithms@npm:^3.0.1": - version: 3.0.1 - resolution: "@csstools/css-parser-algorithms@npm:3.0.1" +"@csstools/css-parser-algorithms@npm:^3.0.1, @csstools/css-parser-algorithms@npm:^3.0.3": + version: 3.0.3 + resolution: "@csstools/css-parser-algorithms@npm:3.0.3" peerDependencies: - "@csstools/css-tokenizer": ^3.0.1 - checksum: 10c0/064c6d519197b5af43bbf5efe8f4cdbd361b006113aa82160d637e925b50c643a52d33d512ca01c63042d952d723a2a10798231a714668356b76668fb11294e3 + "@csstools/css-tokenizer": ^3.0.2 + checksum: 10c0/c1e634384affb10c3726a36f090867247005a2a470cb223de88debeab07921b78c0e7875e7847d90949c2b0ba88a290c71565f1839f7739c21a5bf1c870e137d languageName: node linkType: hard -"@csstools/css-tokenizer@npm:^3.0.1": - version: 3.0.1 - resolution: "@csstools/css-tokenizer@npm:3.0.1" - checksum: 10c0/c9ed4373e5731b5375ea9791590081019c04e95f08b46b272977e5e7b8c3d560affc62e82263cb8def1df1e57f0673140e7e16a14a5e7be04e6a234be088d1d3 +"@csstools/css-tokenizer@npm:^3.0.1, @csstools/css-tokenizer@npm:^3.0.2": + version: 3.0.2 + resolution: "@csstools/css-tokenizer@npm:3.0.2" + checksum: 10c0/a74e5829420ed35982fd33be272c2a19cb2380179d357abe750aa848be6d6699d0437008f47a57eb7c6ff64a34b0c8f91a97dd63dbddd08249b7cf7983767e5e languageName: node linkType: hard @@ -1413,72 +1215,82 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-cascade-layers@npm:^5.0.0": - version: 5.0.0 - resolution: "@csstools/postcss-cascade-layers@npm:5.0.0" +"@csstools/media-query-list-parser@npm:^4.0.1": + version: 4.0.1 + resolution: "@csstools/media-query-list-parser@npm:4.0.1" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.3 + "@csstools/css-tokenizer": ^3.0.2 + checksum: 10c0/037f57520b6ca7d58ba1d71a477bd99bdbe3a6d8e7b972ed0f436d649e574f5b429e54fc47d0272daa2ac24ffb819bd9d260a90e154c4a265b8ee4d1cfb1d279 + languageName: node + linkType: hard + +"@csstools/postcss-cascade-layers@npm:^5.0.1": + version: 5.0.1 + resolution: "@csstools/postcss-cascade-layers@npm:5.0.1" dependencies: - "@csstools/selector-specificity": "npm:^4.0.0" - postcss-selector-parser: "npm:^6.1.0" + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/b608c69c12671682676598e451dcd79bfc6f5030a4e17b4d1bf9659e531f1daf03526be023f9aafdc952ecc87c87b04f379a763309e3eadb2140572cd4aa5b60 + checksum: 10c0/5cc3c6f220d9216f7ab16e716a20d6db845f127c917521e6236342bfa871accd63eb662a04c1e24a28e396412dcb47b1c4abccc490b88e4010cd704d14a702f1 languageName: node linkType: hard -"@csstools/postcss-color-function@npm:^4.0.2": - version: 4.0.2 - resolution: "@csstools/postcss-color-function@npm:4.0.2" +"@csstools/postcss-color-function@npm:^4.0.4": + version: 4.0.4 + resolution: "@csstools/postcss-color-function@npm:4.0.4" dependencies: - "@csstools/css-color-parser": "npm:^3.0.2" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/css-color-parser": "npm:^3.0.4" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/c987ccc7ab326668895396d3fe69c05087cf6e245be6f70e8c33da0cdeb56f8ac3d117cfad984191ec57be9691ab56d427aaa28c61c4a7446521972993dd5039 + checksum: 10c0/e7735c6d7c84f039c84dc1b180410aa4db7c404d55477c2e7872bc8306a3150bf37883583ec080ebd8b40b765f700cc78892d61dc167578f76e324543d551c04 languageName: node linkType: hard -"@csstools/postcss-color-mix-function@npm:^3.0.2": - version: 3.0.2 - resolution: "@csstools/postcss-color-mix-function@npm:3.0.2" +"@csstools/postcss-color-mix-function@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/postcss-color-mix-function@npm:3.0.4" dependencies: - "@csstools/css-color-parser": "npm:^3.0.2" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/css-color-parser": "npm:^3.0.4" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/cfdc641f504f9d02b9a7b53d6bd933d4e767ecaee5f3d2df45d897f69b8a38b5b79b538d307b16fb56dcb7c19dc7e107518c356772e89771e28e04fd846d9035 + checksum: 10c0/3e01f04853e49c9f69ee0538b817209b630649844039ee5b195cfbae94d41cf6e0d8a50a3d02dbe066f84855eefa1b7047f6750e4744858519978468577e567f languageName: node linkType: hard -"@csstools/postcss-content-alt-text@npm:^2.0.1": - version: 2.0.1 - resolution: "@csstools/postcss-content-alt-text@npm:2.0.1" +"@csstools/postcss-content-alt-text@npm:^2.0.3": + version: 2.0.3 + resolution: "@csstools/postcss-content-alt-text@npm:2.0.3" dependencies: - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/693e4cfa9a30a9c384120bd24846a7cd5ba1e1ebf975eb81b0e0131a21ac28a0301c7dcfa13706bc7d8b5343536fb43a46de636c3257d0fd05041c7255366e87 + checksum: 10c0/0389292a1ba11483f58db1bdd38cc774b0ec18c73f03d1db5f4a1f38edc861bb8b8d750b5c5b3615a98aaf995c0464dcfd6db5421888be0f868548c69455b5b3 languageName: node linkType: hard -"@csstools/postcss-exponential-functions@npm:^2.0.1": - version: 2.0.1 - resolution: "@csstools/postcss-exponential-functions@npm:2.0.1" +"@csstools/postcss-exponential-functions@npm:^2.0.3": + version: 2.0.3 + resolution: "@csstools/postcss-exponential-functions@npm:2.0.3" dependencies: - "@csstools/css-calc": "npm:^2.0.1" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/css-calc": "npm:^2.0.3" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" peerDependencies: postcss: ^8.4 - checksum: 10c0/ddcaedfa48cc0cf93611c8d2ed5a75d56c1d196a97015db644b45881adabb47f3255242acaef6ea869a1e5ba66328725d254bf6d29eb5e988cde8b040bc5f55d + checksum: 10c0/690ac6c5ec72e085160401100cc8465a040fd70d59efadf61ef767094edac28bbb2653f53ea7cfa47d8220d0be0b9e23c3e3c2b80d9e93ad07b1db8031163d70 languageName: node linkType: hard @@ -1494,46 +1306,46 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-gamut-mapping@npm:^2.0.2": - version: 2.0.2 - resolution: "@csstools/postcss-gamut-mapping@npm:2.0.2" +"@csstools/postcss-gamut-mapping@npm:^2.0.4": + version: 2.0.4 + resolution: "@csstools/postcss-gamut-mapping@npm:2.0.4" dependencies: - "@csstools/css-color-parser": "npm:^3.0.2" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/css-color-parser": "npm:^3.0.4" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" peerDependencies: postcss: ^8.4 - checksum: 10c0/8b6504f81c5036e3c2a9f9516c371f48a283112469b746546c8c7f6f0da2467c915d4dac6dfe8bb05d7dab3a7503911391eb9e666cb7632e09a032e801c029f5 + checksum: 10c0/60c6ff13cc71a0cda7ce184fa8b42924975f2bd05e3bc096059de853ae01d48e36f27d02d7e6286d9e8c4eb4dfd526f7c302ff51be19c5f7949dd6079915a3a9 languageName: node linkType: hard -"@csstools/postcss-gradients-interpolation-method@npm:^5.0.2": - version: 5.0.2 - resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.2" +"@csstools/postcss-gradients-interpolation-method@npm:^5.0.4": + version: 5.0.4 + resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.4" dependencies: - "@csstools/css-color-parser": "npm:^3.0.2" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/css-color-parser": "npm:^3.0.4" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/4fa27437ad9861b1457c28228f2503c17bcc2f77dcb38da1314a4a5d38fd010e7e5d11b5f9d69e0a2cb2999bbfeca1e99ce2f59422bda5b382658dcb03f7326e + checksum: 10c0/3b6aa4404851be09a083f35b596acc7e3f74f525386dcd2887720438638ca1893f79e699e5dad0e3a35487cb9527e08d0dcd29f1331f87800f53c13423321d6e languageName: node linkType: hard -"@csstools/postcss-hwb-function@npm:^4.0.2": - version: 4.0.2 - resolution: "@csstools/postcss-hwb-function@npm:4.0.2" +"@csstools/postcss-hwb-function@npm:^4.0.4": + version: 4.0.4 + resolution: "@csstools/postcss-hwb-function@npm:4.0.4" dependencies: - "@csstools/css-color-parser": "npm:^3.0.2" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/css-color-parser": "npm:^3.0.4" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/46dc9596e37830de4c38f70764d6da9f2fc7bc339217b4291eced75daa8998c4e05fb743c271701e44818df4ac111c285019b7bb3a728e8b61d86899bbeb74eb + checksum: 10c0/2460cc7e6324f0793d12976de175ff33344c3410ff7a04ca8a5ce0560ee3354d1d8034f9f07c0759c2b7e222a4681d02298f6a29c2a326c76b33060830da83b4 languageName: node linkType: hard @@ -1559,29 +1371,29 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-is-pseudo-class@npm:^5.0.0": - version: 5.0.0 - resolution: "@csstools/postcss-is-pseudo-class@npm:5.0.0" +"@csstools/postcss-is-pseudo-class@npm:^5.0.1": + version: 5.0.1 + resolution: "@csstools/postcss-is-pseudo-class@npm:5.0.1" dependencies: - "@csstools/selector-specificity": "npm:^4.0.0" - postcss-selector-parser: "npm:^6.1.0" + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/738eb84728b24bfe19ca06ccf6ff773a423552df2f31c87704ce79da4abfd2ccf2a45d5d6d3e11e71e42cc3d92eb35a856209b9cd6116c879acf15ac75454683 + checksum: 10c0/3aaab18ebb2dcf5565efa79813eaa987d40de1e086765358524392a09631c68ad1ee952e6aff8f42513b2c18ab84891787e065fe287f696128498fc641520b6c languageName: node linkType: hard -"@csstools/postcss-light-dark-function@npm:^2.0.2": - version: 2.0.2 - resolution: "@csstools/postcss-light-dark-function@npm:2.0.2" +"@csstools/postcss-light-dark-function@npm:^2.0.6": + version: 2.0.6 + resolution: "@csstools/postcss-light-dark-function@npm:2.0.6" dependencies: - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/f8973c435868998e5d6af1fc0c35b27bbf65fa9d0c35f5055c689b8ee2807a16802044e296f7def39a7253ae544fb49559e8273ee22eb4e21845aa980a1bc82b + checksum: 10c0/f3e93b58a23f0f01c9d032a892070a18e3393e60997e1d2b57c5bddb2cb36f7ee6cbaeaeb3d531b065a545a03e54d86567d34b45eddf85ed48ac360eb4ab66cd languageName: node linkType: hard @@ -1623,42 +1435,42 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-logical-viewport-units@npm:^3.0.1": - version: 3.0.1 - resolution: "@csstools/postcss-logical-viewport-units@npm:3.0.1" +"@csstools/postcss-logical-viewport-units@npm:^3.0.2": + version: 3.0.2 + resolution: "@csstools/postcss-logical-viewport-units@npm:3.0.2" dependencies: - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/css-tokenizer": "npm:^3.0.2" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/f54f91ec4d308562371576e82131c3cc1ff461a951c9a38f0b42b783c26f37a93cc846fcd025d3c4a8437b55a4fff1192ebfac8ccf84abb6478b2c515d232552 + checksum: 10c0/31f525e774bc053f545a159eb53bb21465ea2930118e87c40207ad90fa97d3151e6de83efd02f84803fb0e93ed4a4b42a3904b734423410e73ac4c6ce9666ab4 languageName: node linkType: hard -"@csstools/postcss-media-minmax@npm:^2.0.1": - version: 2.0.1 - resolution: "@csstools/postcss-media-minmax@npm:2.0.1" +"@csstools/postcss-media-minmax@npm:^2.0.3": + version: 2.0.3 + resolution: "@csstools/postcss-media-minmax@npm:2.0.3" dependencies: - "@csstools/css-calc": "npm:^2.0.1" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" - "@csstools/media-query-list-parser": "npm:^3.0.1" + "@csstools/css-calc": "npm:^2.0.3" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" + "@csstools/media-query-list-parser": "npm:^4.0.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/23c1fb0c3ed8bf82f3223f161d0d65ba62045b917bc19624581f64aaa5d678485d22c23af2591a3f634ba02030ccb419c2b30209aa22f9fd2baa1a6474af810a + checksum: 10c0/87c1ed6fe6ed487125e383ae7bc356ba0f68885c41cd129b85c323af69255031a8ac7b2e994d4f9b6b65d6a9f6833aeb1301ca230b592547825aedb3e3acab4b languageName: node linkType: hard -"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^3.0.1": - version: 3.0.1 - resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:3.0.1" +"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^3.0.3": + version: 3.0.3 + resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:3.0.3" dependencies: - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" - "@csstools/media-query-list-parser": "npm:^3.0.1" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" + "@csstools/media-query-list-parser": "npm:^4.0.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/e491cb149fb4fff85b2f03191511e43654ae00716e3c1ea9f1dc22ec4e7042c35f034d372082a69d3621c86cafbe46e8f419872fa36f4a534f145f584d655768 + checksum: 10c0/3bbadd5c79ff2102b4a2e0f107d7f3cbb89d2840b935915531d0a1bfc711d58386e6e234fccb9b4abb37e48f07cdfaa4dd66b5c795dfac9e317fa8b5cfd38e06 languageName: node linkType: hard @@ -1685,18 +1497,18 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-oklab-function@npm:^4.0.2": - version: 4.0.2 - resolution: "@csstools/postcss-oklab-function@npm:4.0.2" +"@csstools/postcss-oklab-function@npm:^4.0.4": + version: 4.0.4 + resolution: "@csstools/postcss-oklab-function@npm:4.0.4" dependencies: - "@csstools/css-color-parser": "npm:^3.0.2" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/css-color-parser": "npm:^3.0.4" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/3209a7cec6d3577544a7ef41f2d5cca25f77891d4ec0d7f39d32f9a79a6c9a9b0ee6b54b2937a2d995548ad11c39966b07d4b9f58e907ffbe1a4b454f2d277f3 + checksum: 10c0/4fd2a5c22ebaf69053e005d9d009ccb41b6879f0246677159bfb6a28208e90af857446c443d34fe3efdaf50bccdd67b16fcd0c1e7c52961396a48bd84e45311f languageName: node linkType: hard @@ -1711,42 +1523,42 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-relative-color-syntax@npm:^3.0.2": - version: 3.0.2 - resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.2" +"@csstools/postcss-relative-color-syntax@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.4" dependencies: - "@csstools/css-color-parser": "npm:^3.0.2" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/css-color-parser": "npm:^3.0.4" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/34a8c999e08c6e7833484ee2fb91e7fcc25235d6c361712fed581e44a5a29f1ceb95415b6f4260de53809ac13f5da5415d1905c2971477cf5d45e5196081c663 + checksum: 10c0/f2ae6f9053e976e2431d08bdc5aa40ca5242754e23370abdfd7b6087d7ed56037e46911d1be801cf7e760aa8aee94bcab6a46f4f68696cf6befacf707c1534b7 languageName: node linkType: hard -"@csstools/postcss-scope-pseudo-class@npm:^4.0.0": - version: 4.0.0 - resolution: "@csstools/postcss-scope-pseudo-class@npm:4.0.0" +"@csstools/postcss-scope-pseudo-class@npm:^4.0.1": + version: 4.0.1 + resolution: "@csstools/postcss-scope-pseudo-class@npm:4.0.1" dependencies: - postcss-selector-parser: "npm:^6.1.0" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/a6f562df1417c6f257c0fec95babf4cea99a25622573a2dbcfb416e2fcb8e1e53561127f5e7277d19fcb2a4603bdbc64dd6a4c416429623503c604050c99229a + checksum: 10c0/6a0ca50fae655f4498200d1ce298ca794c85fbe2e3fd5d6419843254f055df5007a973e09b5f1e78e376c02b54278e411516c8d824300c68b265d3e5b311d7ee languageName: node linkType: hard -"@csstools/postcss-stepped-value-functions@npm:^4.0.1": - version: 4.0.1 - resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.1" +"@csstools/postcss-stepped-value-functions@npm:^4.0.3": + version: 4.0.3 + resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.3" dependencies: - "@csstools/css-calc": "npm:^2.0.1" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/css-calc": "npm:^2.0.3" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" peerDependencies: postcss: ^8.4 - checksum: 10c0/7e65969b124fce603675ca17c2ffa2bb456677866e54bc9fbdc4da0945be1593fde2abb0730d3d03190776ad2022b394a1f9d4834c5b1f4c7ec497929fd35f8f + checksum: 10c0/31af5a650d4b2de97d3a3ef77e7ad0777b3f013f7463e23455ac31ffc946d2f79f365a1fdead52c7c535176232ab57f6f086ecdbeca1bb0b250161b1302e8c8c languageName: node linkType: hard @@ -1762,16 +1574,16 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-trigonometric-functions@npm:^4.0.1": - version: 4.0.1 - resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.1" +"@csstools/postcss-trigonometric-functions@npm:^4.0.3": + version: 4.0.3 + resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.3" dependencies: - "@csstools/css-calc": "npm:^2.0.1" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/css-calc": "npm:^2.0.3" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" peerDependencies: postcss: ^8.4 - checksum: 10c0/59e017ebb9f4f8f027e134024e3322b5e202cc96073e0bb0d45733a829c8eadc7f4f7ce57ce8360a748a677595af9ea95da1779684699b48b911b73b4017ac8b + checksum: 10c0/a13dd72c00e45e6db16c03e135f1cd1b2b412e83b7681696b49feef3a4c36ab80f5f806f3589d33405e2d14dd0dfb13572ec12007ebe3d294077b0bd3d645b2b languageName: node linkType: hard @@ -1784,12 +1596,12 @@ __metadata: languageName: node linkType: hard -"@csstools/selector-resolve-nested@npm:^2.0.0": - version: 2.0.0 - resolution: "@csstools/selector-resolve-nested@npm:2.0.0" +"@csstools/selector-resolve-nested@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/selector-resolve-nested@npm:3.0.0" peerDependencies: - postcss-selector-parser: ^6.1.0 - checksum: 10c0/10516fd1db5e0a3963063caa57d24eeb1d1f69fcb63f0b5aec5d7a44f8b36ff07b1eded3012e8a9b92fc1f484e1a5a9def0cf57d788aa7f944ee79877837cc77 + postcss-selector-parser: ^7.0.0 + checksum: 10c0/2b01c36b3fa81388d5bddd8db962766465d76b021a815c8bb5a48c3a42c530154cc155fc496707ade627dbba6745eb8ecd9fa840c1972133c0f7d8811e0a959d languageName: node linkType: hard @@ -1802,6 +1614,15 @@ __metadata: languageName: node linkType: hard +"@csstools/selector-specificity@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/selector-specificity@npm:5.0.0" + peerDependencies: + postcss-selector-parser: ^7.0.0 + checksum: 10c0/186b444cabcdcdeb553bfe021f80c58bfe9ef38dcc444f2b1f34a5aab9be063ab4e753022b2d5792049c041c28cfbb78e4b707ec398459300e402030d35c07eb + languageName: node + linkType: hard + "@csstools/utilities@npm:^2.0.0": version: 2.0.0 resolution: "@csstools/utilities@npm:2.0.0" @@ -1854,6 +1675,13 @@ __metadata: languageName: node linkType: hard +"@eslint/core@npm:^0.7.0": + version: 0.7.0 + resolution: "@eslint/core@npm:0.7.0" + checksum: 10c0/3cdee8bc6cbb96ac6103d3ead42e59830019435839583c9eb352b94ed558bd78e7ffad5286dc710df21ec1e7bd8f52aa6574c62457a4dd0f01f3736fa4a7d87a + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^3.1.0": version: 3.1.0 resolution: "@eslint/eslintrc@npm:3.1.0" @@ -1871,10 +1699,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.11.0": - version: 9.11.0 - resolution: "@eslint/js@npm:9.11.0" - checksum: 10c0/7403aeba28ba9cae3470d149b334a51375eb7fd850f167555c81cc72fe98e5cc5ac3059ccdbe68eb255a49d7498a7288d25429af0c7d20afeb4b3c0748349bb4 +"@eslint/js@npm:9.13.0": + version: 9.13.0 + resolution: "@eslint/js@npm:9.13.0" + checksum: 10c0/672257bffe17777b8a98bd80438702904cc7a0b98b9c2e426a8a10929198b3553edf8a3fc20feed4133c02e7c8f7331a0ef1b23e5dab8e4469f7f1791beff1e0 languageName: node linkType: hard @@ -1894,6 +1722,23 @@ __metadata: languageName: node linkType: hard +"@humanfs/core@npm:^0.19.0": + version: 0.19.0 + resolution: "@humanfs/core@npm:0.19.0" + checksum: 10c0/f87952d5caba6ae427a620eff783c5d0b6cef0cfc256dec359cdaa636c5f161edb8d8dad576742b3de7f0b2f222b34aad6870248e4b7d2177f013426cbcda232 + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.5": + version: 0.16.5 + resolution: "@humanfs/node@npm:0.16.5" + dependencies: + "@humanfs/core": "npm:^0.19.0" + "@humanwhocodes/retry": "npm:^0.3.0" + checksum: 10c0/41c365ab09e7c9eaeed373d09243195aef616d6745608a36fc3e44506148c28843872f85e69e2bf5f1e992e194286155a1c1cecfcece6a2f43875e37cd243935 + languageName: node + linkType: hard + "@humanwhocodes/module-importer@npm:^1.0.1": version: 1.0.1 resolution: "@humanwhocodes/module-importer@npm:1.0.1" @@ -1901,10 +1746,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/retry@npm:^0.3.0": - version: 0.3.0 - resolution: "@humanwhocodes/retry@npm:0.3.0" - checksum: 10c0/7111ec4e098b1a428459b4e3be5a5d2a13b02905f805a2468f4fa628d072f0de2da26a27d04f65ea2846f73ba51f4204661709f05bfccff645e3cedef8781bb6 +"@humanwhocodes/retry@npm:^0.3.0, @humanwhocodes/retry@npm:^0.3.1": + version: 0.3.1 + resolution: "@humanwhocodes/retry@npm:0.3.1" + checksum: 10c0/f0da1282dfb45e8120480b9e2e275e2ac9bbe1cf016d046fdad8e27cc1285c45bb9e711681237944445157b430093412b4446c1ab3fc4bb037861b5904101d3b languageName: node linkType: hard @@ -2021,7 +1866,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -2090,6 +1935,140 @@ __metadata: languageName: node linkType: hard +"@parcel/watcher-android-arm64@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-android-arm64@npm:2.4.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-arm64@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-darwin-arm64@npm:2.4.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-x64@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-darwin-x64@npm:2.4.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-freebsd-x64@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-freebsd-x64@npm:2.4.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-glibc@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.4.1" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-glibc@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.4.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-musl@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.4.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-glibc@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.4.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-musl@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.4.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-win32-arm64@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-win32-arm64@npm:2.4.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-win32-ia32@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-win32-ia32@npm:2.4.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@parcel/watcher-win32-x64@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-win32-x64@npm:2.4.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher@npm:^2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher@npm:2.4.1" + dependencies: + "@parcel/watcher-android-arm64": "npm:2.4.1" + "@parcel/watcher-darwin-arm64": "npm:2.4.1" + "@parcel/watcher-darwin-x64": "npm:2.4.1" + "@parcel/watcher-freebsd-x64": "npm:2.4.1" + "@parcel/watcher-linux-arm-glibc": "npm:2.4.1" + "@parcel/watcher-linux-arm64-glibc": "npm:2.4.1" + "@parcel/watcher-linux-arm64-musl": "npm:2.4.1" + "@parcel/watcher-linux-x64-glibc": "npm:2.4.1" + "@parcel/watcher-linux-x64-musl": "npm:2.4.1" + "@parcel/watcher-win32-arm64": "npm:2.4.1" + "@parcel/watcher-win32-ia32": "npm:2.4.1" + "@parcel/watcher-win32-x64": "npm:2.4.1" + detect-libc: "npm:^1.0.3" + is-glob: "npm:^4.0.3" + micromatch: "npm:^4.0.5" + node-addon-api: "npm:^7.0.0" + node-gyp: "npm:latest" + dependenciesMeta: + "@parcel/watcher-android-arm64": + optional: true + "@parcel/watcher-darwin-arm64": + optional: true + "@parcel/watcher-darwin-x64": + optional: true + "@parcel/watcher-freebsd-x64": + optional: true + "@parcel/watcher-linux-arm-glibc": + optional: true + "@parcel/watcher-linux-arm64-glibc": + optional: true + "@parcel/watcher-linux-arm64-musl": + optional: true + "@parcel/watcher-linux-x64-glibc": + optional: true + "@parcel/watcher-linux-x64-musl": + optional: true + "@parcel/watcher-win32-arm64": + optional: true + "@parcel/watcher-win32-ia32": + optional: true + "@parcel/watcher-win32-x64": + optional: true + checksum: 10c0/33b7112094b9eb46c234d824953967435b628d3d93a0553255e9910829b84cab3da870153c3a870c31db186dc58f3b2db81382fcaee3451438aeec4d786a6211 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -2118,10 +2097,10 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:^1.0.5": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d +"@types/estree@npm:^1.0.5, @types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a languageName: node linkType: hard @@ -2160,7 +2139,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db @@ -2522,15 +2501,6 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b - languageName: node - linkType: hard - "ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" @@ -2747,17 +2717,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.23.1, browserslist@npm:^4.23.3": - version: 4.23.3 - resolution: "browserslist@npm:4.23.3" +"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.23.1, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0": + version: 4.24.0 + resolution: "browserslist@npm:4.24.0" dependencies: - caniuse-lite: "npm:^1.0.30001646" - electron-to-chromium: "npm:^1.5.4" + caniuse-lite: "npm:^1.0.30001663" + electron-to-chromium: "npm:^1.5.28" node-releases: "npm:^2.0.18" update-browserslist-db: "npm:^1.1.0" bin: browserslist: cli.js - checksum: 10c0/3063bfdf812815346447f4796c8f04601bf5d62003374305fd323c2a463e42776475bcc5309264e39bcf9a8605851e53560695991a623be988138b3ff8c66642 + checksum: 10c0/95e76ad522753c4c470427f6e3c8a4bb5478ff448841e22b3d3e53f89ecaf17b6984666d6c7e715c370f1e7fa0cf684f42e34e554236a8b2fab38ea76b9e4c52 languageName: node linkType: hard @@ -2807,21 +2777,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001646": - version: 1.0.30001660 - resolution: "caniuse-lite@npm:1.0.30001660" - checksum: 10c0/d28900b56c597176d515c3175ca75c454f2d30cb2c09a44d7bdb009bb0c4d8a2557905adb77642889bbe9feb85fbfe9d974c8b8e53521fb4b50ee16ab246104e - languageName: node - linkType: hard - -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001663": + version: 1.0.30001666 + resolution: "caniuse-lite@npm:1.0.30001666" + checksum: 10c0/2d49e9be676233c24717f12aad3d01b3e5f902b457fe1deefaa8d82e64786788a8f79381ae437c61b50e15c9aea8aeb59871b1d54cb4c28b9190d53d292e2339 languageName: node linkType: hard @@ -2913,15 +2872,6 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: "npm:1.1.3" - checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c - languageName: node - linkType: hard - "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -2931,13 +2881,6 @@ __metadata: languageName: node linkType: hard -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 - languageName: node - linkType: hard - "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" @@ -3008,7 +2951,7 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.37.1, core-js-compat@npm:^3.38.0": +"core-js-compat@npm:^3.38.0, core-js-compat@npm:^3.38.1": version: 3.38.1 resolution: "core-js-compat@npm:3.38.1" dependencies: @@ -3045,14 +2988,14 @@ __metadata: languageName: node linkType: hard -"css-blank-pseudo@npm:^7.0.0": - version: 7.0.0 - resolution: "css-blank-pseudo@npm:7.0.0" +"css-blank-pseudo@npm:^7.0.1": + version: 7.0.1 + resolution: "css-blank-pseudo@npm:7.0.1" dependencies: - postcss-selector-parser: "npm:^6.1.0" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/74c6c0af773a8d2c8c5a53bcfc2b2c06f9c3fd4a8bd756b7aafc102b91a1060b179a4f0aa21475b54685b62bfd9724fee90778dd992b42e0cd3ea3698132af92 + checksum: 10c0/46c3d3a611972fdb0c264db7c0b34fe437bc4300961d11945145cf04962f52a545a6ef55bc8ff4afd82b605bd692b4970f2b54582616dea00441105e725d4618 languageName: node linkType: hard @@ -3065,23 +3008,23 @@ __metadata: languageName: node linkType: hard -"css-functions-list@npm:^3.2.2": - version: 3.2.2 - resolution: "css-functions-list@npm:3.2.2" - checksum: 10c0/8638a63d0cf1bdc50d4a752ec1c94a57e9953c3b03eace4f5526db20bec3c061e95089f905dbb4999c44b9780ce777ba856967560f6d15119a303f6030901c10 +"css-functions-list@npm:^3.2.3": + version: 3.2.3 + resolution: "css-functions-list@npm:3.2.3" + checksum: 10c0/03f9ed34eeed310d2b1cf0e524eea02bc5f87854a4de85f8957ea432ab1036841a3fb00879590519f7bb8fda40d992ce7a72fa9b61696ca1dc53b90064858f96 languageName: node linkType: hard -"css-has-pseudo@npm:^7.0.0": - version: 7.0.0 - resolution: "css-has-pseudo@npm:7.0.0" +"css-has-pseudo@npm:^7.0.1": + version: 7.0.1 + resolution: "css-has-pseudo@npm:7.0.1" dependencies: - "@csstools/selector-specificity": "npm:^4.0.0" - postcss-selector-parser: "npm:^6.1.0" + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/2c72602ca9bcdb3afe2cce3b014e7dd17548658904c17560042ebf4bd6727b1ed8706961b1f44bff43bbdb8dc932c30a0b29f536c353df858e300e68e163b872 + checksum: 10c0/13789b08b70169204be786d652190356ace9313099d3656bd2fc38afbdd28f3d9620f0e0b07425480961b7a1ec789794961d0472f205b959d3f64c9a78ce511c languageName: node linkType: hard @@ -3170,6 +3113,16 @@ __metadata: languageName: node linkType: hard +"css-tree@npm:^3.0.0": + version: 3.0.0 + resolution: "css-tree@npm:3.0.0" + dependencies: + mdn-data: "npm:2.10.0" + source-map-js: "npm:^1.0.1" + checksum: 10c0/43d44fdf7004ae91d73d486f17894fef77efa33747a6752b9241cf0f5fb47fabc16ec34a96a993651d9014dfdeee803d7c5fcd3548214252ee19f4e5c98999b2 + languageName: node + linkType: hard + "css-tree@npm:~2.2.0": version: 2.2.1 resolution: "css-tree@npm:2.2.1" @@ -3187,10 +3140,10 @@ __metadata: languageName: node linkType: hard -"cssdb@npm:^8.1.1": - version: 8.1.1 - resolution: "cssdb@npm:8.1.1" - checksum: 10c0/d60facfad3bca70e21100fc35b9205cb9d3d0ac642f44f0a687e54bf787f21c43d28ce2d17fcd405f67950fb4709516108fe1f3cb15df570eff1007b5fbbc787 +"cssdb@npm:^8.1.2": + version: 8.1.2 + resolution: "cssdb@npm:8.1.2" + checksum: 10c0/056149e713a78921f56d9ef0cd734577cedb93c27966c3d0eab01956a2aa8d3c260a911766064b57ded8b4d9c55dd5275626cbb022ccd8d2d0b93b53fefd1603 languageName: node linkType: hard @@ -3273,7 +3226,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.7": version: 4.3.7 resolution: "debug@npm:4.3.7" dependencies: @@ -3307,6 +3260,15 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^1.0.3": + version: 1.0.3 + resolution: "detect-libc@npm:1.0.3" + bin: + detect-libc: ./bin/detect-libc.js + checksum: 10c0/4da0deae9f69e13bc37a0902d78bf7169480004b1fed3c19722d56cff578d16f0e11633b7fbf5fb6249181236c72e90024cbd68f0b9558ae06e281f47326d50d + languageName: node + linkType: hard + "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -3361,10 +3323,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.4": - version: 1.5.19 - resolution: "electron-to-chromium@npm:1.5.19" - checksum: 10c0/73e25a928e041d707565fb08371b6ba5f3d7d99c78adddfd553660f28809ca22f1608ff295da3c764903a8eae890cbdd701b1b64b3e1eaeb298cb8aecbf21937 +"electron-to-chromium@npm:^1.5.28": + version: 1.5.31 + resolution: "electron-to-chromium@npm:1.5.31" + checksum: 10c0/e8aecd88c4c6d50a9d459b4b222865b855bab8f1b52e82913804e18b7884f2887bd76c61b3aa08c2ccbdcda098dd8486443f75bf770f0138f21dd9e63548fca7 languageName: node linkType: hard @@ -3461,13 +3423,6 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 - languageName: node - linkType: hard - "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -3503,13 +3458,13 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^8.0.2": - version: 8.0.2 - resolution: "eslint-scope@npm:8.0.2" +"eslint-scope@npm:^8.1.0": + version: 8.1.0 + resolution: "eslint-scope@npm:8.1.0" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10c0/477f820647c8755229da913025b4567347fd1f0bf7cbdf3a256efff26a7e2e130433df052bd9e3d014025423dc00489bea47eb341002b15553673379c1a7dc36 + checksum: 10c0/ae1df7accae9ea90465c2ded70f7064d6d1f2962ef4cc87398855c4f0b3a5ab01063e0258d954bb94b184f6759febe04c3118195cab5c51978a7229948ba2875 languageName: node linkType: hard @@ -3520,34 +3475,37 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^4.0.0": - version: 4.0.0 - resolution: "eslint-visitor-keys@npm:4.0.0" - checksum: 10c0/76619f42cf162705a1515a6868e6fc7567e185c7063a05621a8ac4c3b850d022661262c21d9f1fc1d144ecf0d5d64d70a3f43c15c3fc969a61ace0fb25698cf5 +"eslint-visitor-keys@npm:^4.1.0": + version: 4.1.0 + resolution: "eslint-visitor-keys@npm:4.1.0" + checksum: 10c0/5483ef114c93a136aa234140d7aa3bd259488dae866d35cb0d0b52e6a158f614760a57256ac8d549acc590a87042cb40f6951815caa821e55dc4fd6ef4c722eb languageName: node linkType: hard -"eslint@npm:9.11.0": - version: 9.11.0 - resolution: "eslint@npm:9.11.0" +"eslint@npm:9.13.0": + version: 9.13.0 + resolution: "eslint@npm:9.13.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.11.0" "@eslint/config-array": "npm:^0.18.0" + "@eslint/core": "npm:^0.7.0" "@eslint/eslintrc": "npm:^3.1.0" - "@eslint/js": "npm:9.11.0" + "@eslint/js": "npm:9.13.0" "@eslint/plugin-kit": "npm:^0.2.0" + "@humanfs/node": "npm:^0.16.5" "@humanwhocodes/module-importer": "npm:^1.0.1" - "@humanwhocodes/retry": "npm:^0.3.0" - "@nodelib/fs.walk": "npm:^1.2.8" + "@humanwhocodes/retry": "npm:^0.3.1" + "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" cross-spawn: "npm:^7.0.2" debug: "npm:^4.3.2" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^8.0.2" - eslint-visitor-keys: "npm:^4.0.0" - espree: "npm:^10.1.0" + eslint-scope: "npm:^8.1.0" + eslint-visitor-keys: "npm:^4.1.0" + espree: "npm:^10.2.0" esquery: "npm:^1.5.0" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" @@ -3557,13 +3515,11 @@ __metadata: ignore: "npm:^5.2.0" imurmurhash: "npm:^0.1.4" is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" json-stable-stringify-without-jsonify: "npm:^1.0.1" lodash.merge: "npm:^4.6.2" minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" text-table: "npm:^0.2.0" peerDependencies: jiti: "*" @@ -3572,18 +3528,18 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/3438a78172bc667dc87bc4ad864671bd93231c82c9d366899ea3a77fc3444c8cdd158e7fe3ca1cfe4cb566045b1b36c0ccae9fc20efeb4b187f1a534075a1177 + checksum: 10c0/d3577444152182a9d8ea8c6a6acb073d3a2773ad73a6b646f432746583ec4bfcd6a44fcc2e37d05d276984e583c46c2d289b3b981ca8f8b4052756a152341d19 languageName: node linkType: hard -"espree@npm:^10.0.1, espree@npm:^10.1.0": - version: 10.1.0 - resolution: "espree@npm:10.1.0" +"espree@npm:^10.0.1, espree@npm:^10.2.0": + version: 10.2.0 + resolution: "espree@npm:10.2.0" dependencies: acorn: "npm:^8.12.0" acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^4.0.0" - checksum: 10c0/52e6feaa77a31a6038f0c0e3fce93010a4625701925b0715cd54a2ae190b3275053a0717db698697b32653788ac04845e489d6773b508d6c2e8752f3c57470a0 + eslint-visitor-keys: "npm:^4.1.0" + checksum: 10c0/2b6bfb683e7e5ab2e9513949879140898d80a2d9867ea1db6ff5b0256df81722633b60a7523a7c614f05a39aeea159dd09ad2a0e90c0e218732fc016f9086215 languageName: node linkType: hard @@ -3723,7 +3679,7 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^9.0.0": +"file-entry-cache@npm:^9.1.0": version: 9.1.0 resolution: "file-entry-cache@npm:9.1.0" dependencies: @@ -3981,10 +3937,10 @@ __metadata: languageName: node linkType: hard -"globals@npm:15.9.0": - version: 15.9.0 - resolution: "globals@npm:15.9.0" - checksum: 10c0/de4b553e412e7e830998578d51b605c492256fb2a9273eaeec6ec9ee519f1c5aa50de57e3979911607fd7593a4066420e01d8c3d551e7a6a236e96c521aee36c +"globals@npm:15.11.0": + version: 15.11.0 + resolution: "globals@npm:15.11.0" + checksum: 10c0/861e39bb6bd9bd1b9f355c25c962e5eb4b3f0e1567cf60fa6c06e8c502b0ec8706b1cce055d69d84d0b7b8e028bec5418cf629a54e7047e116538d1c1c1a375c languageName: node linkType: hard @@ -4075,13 +4031,6 @@ __metadata: languageName: node linkType: hard -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 - languageName: node - linkType: hard - "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -4157,13 +4106,20 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.2.0, ignore@npm:^5.3.2": +"ignore@npm:^5.2.0": version: 5.3.2 resolution: "ignore@npm:5.3.2" checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 languageName: node linkType: hard +"ignore@npm:^6.0.2": + version: 6.0.2 + resolution: "ignore@npm:6.0.2" + checksum: 10c0/9a38feac1861906a78ba0f03e8ef3cd6b0526dce2a1a84e1009324b557763afeb9c3ebcc04666b21f7bbf71adda45e76781bb9e2eaa0903d45dcaded634454f5 + languageName: node + linkType: hard + "immutable@npm:^4.0.0": version: 4.3.7 resolution: "immutable@npm:4.3.7" @@ -4335,13 +4291,6 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 - languageName: node - linkType: hard - "is-plain-object@npm:^2.0.4": version: 2.0.4 resolution: "is-plain-object@npm:2.0.4" @@ -4396,18 +4345,18 @@ __metadata: version: 0.0.0-use.local resolution: "jenkins-ui@workspace:." dependencies: - "@babel/cli": "npm:7.25.6" - "@babel/core": "npm:7.25.2" - "@babel/preset-env": "npm:7.25.4" - "@eslint/js": "npm:9.11.0" + "@babel/cli": "npm:7.25.9" + "@babel/core": "npm:7.26.0" + "@babel/preset-env": "npm:7.26.0" + "@eslint/js": "npm:9.13.0" babel-loader: "npm:9.2.1" clean-webpack-plugin: "npm:4.0.0" css-loader: "npm:7.1.2" css-minimizer-webpack-plugin: "npm:7.0.0" - eslint: "npm:9.11.0" + eslint: "npm:9.13.0" eslint-config-prettier: "npm:9.1.0" eslint-formatter-checkstyle: "npm:8.40.0" - globals: "npm:15.9.0" + globals: "npm:15.11.0" handlebars: "npm:4.7.8" handlebars-loader: "npm:1.7.3" hotkeys-js: "npm:3.12.2" @@ -4416,18 +4365,18 @@ __metadata: mini-css-extract-plugin: "npm:2.9.1" postcss: "npm:8.4.47" postcss-loader: "npm:8.1.1" - postcss-preset-env: "npm:10.0.3" + postcss-preset-env: "npm:10.0.8" postcss-scss: "npm:4.0.9" prettier: "npm:3.3.3" - sass: "npm:1.79.3" + sass: "npm:1.80.5" sass-loader: "npm:16.0.2" sortablejs: "npm:1.15.3" style-loader: "npm:4.0.0" - stylelint: "npm:16.9.0" + stylelint: "npm:16.10.0" stylelint-checkstyle-reporter: "npm:1.0.0" stylelint-config-standard: "npm:36.0.1" tippy.js: "npm:6.3.7" - webpack: "npm:5.94.0" + webpack: "npm:5.95.0" webpack-cli: "npm:5.1.4" webpack-remove-empty-scripts: "npm:1.0.4" window-handle: "npm:1.0.1" @@ -4524,21 +4473,12 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 - languageName: node - linkType: hard - -"jsesc@npm:~0.5.0": - version: 0.5.0 - resolution: "jsesc@npm:0.5.0" +"jsesc@npm:^3.0.2, jsesc@npm:~3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" bin: jsesc: bin/jsesc - checksum: 10c0/f93792440ae1d80f091b65f8ceddf8e55c4bb7f1a09dee5dcbdb0db5612c55c0f6045625aa6b7e8edb2e0a4feabd80ee48616dbe2d37055573a84db3d24f96d9 + checksum: 10c0/ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1 languageName: node linkType: hard @@ -4798,6 +4738,13 @@ __metadata: languageName: node linkType: hard +"mdn-data@npm:2.10.0": + version: 2.10.0 + resolution: "mdn-data@npm:2.10.0" + checksum: 10c0/f6f1a6a6eb092bab250d06f6f6c7cb1733a77a17e7119aac829ad67d4322bbf6a30df3c6d88686e71942e66bd49274b2ddfede22a1d3df0d6c49a56fbd09eb7c + languageName: node + linkType: hard + "meow@npm:^13.2.0": version: 13.2.0 resolution: "meow@npm:13.2.0" @@ -4819,7 +4766,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -5012,6 +4959,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^7.0.0": + version: 7.1.1 + resolution: "node-addon-api@npm:7.1.1" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/fb32a206276d608037fa1bcd7e9921e177fe992fc610d098aa3128baca3c0050fc1e014fa007e9b3874cf865ddb4f5bd9f43ccb7cbbbe4efaff6a83e920b17e9 + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 10.2.0 resolution: "node-gyp@npm:10.2.0" @@ -5329,14 +5285,14 @@ __metadata: languageName: node linkType: hard -"postcss-attribute-case-insensitive@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-attribute-case-insensitive@npm:7.0.0" +"postcss-attribute-case-insensitive@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-attribute-case-insensitive@npm:7.0.1" dependencies: - postcss-selector-parser: "npm:^6.1.0" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/ce2a96bc29f59a6113953f1f72bfa2d4d34e54b194ff4d49aad0d548aa738835afaf479f22060a2605952b842f63aeae278b44e41f8f3a05731df28d08e2df97 + checksum: 10c0/48945abe2024e2d2e4c37d30b8c1aaf37af720f24f6a996f7ea7e7ed33621f5c22cf247ed22028c0c922de040c58c0802729bc39b903cb1693f4b63c0b49da34 languageName: node linkType: hard @@ -5363,18 +5319,18 @@ __metadata: languageName: node linkType: hard -"postcss-color-functional-notation@npm:^7.0.2": - version: 7.0.2 - resolution: "postcss-color-functional-notation@npm:7.0.2" +"postcss-color-functional-notation@npm:^7.0.4": + version: 7.0.4 + resolution: "postcss-color-functional-notation@npm:7.0.4" dependencies: - "@csstools/css-color-parser": "npm:^3.0.2" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/css-color-parser": "npm:^3.0.4" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/e89c0bff94558b0c978ac36f7e02f7f516291f90fd43169d39c63ad2bb0415e3b1c4b3c2469280d578727e850fdf15a557230cb28275f3f0676f0f73187f2867 + checksum: 10c0/1e39c47f27610ebf6a6308cfea2904fbe1f157b13654325ada23153a944666722c6132b53dfc7660632406a636479dda68eeb97a246c2e593ad6eed1e9bf838d languageName: node linkType: hard @@ -5428,57 +5384,57 @@ __metadata: languageName: node linkType: hard -"postcss-custom-media@npm:^11.0.1": - version: 11.0.1 - resolution: "postcss-custom-media@npm:11.0.1" +"postcss-custom-media@npm:^11.0.4": + version: 11.0.4 + resolution: "postcss-custom-media@npm:11.0.4" dependencies: - "@csstools/cascade-layer-name-parser": "npm:^2.0.1" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" - "@csstools/media-query-list-parser": "npm:^3.0.1" + "@csstools/cascade-layer-name-parser": "npm:^2.0.3" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" + "@csstools/media-query-list-parser": "npm:^4.0.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/771b281a28f105370ede7c4a86f9e3dd8d9ec3bf2d2883d4f2cfe9c42b5ec1bf88f713458b356870315d0ba3a285fbeb7bb514a1203d1c4fb113bd9044369bf2 + checksum: 10c0/31e82e5802f6933a15f5fcf64ff41c8107af9c1d5dcba3c4422a6de3fac77bce9e3dc4ed2b79ae7f6ae460549c5da5a013669af05c1ae21549dbb09b66a9492d languageName: node linkType: hard -"postcss-custom-properties@npm:^14.0.1": - version: 14.0.1 - resolution: "postcss-custom-properties@npm:14.0.1" +"postcss-custom-properties@npm:^14.0.3": + version: 14.0.3 + resolution: "postcss-custom-properties@npm:14.0.3" dependencies: - "@csstools/cascade-layer-name-parser": "npm:^2.0.1" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/cascade-layer-name-parser": "npm:^2.0.3" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" "@csstools/utilities": "npm:^2.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/12180a7f4a4fe2d528387346a1810b82ed870081756dcf6be226c839716ab3f6f4d6ca4c7208a07d7d84bf2c986beef6473e29964e7c2572066fca5d3b000ed5 + checksum: 10c0/878ffd171ab9bbbba711930cf1b5bd48a12779e3b45d69f41366c2f65d84518f9338a92a277c0e390518c9e12272e06892cdc6575783bcdecfa6d26ebde3d043 languageName: node linkType: hard -"postcss-custom-selectors@npm:^8.0.1": - version: 8.0.1 - resolution: "postcss-custom-selectors@npm:8.0.1" +"postcss-custom-selectors@npm:^8.0.3": + version: 8.0.3 + resolution: "postcss-custom-selectors@npm:8.0.3" dependencies: - "@csstools/cascade-layer-name-parser": "npm:^2.0.1" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" - postcss-selector-parser: "npm:^6.1.0" + "@csstools/cascade-layer-name-parser": "npm:^2.0.3" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/b867233b3d68fbab90afca8a776eb74196ebc3fac8988175d95118a47993c793138fec6cc580272bb35d9bd31086acbdd33ff86da0cab83ef2f08bfc1c23ecd6 + checksum: 10c0/3acdada43e385c23130f1dde41b189acc7739e5bbd14751ae28b2bd97b0d97f30c2a53da4f9558d108a893cc48717f76b28395a9ff38dcbbe3c3a1721ee4a68a languageName: node linkType: hard -"postcss-dir-pseudo-class@npm:^9.0.0": - version: 9.0.0 - resolution: "postcss-dir-pseudo-class@npm:9.0.0" +"postcss-dir-pseudo-class@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-dir-pseudo-class@npm:9.0.1" dependencies: - postcss-selector-parser: "npm:^6.1.0" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/debae71bf508c0e494ebb1892ce6b3c1c4eeb6b23231180151a93920a12fec771815510cdec54db54605e090ae56af9f07c68ef6a61260d0c837adc719f9e1e4 + checksum: 10c0/da9d3387648c5c3161a653d354c8f3e70a299108df3977e8aa65cf10793e4dd58a2711b3426cd63716245b13584ca8d95adcd6e10e3c9adbc61d08743e2d8690 languageName: node linkType: hard @@ -5533,25 +5489,25 @@ __metadata: languageName: node linkType: hard -"postcss-focus-visible@npm:^10.0.0": - version: 10.0.0 - resolution: "postcss-focus-visible@npm:10.0.0" +"postcss-focus-visible@npm:^10.0.1": + version: 10.0.1 + resolution: "postcss-focus-visible@npm:10.0.1" dependencies: - postcss-selector-parser: "npm:^6.1.0" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/b86b825bac597092b300127c2686c0669ce0766165716ecda42f298f21ca69dda721e44917732cbcb2611a4ab650f1231bf8c5d4d07c9daefef815329251ae8a + checksum: 10c0/c5ecc8536a708a49a99d0abd68a88a160664e6c832c808db8edd9f0221e7017a258daa87e49daf2cb098cb037005d46cf492403c8c9c92ad8835d30adaccf665 languageName: node linkType: hard -"postcss-focus-within@npm:^9.0.0": - version: 9.0.0 - resolution: "postcss-focus-within@npm:9.0.0" +"postcss-focus-within@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-focus-within@npm:9.0.1" dependencies: - postcss-selector-parser: "npm:^6.1.0" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/1d6f1b4f4d12e23a2824f394652d520942f00fd582d3016c933a492fe0ba38aaf26bc1855576878aaeaeda1d6fc38da39bb51e8e6470c50ef03f3ea9a286b3d1 + checksum: 10c0/d6ab49d2a7f33485a9e137dc77ec92c5619a3ec92e1e672734fc604853ff1f3c0c189085c12461614be4fcb03ea0347d91791a45986a18d50b5228d161eda57a languageName: node linkType: hard @@ -5585,18 +5541,18 @@ __metadata: languageName: node linkType: hard -"postcss-lab-function@npm:^7.0.2": - version: 7.0.2 - resolution: "postcss-lab-function@npm:7.0.2" +"postcss-lab-function@npm:^7.0.4": + version: 7.0.4 + resolution: "postcss-lab-function@npm:7.0.4" dependencies: - "@csstools/css-color-parser": "npm:^3.0.2" - "@csstools/css-parser-algorithms": "npm:^3.0.1" - "@csstools/css-tokenizer": "npm:^3.0.1" + "@csstools/css-color-parser": "npm:^3.0.4" + "@csstools/css-parser-algorithms": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.2" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/6b2be7e762b4ccb58ea9051723d390f6732ad78bb30bfef9499139cf5e2ac160c3de31b2b005fcc30e9fced4abe1685df6cb76c99d548896bae6746105ac8520 + checksum: 10c0/79ce3cc20484aef0e0bbc2d18c8f91d7362226a3db52f06a931ac8e1c58ffbc60876c6439f364093e5f16ef92260a420230cfb2a9e7b95c6c11e6f7d57626260 languageName: node linkType: hard @@ -5750,16 +5706,16 @@ __metadata: languageName: node linkType: hard -"postcss-nesting@npm:^13.0.0": - version: 13.0.0 - resolution: "postcss-nesting@npm:13.0.0" +"postcss-nesting@npm:^13.0.1": + version: 13.0.1 + resolution: "postcss-nesting@npm:13.0.1" dependencies: - "@csstools/selector-resolve-nested": "npm:^2.0.0" - "@csstools/selector-specificity": "npm:^4.0.0" - postcss-selector-parser: "npm:^6.1.0" + "@csstools/selector-resolve-nested": "npm:^3.0.0" + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/b82a3c7010f7c6097bd3f3fe6c03f3f3af9a63a58e255f120dadd506a0ea9444aeeaba994f2a3fa34fb26e666dc72032edf5786c5fbdade790b02ad07d91ef95 + checksum: 10c0/549307c272cdd4cb5105d8fbcd582f15a1cb74e5bba240b05b27f77fe0422730be966699a49a9ad15fd9d1bc551c1edbaefb21a69686a9b131b585dbc9d90ebf languageName: node linkType: hard @@ -5913,85 +5869,85 @@ __metadata: languageName: node linkType: hard -"postcss-preset-env@npm:10.0.3": - version: 10.0.3 - resolution: "postcss-preset-env@npm:10.0.3" +"postcss-preset-env@npm:10.0.8": + version: 10.0.8 + resolution: "postcss-preset-env@npm:10.0.8" dependencies: - "@csstools/postcss-cascade-layers": "npm:^5.0.0" - "@csstools/postcss-color-function": "npm:^4.0.2" - "@csstools/postcss-color-mix-function": "npm:^3.0.2" - "@csstools/postcss-content-alt-text": "npm:^2.0.1" - "@csstools/postcss-exponential-functions": "npm:^2.0.1" + "@csstools/postcss-cascade-layers": "npm:^5.0.1" + "@csstools/postcss-color-function": "npm:^4.0.4" + "@csstools/postcss-color-mix-function": "npm:^3.0.4" + "@csstools/postcss-content-alt-text": "npm:^2.0.3" + "@csstools/postcss-exponential-functions": "npm:^2.0.3" "@csstools/postcss-font-format-keywords": "npm:^4.0.0" - "@csstools/postcss-gamut-mapping": "npm:^2.0.2" - "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.2" - "@csstools/postcss-hwb-function": "npm:^4.0.2" + "@csstools/postcss-gamut-mapping": "npm:^2.0.4" + "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.4" + "@csstools/postcss-hwb-function": "npm:^4.0.4" "@csstools/postcss-ic-unit": "npm:^4.0.0" "@csstools/postcss-initial": "npm:^2.0.0" - "@csstools/postcss-is-pseudo-class": "npm:^5.0.0" - "@csstools/postcss-light-dark-function": "npm:^2.0.2" + "@csstools/postcss-is-pseudo-class": "npm:^5.0.1" + "@csstools/postcss-light-dark-function": "npm:^2.0.6" "@csstools/postcss-logical-float-and-clear": "npm:^3.0.0" "@csstools/postcss-logical-overflow": "npm:^2.0.0" "@csstools/postcss-logical-overscroll-behavior": "npm:^2.0.0" "@csstools/postcss-logical-resize": "npm:^3.0.0" - "@csstools/postcss-logical-viewport-units": "npm:^3.0.1" - "@csstools/postcss-media-minmax": "npm:^2.0.1" - "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^3.0.1" + "@csstools/postcss-logical-viewport-units": "npm:^3.0.2" + "@csstools/postcss-media-minmax": "npm:^2.0.3" + "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^3.0.3" "@csstools/postcss-nested-calc": "npm:^4.0.0" "@csstools/postcss-normalize-display-values": "npm:^4.0.0" - "@csstools/postcss-oklab-function": "npm:^4.0.2" + "@csstools/postcss-oklab-function": "npm:^4.0.4" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" - "@csstools/postcss-relative-color-syntax": "npm:^3.0.2" - "@csstools/postcss-scope-pseudo-class": "npm:^4.0.0" - "@csstools/postcss-stepped-value-functions": "npm:^4.0.1" + "@csstools/postcss-relative-color-syntax": "npm:^3.0.4" + "@csstools/postcss-scope-pseudo-class": "npm:^4.0.1" + "@csstools/postcss-stepped-value-functions": "npm:^4.0.3" "@csstools/postcss-text-decoration-shorthand": "npm:^4.0.1" - "@csstools/postcss-trigonometric-functions": "npm:^4.0.1" + "@csstools/postcss-trigonometric-functions": "npm:^4.0.3" "@csstools/postcss-unset-value": "npm:^4.0.0" autoprefixer: "npm:^10.4.19" browserslist: "npm:^4.23.1" - css-blank-pseudo: "npm:^7.0.0" - css-has-pseudo: "npm:^7.0.0" + css-blank-pseudo: "npm:^7.0.1" + css-has-pseudo: "npm:^7.0.1" css-prefers-color-scheme: "npm:^10.0.0" - cssdb: "npm:^8.1.1" - postcss-attribute-case-insensitive: "npm:^7.0.0" + cssdb: "npm:^8.1.2" + postcss-attribute-case-insensitive: "npm:^7.0.1" postcss-clamp: "npm:^4.1.0" - postcss-color-functional-notation: "npm:^7.0.2" + postcss-color-functional-notation: "npm:^7.0.4" postcss-color-hex-alpha: "npm:^10.0.0" postcss-color-rebeccapurple: "npm:^10.0.0" - postcss-custom-media: "npm:^11.0.1" - postcss-custom-properties: "npm:^14.0.1" - postcss-custom-selectors: "npm:^8.0.1" - postcss-dir-pseudo-class: "npm:^9.0.0" + postcss-custom-media: "npm:^11.0.4" + postcss-custom-properties: "npm:^14.0.3" + postcss-custom-selectors: "npm:^8.0.3" + postcss-dir-pseudo-class: "npm:^9.0.1" postcss-double-position-gradients: "npm:^6.0.0" - postcss-focus-visible: "npm:^10.0.0" - postcss-focus-within: "npm:^9.0.0" + postcss-focus-visible: "npm:^10.0.1" + postcss-focus-within: "npm:^9.0.1" postcss-font-variant: "npm:^5.0.0" postcss-gap-properties: "npm:^6.0.0" postcss-image-set-function: "npm:^7.0.0" - postcss-lab-function: "npm:^7.0.2" + postcss-lab-function: "npm:^7.0.4" postcss-logical: "npm:^8.0.0" - postcss-nesting: "npm:^13.0.0" + postcss-nesting: "npm:^13.0.1" postcss-opacity-percentage: "npm:^3.0.0" postcss-overflow-shorthand: "npm:^6.0.0" postcss-page-break: "npm:^3.0.4" postcss-place: "npm:^10.0.0" - postcss-pseudo-class-any-link: "npm:^10.0.0" + postcss-pseudo-class-any-link: "npm:^10.0.1" postcss-replace-overflow-wrap: "npm:^4.0.0" - postcss-selector-not: "npm:^8.0.0" + postcss-selector-not: "npm:^8.0.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/da42caa2aab4d825fddfde00ebe2416d338c7b9a6f79a68840297888a8384f85991991c3fa10cf2d359fb230c885375f5cebd7bd63972725cd2a596d218f8b6a + checksum: 10c0/3f7dc8eb2e7f4e7a5eee0a9456972a5b18bd40109d1aa3328f60cd645d352f3a70c83c507ea58f83b820153b0f5c3f14af3f376573c56599c36d5739c943b6f1 languageName: node linkType: hard -"postcss-pseudo-class-any-link@npm:^10.0.0": - version: 10.0.0 - resolution: "postcss-pseudo-class-any-link@npm:10.0.0" +"postcss-pseudo-class-any-link@npm:^10.0.1": + version: 10.0.1 + resolution: "postcss-pseudo-class-any-link@npm:10.0.1" dependencies: - postcss-selector-parser: "npm:^6.1.0" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/8357716e0ba0f01c70dba65a1efd268f610249ac2fbd41833e5e87dc19ffa7911c8d5e234d0d7c77d94ba6cdfa04fe7f0f98461c34f64cdbb59abd9737ab7d32 + checksum: 10c0/95e883996e87baf14fc09d25f9a763a2e9d599eb3b9c6b736e83a8c3d0b55841bcb886bccdf51b5b7fefc128cbd0187ad8841f59878f85bd1613642e592d7673 languageName: node linkType: hard @@ -6034,12 +5990,12 @@ __metadata: languageName: node linkType: hard -"postcss-safe-parser@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-safe-parser@npm:7.0.0" +"postcss-safe-parser@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-safe-parser@npm:7.0.1" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/4217afd8ce2809e959dc365e4675f499303cc6b91f94db06c8164422822db2d3b3124df701ee2234db4127ad05619b016bfb9c2bccae9bf9cf898a396f1632c9 + checksum: 10c0/6957b10b818bd8d4664ec0e548af967f7549abedfb37f844d389571d36af681340f41f9477b9ccf34bcc7599bdef222d1d72e79c64373001fae77089fba6d965 languageName: node linkType: hard @@ -6052,18 +6008,18 @@ __metadata: languageName: node linkType: hard -"postcss-selector-not@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-selector-not@npm:8.0.0" +"postcss-selector-not@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-selector-not@npm:8.0.1" dependencies: - postcss-selector-parser: "npm:^6.1.0" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/677f2cd9d0cd481d276663b57001b2ba96db94ad5bba397f277e53d560ccb074b27c21792deff44720a9f2d96da85fa34f438bb1d33198305b5866b35f1a4708 + checksum: 10c0/491ea3dcc421cd90135be786078521605e2062fb93624ea8813cfd5ba0d35143f931e2e608d5f20effd5ea7d3f4786d2afea2afa42d117779a0288e135f132b6 languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.1.0, postcss-selector-parser@npm:^6.1.2": +"postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.1.2": version: 6.1.2 resolution: "postcss-selector-parser@npm:6.1.2" dependencies: @@ -6073,6 +6029,16 @@ __metadata: languageName: node linkType: hard +"postcss-selector-parser@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-selector-parser@npm:7.0.0" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10c0/e96e096afcce70bf5c97789f5ea09d7415ae5eb701d82b05b5e8532885d31363b484fcb1ca9488c9a331f30508d9e5bb6c3109eb2eb5067ef3d3919f9928cd9d + languageName: node + linkType: hard + "postcss-svgo@npm:^7.0.1": version: 7.0.1 resolution: "postcss-svgo@npm:7.0.1" @@ -6103,7 +6069,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.4.47, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.4.41": +"postcss@npm:8.4.47, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.4.47": version: 8.4.47 resolution: "postcss@npm:8.4.47" dependencies: @@ -6195,12 +6161,12 @@ __metadata: languageName: node linkType: hard -"regenerate-unicode-properties@npm:^10.1.0": - version: 10.1.1 - resolution: "regenerate-unicode-properties@npm:10.1.1" +"regenerate-unicode-properties@npm:^10.2.0": + version: 10.2.0 + resolution: "regenerate-unicode-properties@npm:10.2.0" dependencies: regenerate: "npm:^1.4.2" - checksum: 10c0/89adb5ee5ba081380c78f9057c02e156a8181969f6fcca72451efc45612e0c3df767b4333f8d8479c274d9c6fe52ec4854f0d8a22ef95dccbe87da8e5f2ac77d + checksum: 10c0/5510785eeaf56bbfdf4e663d6753f125c08d2a372d4107bc1b756b7bf142e2ed80c2733a8b54e68fb309ba37690e66a0362699b0e21d5c1f0255dea1b00e6460 languageName: node linkType: hard @@ -6227,28 +6193,35 @@ __metadata: languageName: node linkType: hard -"regexpu-core@npm:^5.3.1": - version: 5.3.2 - resolution: "regexpu-core@npm:5.3.2" +"regexpu-core@npm:^6.1.1": + version: 6.1.1 + resolution: "regexpu-core@npm:6.1.1" dependencies: - "@babel/regjsgen": "npm:^0.8.0" regenerate: "npm:^1.4.2" - regenerate-unicode-properties: "npm:^10.1.0" - regjsparser: "npm:^0.9.1" + regenerate-unicode-properties: "npm:^10.2.0" + regjsgen: "npm:^0.8.0" + regjsparser: "npm:^0.11.0" unicode-match-property-ecmascript: "npm:^2.0.0" unicode-match-property-value-ecmascript: "npm:^2.1.0" - checksum: 10c0/7945d5ab10c8bbed3ca383d4274687ea825aee4ab93a9c51c6e31e1365edd5ea807f6908f800ba017b66c462944ba68011164e7055207747ab651f8111ef3770 + checksum: 10c0/07d49697e20f9b65977535abba4858b7f5171c13f7c366be53ec1886d3d5f69f1b98cc6a6e63cf271adda077c3366a4c851c7473c28bbd69cf5a6b6b008efc3e languageName: node linkType: hard -"regjsparser@npm:^0.9.1": - version: 0.9.1 - resolution: "regjsparser@npm:0.9.1" +"regjsgen@npm:^0.8.0": + version: 0.8.0 + resolution: "regjsgen@npm:0.8.0" + checksum: 10c0/44f526c4fdbf0b29286101a282189e4dbb303f4013cf3fea058668d96d113b9180d3d03d1e13f6d4cbde38b7728bf951aecd9dc199938c080093a9a6f0d7a6bd + languageName: node + linkType: hard + +"regjsparser@npm:^0.11.0": + version: 0.11.0 + resolution: "regjsparser@npm:0.11.0" dependencies: - jsesc: "npm:~0.5.0" + jsesc: "npm:~3.0.2" bin: regjsparser: bin/parser - checksum: 10c0/fe44fcf19a99fe4f92809b0b6179530e5ef313ff7f87df143b08ce9a2eb3c4b6189b43735d645be6e8f4033bfb015ed1ca54f0583bc7561bed53fd379feb8225 + checksum: 10c0/155143a8f2c95e3170df4fff10ddf3f16a351b5d2b8cbb257e9f4a50abb9a980a28af0936b5bf850fee767537ffa8eb77c6b211fe8be19834dbe584dfd950c62 languageName: node linkType: hard @@ -6382,16 +6355,17 @@ __metadata: languageName: node linkType: hard -"sass@npm:1.79.3": - version: 1.79.3 - resolution: "sass@npm:1.79.3" +"sass@npm:1.80.5": + version: 1.80.5 + resolution: "sass@npm:1.80.5" dependencies: + "@parcel/watcher": "npm:^2.4.1" chokidar: "npm:^4.0.0" immutable: "npm:^4.0.0" source-map-js: "npm:>=0.6.2 <2.0.0" bin: sass: sass.js - checksum: 10c0/ad171bbbb2d7a789cc47803a59dcf2d0ac92ede34b538bb3fd683b6391a9ac3dc3eabaac264fc9582c770c4e435b85840e011785b7adfc0ac002b51ba91179c9 + checksum: 10c0/d592e57c037315f4c5976af3d37ce4c7758b1b4e89d064455d6992829ea59888c71b9dbc86f7fc8dca87ac98ebc9cece10e5c8fc5509bf192db81712a34fd579 languageName: node linkType: hard @@ -6624,7 +6598,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": +"strip-ansi@npm:^7.0.1": version: 7.1.0 resolution: "strip-ansi@npm:7.1.0" dependencies: @@ -6693,9 +6667,9 @@ __metadata: languageName: node linkType: hard -"stylelint@npm:16.9.0": - version: 16.9.0 - resolution: "stylelint@npm:16.9.0" +"stylelint@npm:16.10.0": + version: 16.10.0 + resolution: "stylelint@npm:16.10.0" dependencies: "@csstools/css-parser-algorithms": "npm:^3.0.1" "@csstools/css-tokenizer": "npm:^3.0.1" @@ -6705,17 +6679,17 @@ __metadata: balanced-match: "npm:^2.0.0" colord: "npm:^2.9.3" cosmiconfig: "npm:^9.0.0" - css-functions-list: "npm:^3.2.2" - css-tree: "npm:^2.3.1" - debug: "npm:^4.3.6" + css-functions-list: "npm:^3.2.3" + css-tree: "npm:^3.0.0" + debug: "npm:^4.3.7" fast-glob: "npm:^3.3.2" fastest-levenshtein: "npm:^1.0.16" - file-entry-cache: "npm:^9.0.0" + file-entry-cache: "npm:^9.1.0" global-modules: "npm:^2.0.0" globby: "npm:^11.1.0" globjoin: "npm:^0.1.4" html-tags: "npm:^3.3.1" - ignore: "npm:^5.3.2" + ignore: "npm:^6.0.2" imurmurhash: "npm:^0.1.4" is-plain-object: "npm:^5.0.0" known-css-properties: "npm:^0.34.0" @@ -6724,30 +6698,20 @@ __metadata: micromatch: "npm:^4.0.8" normalize-path: "npm:^3.0.0" picocolors: "npm:^1.0.1" - postcss: "npm:^8.4.41" + postcss: "npm:^8.4.47" postcss-resolve-nested-selector: "npm:^0.1.6" - postcss-safe-parser: "npm:^7.0.0" + postcss-safe-parser: "npm:^7.0.1" postcss-selector-parser: "npm:^6.1.2" postcss-value-parser: "npm:^4.2.0" resolve-from: "npm:^5.0.0" string-width: "npm:^4.2.3" - strip-ansi: "npm:^7.1.0" supports-hyperlinks: "npm:^3.1.0" svg-tags: "npm:^1.0.0" table: "npm:^6.8.2" write-file-atomic: "npm:^5.0.1" bin: stylelint: bin/stylelint.mjs - checksum: 10c0/d3ff9c8945c56b04a2fa16ec33d163325496d5db94b6fcb5adf74c76f7f794ac992888273f9a3317652ba8b6195168b2ffff382ca2a667a241e2ace8c9505ae2 - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 + checksum: 10c0/d07dd156c225d16c740995daacd78090f7fc317602e87bda2fca323a4ae427a8526d724f3089df3b2185df4520f987547668ceea9b30985988ccbc514034aa21 languageName: node linkType: hard @@ -6896,13 +6860,6 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: 10c0/b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -7087,9 +7044,9 @@ __metadata: languageName: node linkType: hard -"webpack@npm:5.94.0": - version: 5.94.0 - resolution: "webpack@npm:5.94.0" +"webpack@npm:5.95.0": + version: 5.95.0 + resolution: "webpack@npm:5.95.0" dependencies: "@types/estree": "npm:^1.0.5" "@webassemblyjs/ast": "npm:^1.12.1" @@ -7119,7 +7076,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 10c0/b4d1b751f634079bd177a89eef84d80fa5bb8d6fc15d72ab40fc2b9ca5167a79b56585e1a849e9e27e259803ee5c4365cb719e54af70a43c06358ec268ff4ebf + checksum: 10c0/b9e6d0f8ebcbf0632494ac0b90fe4acb8f4a9b83f7ace4a67a15545a36fe58599c912ab58e625e1bf58ab3b0916c75fe99da6196d412ee0cab0b5065edd84238 languageName: node linkType: hard