diff --git a/flake.nix b/flake.nix index 6436607..569ebbb 100644 --- a/flake.nix +++ b/flake.nix @@ -15,12 +15,12 @@ system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}; websiteName = (builtins.fromJSON (builtins.readFile ./website/package.json)).name; - inherit (self.packages.${system}) indexer nixpkgs-data; + inherit (self.packages.${system}) indexer nixpkgs-data builtins-data; prepareData = prefix: '' - cp -f ${nixpkgs-data.lib} ${prefix}./models/data/lib.json - cp -f ${nixpkgs-data.build_support} ${prefix}./models/data/trivial-builders.json - node ${prefix}./scripts/make-builtins.js ${prefix}./models/data + cp -f ${nixpkgs-data.lib} ${prefix}/lib.json + cp -f ${nixpkgs-data.build_support} ${prefix}/trivial-builders.json + cp -f ${builtins-data}/lib/data.json ${prefix}/builtins.json ''; dream2nixOutput = dream2nix.lib.makeFlakeOutputs { @@ -31,7 +31,7 @@ packageOverrides = { ${websiteName}.staticPage = { - preBuild = prepareData ""; + preBuild = prepareData "models/data"; installPhase = '' runHook preInstall @@ -43,6 +43,20 @@ runHook postInstall ''; }; + tests.run = { + installPhase = ""; + preBuild = '' + ls -la + mkdir -p data + ${prepareData "data"} + + ''; + doCheck = true; + checkPhase = '' + ls -la + npm run test -- --ci + ''; + }; }; }; in @@ -84,7 +98,8 @@ buildInputs = with pkgs; [ nodejs-18_x rustfmt rustc cargo clippy ]; inputsFrom = [ indexer ]; shellHook = '' - ${prepareData "./website/"} + ${prepareData "website/models/data"} + ${prepareData "tests/data"} ${self.checks.${system}.pre-commit-check.shellHook} ''; }; @@ -96,9 +111,6 @@ nixpkgs-fmt.enable = true; statix.enable = true; markdownlint.enable = true; - - - }; excludes = [ "indexer/test" ]; settings = { diff --git a/indexer/makeMarkdown.js b/indexer/makeMarkdown.js index cf91e8d..e0445e6 100644 --- a/indexer/makeMarkdown.js +++ b/indexer/makeMarkdown.js @@ -1,4 +1,5 @@ // simple script +// test.json in generated with "cargo run -- --dir ./test" const data = require("./test.json"); const fs = require("fs"); diff --git a/indexer/test/options.nix b/indexer/test/options.nix deleted file mode 100644 index 8165737..0000000 --- a/indexer/test/options.nix +++ /dev/null @@ -1,231 +0,0 @@ -{ pkgs -, lib -, options -, transformOptions ? lib.id -, # function for additional transformations of the options - documentType ? "appendix" -, # TODO deprecate "appendix" in favor of "none" - # and/or rename function to moduleOptionDoc for clean slate - # If you include more than one option list into a document, you need to - # provide different ids. - variablelistId ? "configuration-variable-list" -, # String to prefix to the option XML/HTML id attributes. - optionIdPrefix ? "opt-" -, revision ? "" -, # Specify revision for the options - # a set of options the docs we are generating will be merged into, as if by recursiveUpdate. - # used to split the options doc build into a static part (nixos/modules) and a dynamic part - # (non-nixos modules imported via configuration.nix, other module sources). - baseOptionsJSON ? null -, # instead of printing warnings for eg options with missing descriptions (which may be lost - # by nix build unless -L is given), emit errors instead and fail the build - warningsAreErrors ? true -, # allow docbook option docs if `true`. only markdown documentation is allowed when set to - # `false`, and a different renderer may be used with different bugs and performance - # characteristics but (hopefully) indistinguishable output. - allowDocBook ? true -, # whether lib.mdDoc is required for descriptions to be read as markdown. - markdownByDefault ? false -, -}: -let - /* - Generate JSON, XML and DocBook documentation for given NixOS options. - - Example: - - { pkgs, }: - - let - eval = import (pkgs.path + "/nixos/lib/eval-config.nix") { - baseModules = [ - ../module.nix - ]; - modules = []; - }; - in pkgs.nixosOptionsDoc { - options = eval.options; - } - - Type: - nixosOptionsDoc :: { - pkgs :: AttrSet, - lib :: AttrSet, - options :: AttrSet, - transformOptions? :: String, - documentType? :: String, - variablelistId? :: String, - optionIdPrefix? :: String, - revision? :: String, - baseOptionsJSON? :: AttrSet, - warningsAreErrors? :: Bool, - allowDocBook? :: Bool, - markdownByDefault? :: Bool, - } -> { - optionsNix :: AttrSet, - optionsAsciiDoc :: Derivation, - optionsCommonMark :: Derivation, - optionsJSON optionsXML :: Derivation, - optionsDocBook :: Derivation, - } - */ - rawOpts = lib.optionAttrSetToDocList options; - transformedOpts = map transformOptions rawOpts; - filteredOpts = lib.filter (opt: opt.visible && !opt.internal) transformedOpts; - optionsList = - lib.flip map filteredOpts - ( - opt: - opt - // lib.optionalAttrs (opt ? relatedPackages && opt.relatedPackages != [ ]) { relatedPackages = genRelatedPackages opt.relatedPackages opt.name; } - ); - - # Generate DocBook documentation for a list of packages. This is - # what `relatedPackages` option of `mkOption` from - # ../../../lib/options.nix influences. - # - # Each element of `relatedPackages` can be either - # - a string: that will be interpreted as an attribute name from `pkgs` and turned into a link - # to search.nixos.org, - # - a list: that will be interpreted as an attribute path from `pkgs` and turned into a link - # to search.nixos.org, - # - an attrset: that can specify `name`, `path`, `comment` - # (either of `name`, `path` is required, the rest are optional). - # - # NOTE: No checks against `pkgs` are made to ensure that the referenced package actually exists. - # Such checks are not compatible with option docs caching. - genRelatedPackages = packages: optName: - let - unpack = p: - if lib.isString p - then { name = p; } - else if lib.isList p - then { path = p; } - else p; - describe = args: - let - title = args.title or null; - name = args.name or (lib.concatStringsSep "." args.path); - in - '' - - - - ${lib.optionalString (title != null) "${title} aka "}pkgs.${name} - - - ${lib.optionalString (args ? comment) "${args.comment}"} - - ''; - in - "${lib.concatStringsSep "\n" (map (p: describe (unpack p)) packages)}"; - - optionsNix = builtins.listToAttrs (map - (o: { - name = o.name; - value = removeAttrs o [ "name" "visible" "internal" ]; - }) - optionsList); -in -rec { - inherit optionsNix; - - optionsAsciiDoc = pkgs.runCommand "options.adoc" { } '' - ${pkgs.python3Minimal}/bin/python ${./generateDoc.py} \ - --format asciidoc \ - ${optionsJSON}/share/doc/nixos/options.json \ - > $out - ''; - - optionsCommonMark = pkgs.runCommand "options.md" { } '' - ${pkgs.python3Minimal}/bin/python ${./generateDoc.py} \ - --format commonmark \ - ${optionsJSON}/share/doc/nixos/options.json \ - > $out - ''; - - optionsJSON = - pkgs.runCommand "options.json" - { - meta.description = "List of NixOS options in JSON format"; - nativeBuildInputs = [ - pkgs.brotli - ( - let - # python3Minimal can't be overridden with packages on Darwin, due to a missing framework. - # Instead of modifying stdenv, we take the easy way out, since most people on Darwin will - # just be hacking on the Nixpkgs manual (which also uses make-options-doc). - python = - if pkgs.stdenv.isDarwin - then pkgs.python3 - else pkgs.python3Minimal; - self = python.override { - inherit self; - includeSiteCustomize = true; - }; - in - self.withPackages (p: [ p.mistune ]) - ) - ]; - options = - builtins.toFile "options.json" - (builtins.unsafeDiscardStringContext (builtins.toJSON optionsNix)); - # merge with an empty set if baseOptionsJSON is null to run markdown - # processing on the input options - baseJSON = - if baseOptionsJSON == null - then builtins.toFile "base.json" "{}" - else baseOptionsJSON; - } - '' - # Export list of options in different format. - dst=$out/share/doc/nixos - mkdir -p $dst - - python ${./mergeJSON.py} \ - ${lib.optionalString warningsAreErrors "--warnings-are-errors"} \ - ${lib.optionalString (! allowDocBook) "--error-on-docbook"} \ - ${lib.optionalString markdownByDefault "--markdown-by-default"} \ - $baseJSON $options \ - > $dst/options.json - - brotli -9 < $dst/options.json > $dst/options.json.br - - mkdir -p $out/nix-support - echo "file json $dst/options.json" >> $out/nix-support/hydra-build-products - echo "file json-br $dst/options.json.br" >> $out/nix-support/hydra-build-products - ''; - - # Convert options.json into an XML file. - # The actual generation of the xml file is done in nix purely for the convenience - # of not having to generate the xml some other way - optionsXML = pkgs.runCommand "options.xml" { } '' - export NIX_STORE_DIR=$TMPDIR/store - export NIX_STATE_DIR=$TMPDIR/state - ${pkgs.nix}/bin/nix-instantiate \ - --eval --xml --strict ${./optionsJSONtoXML.nix} \ - --argstr file ${optionsJSON}/share/doc/nixos/options.json \ - > "$out" - ''; - - optionsDocBook = pkgs.runCommand "options-docbook.xml" { } '' - optionsXML=${optionsXML} - if grep /nixpkgs/nixos/modules $optionsXML; then - echo "The manual appears to depend on the location of Nixpkgs, which is bad" - echo "since this prevents sharing via the NixOS channel. This is typically" - echo "caused by an option default that refers to a relative path (see above" - echo "for hints about the offending path)." - exit 1 - fi - - ${pkgs.python3Minimal}/bin/python ${./sortXML.py} $optionsXML sorted.xml - ${pkgs.libxslt.bin}/bin/xsltproc \ - --stringparam documentType '${documentType}' \ - --stringparam revision '${revision}' \ - --stringparam variablelistId '${variablelistId}' \ - --stringparam optionIdPrefix '${optionIdPrefix}' \ - -o intermediate.xml ${./options-to-docbook.xsl} sorted.xml - ${pkgs.libxslt.bin}/bin/xsltproc \ - -o "$out" ${./postprocess-option-descriptions.xsl} intermediate.xml - ''; -} diff --git a/indexer/test/types.nix b/indexer/test/types.nix new file mode 100644 index 0000000..ac480ab --- /dev/null +++ b/indexer/test/types.nix @@ -0,0 +1,987 @@ +# Definitions related to run-time type checking. Used in particular +# to type-check NixOS configurations. +{ lib }: + +let + inherit (lib) + elem + flip + isAttrs + isBool + isDerivation + isFloat + isFunction + isInt + isList + isString + isStorePath + toDerivation + toList + ; + inherit (lib.lists) + all + concatLists + count + elemAt + filter + foldl' + head + imap1 + last + length + tail + ; + inherit (lib.attrsets) + attrNames + filterAttrs + hasAttr + mapAttrs + optionalAttrs + zipAttrsWith + ; + inherit (lib.options) + getFiles + getValues + mergeDefaultOption + mergeEqualOption + mergeOneOption + mergeUniqueOption + showFiles + showOption + ; + inherit (lib.strings) + concatMapStringsSep + concatStringsSep + escapeNixString + hasInfix + isStringLike + ; + inherit (lib.trivial) + boolToString + ; + + inherit (lib.modules) + mergeDefinitions + fixupOptionType + mergeOptionDecls + ; + outer_types = +rec { + isType = type: x: (x._type or "") == type; + + setType = typeName: value: value // { + _type = typeName; + }; + + + /* Default type merging function + takes two type functors and return the merged type + + */ + defaultTypeMerge = f: f': + let wrapped = f.wrapped.typeMerge f'.wrapped.functor; + payload = f.binOp f.payload f'.payload; + in + # cannot merge different types + if f.name != f'.name + then null + # simple types + else if (f.wrapped == null && f'.wrapped == null) + && (f.payload == null && f'.payload == null) + then f.type + # composed types + else if (f.wrapped != null && f'.wrapped != null) && (wrapped != null) + then f.type wrapped + # value types + else if (f.payload != null && f'.payload != null) && (payload != null) + then f.type payload + else null; + + /* Default type functor */ + defaultFunctor = name: { + inherit name; + type = types.${name} or null; + wrapped = null; + payload = null; + binOp = a: b: null; + }; + + isOptionType = isType "option-type"; + /* + Function that creates an optionType to be used in the module system. + + Example: + + Type: + { + name :: String; + description :: String ?; + descriptionClass :: "noun" | "conjunction" | "composite" ?; + check :: (a -> Bool) ?; + merge :: + emptyValue :: {} ?; + getSubOptions :: ( [String] -> {}) ?; + getSubModules :: ( [Module] ) ?; + substSubModules :: ( [Module] ) ?; + typeMerge :: + functor :: + deprecationMessage :: + nestedTypes :: + } + -> + { + name :: String + name check merge emptyValue getSubOptions getSubModules substSubModules + typeMerge functor deprecationMessage nestedTypes descriptionClass; + description = if description == null then name else description; + + _type :: "option-type"; + }; + + */ + mkOptionType = + { # Human-readable representation of the type, should be equivalent to + # the type function name. + name + , # Description of the type, defined recursively by embedding the wrapped type if any. + description ? null + # A hint for whether or not this description needs parentheses. Possible values: + # - "noun": a simple noun phrase such as "positive integer" + # - "conjunction": a phrase with a potentially ambiguous "or" connective. + # - "composite": a phrase with an "of" connective + # See the `optionDescriptionPhrase` function. + , descriptionClass ? null + , # DO NOT USE WITHOUT KNOWING WHAT YOU ARE DOING! + # Function applied to each definition that must return false when a definition + # does not match the type. It should not check more than the root of the value, + # because checking nested values reduces laziness, leading to unnecessary + # infinite recursions in the module system. + # Further checks of nested values should be performed by throwing in + # the merge function. + # Strict and deep type checking can be performed by calling lib.deepSeq on + # the merged value. + # + # See https://github.com/NixOS/nixpkgs/pull/6794 that introduced this change, + # https://github.com/NixOS/nixpkgs/pull/173568 and + # https://github.com/NixOS/nixpkgs/pull/168295 that attempted to revert this, + # https://github.com/NixOS/nixpkgs/issues/191124 and + # https://github.com/NixOS/nixos-search/issues/391 for what happens if you ignore + # this disclaimer. + check ? (x: true) + , # Merge a list of definitions together into a single value. + # This function is called with two arguments: the location of + # the option in the configuration as a list of strings + # (e.g. ["boot" "loader "grub" "enable"]), and a list of + # definition values and locations (e.g. [ { file = "/foo.nix"; + # value = 1; } { file = "/bar.nix"; value = 2 } ]). + merge ? mergeDefaultOption + , # Whether this type has a value representing nothingness. If it does, + # this should be a value of the form { value = ; } + # If it doesn't, this should be {} + # This may be used when a value is required for `mkIf false`. This allows the extra laziness in e.g. `lazyAttrsOf`. + emptyValue ? {} + , # Return a flat list of sub-options. Used to generate + # documentation. + getSubOptions ? prefix: {} + , # List of modules if any, or null if none. + getSubModules ? null + , # Function for building the same option type with a different list of + # modules. + substSubModules ? m: null + , # Function that merge type declarations. + # internal, takes a functor as argument and returns the merged type. + # returning null means the type is not mergeable + typeMerge ? defaultTypeMerge functor + , # The type functor. + # internal, representation of the type as an attribute set. + # name: name of the type + # type: type function. + # wrapped: the type wrapped in case of compound types. + # payload: values of the type, two payloads of the same type must be + # combinable with the binOp binary operation. + # binOp: binary operation that merge two payloads of the same type. + functor ? defaultFunctor name + , # The deprecation message to display when this type is used by an option + # If null, the type isn't deprecated + deprecationMessage ? null + , # The types that occur in the definition of this type. This is used to + # issue deprecation warnings recursively. Can also be used to reuse + # nested types + nestedTypes ? {} + }: + { _type = "option-type"; + inherit + name check merge emptyValue getSubOptions getSubModules substSubModules + typeMerge functor deprecationMessage nestedTypes descriptionClass; + description = if description == null then name else description; + }; + + # optionDescriptionPhrase :: (str -> bool) -> optionType -> str + # + # Helper function for producing unambiguous but readable natural language + # descriptions of types. + # + # Parameters + # + # optionDescriptionPhase unparenthesize optionType + # + # `unparenthesize`: A function from descriptionClass string to boolean. + # It must return true when the class of phrase will fit unambiguously into + # the description of the caller. + # + # `optionType`: The option type to parenthesize or not. + # The option whose description we're returning. + # + # Return value + # + # The description of the `optionType`, with parentheses if there may be an + # ambiguity. + optionDescriptionPhrase = unparenthesize: t: + if unparenthesize (t.descriptionClass or null) + then t.description + else "(${t.description})"; + + # When adding new types don't forget to document them in + # nixos/doc/manual/development/option-types.xml! + types = rec { + /* + Can be anything. + + Merge behavior: None; Merging is disabled. + + */ + raw = mkOptionType rec { + name = "raw"; + description = "raw value"; + descriptionClass = "noun"; + check = value: true; + merge = mergeOneOption; + }; + /* + Can be anything. + + Merge behavior: Custom Logic + */ + anything = mkOptionType { + name = "anything"; + description = "anything"; + descriptionClass = "noun"; + check = value: true; + merge = loc: defs: + let + getType = value: + if isAttrs value && isStringLike value + then "stringCoercibleSet" + else builtins.typeOf value; + + # Returns the common type of all definitions, throws an error if they + # don't have the same type + commonType = foldl' (type: def: + if getType def.value == type + then type + else throw "The option `${showOption loc}' has conflicting option types in ${showFiles (getFiles defs)}" + ) (getType (head defs).value) defs; + + mergeFunction = { + # Recursively merge attribute sets + set = (attrsOf anything).merge; + # Safe and deterministic behavior for lists is to only accept one definition + # listOf only used to apply mkIf and co. + list = + if length defs > 1 + then throw "The option `${showOption loc}' has conflicting definitions, in ${showFiles (getFiles defs)}." + else (listOf anything).merge; + # This is the type of packages, only accept a single definition + stringCoercibleSet = mergeOneOption; + lambda = loc: defs: arg: anything.merge + (loc ++ [ "" ]) + (map (def: { + file = def.file; + value = def.value arg; + }) defs); + # Otherwise fall back to only allowing all equal definitions + }.${commonType} or mergeEqualOption; + in mergeFunction loc defs; + }; + + /* + Can be anything. + + Merge behavior: Default logic + */ + unspecified = mkOptionType { + name = "unspecified"; + description = "unspecified value"; + descriptionClass = "noun"; + }; + + + /* + Allows Boolean values + + Merge behavior: Enabled; see lib.mergeEqualOption; + */ + bool = mkOptionType { + name = "bool"; + description = "boolean"; + descriptionClass = "noun"; + check = isBool; + merge = mergeEqualOption; + }; + + int = mkOptionType { + name = "int"; + description = "signed integer"; + descriptionClass = "noun"; + check = isInt; + merge = mergeEqualOption; + }; + + /* Specialized subdomains of int + + - ints.between + - ints.unsigned + - ints.u8 + - ints.u16 + - ints.u32 + - ints.s8 + - ints.s16 + - ints.s32 + + + Example: + (ints.between 0 100).check (-1) + => false + (ints.between 0 100).check (101) + => false + (ints.between 0 0).check 0 + => true + */ + ints = + let + betweenDesc = lowest: highest: + "${toString lowest} and ${toString highest} (both inclusive)"; + between = lowest: highest: + assert lib.assertMsg (lowest <= highest) + "ints.between: lowest must be smaller than highest"; + addCheck int (x: x >= lowest && x <= highest) // { + name = "intBetween"; + description = "integer between ${betweenDesc lowest highest}"; + }; + ign = lowest: highest: name: docStart: + between lowest highest // { + inherit name; + description = docStart + "; between ${betweenDesc lowest highest}"; + }; + unsign = bit: range: ign 0 (range - 1) + "unsignedInt${toString bit}" "${toString bit} bit unsigned integer"; + sign = bit: range: ign (0 - (range / 2)) (range / 2 - 1) + "signedInt${toString bit}" "${toString bit} bit signed integer"; + + in { + /* An int with a fixed range. + + Example: + (ints.between 0 100).check (-1) + => false + (ints.between 0 100).check (101) + => false + (ints.between 0 0).check 0 + => true + */ + inherit between; + + unsigned = addCheck types.int (x: x >= 0) // { + name = "unsignedInt"; + description = "unsigned integer, meaning >=0"; + }; + positive = addCheck types.int (x: x > 0) // { + name = "positiveInt"; + description = "positive integer, meaning >0"; + }; + u8 = unsign 8 256; + u16 = unsign 16 65536; + # the biggest int Nix accepts is 2^63 - 1 (9223372036854775808) + # the smallest int Nix accepts is -2^63 (-9223372036854775807) + u32 = unsign 32 4294967296; + # u64 = unsign 64 18446744073709551616; + + s8 = sign 8 256; + s16 = sign 16 65536; + s32 = sign 32 4294967296; + }; + + /* + Port number can be unsigned 16 bit + + from 0 to 65536 + + Alias of ints.u16 for a port number. -> See tye.ints for more infos. + */ + port = ints.u16; + + /* + A Float number + + For more information about validation see: lib.isFloat + + Merge behavior: Enabled; see lib.mergeEqualOption + */ + float = mkOptionType { + name = "float"; + description = "floating point number"; + descriptionClass = "noun"; + check = isFloat; + merge = mergeEqualOption; + }; + + /* + Can be either an Int or a Float + + + + */ + number = either int float; + + numbers = let + betweenDesc = lowest: highest: + "${builtins.toJSON lowest} and ${builtins.toJSON highest} (both inclusive)"; + in { + between = lowest: highest: + assert lib.assertMsg (lowest <= highest) + "numbers.between: lowest must be smaller than highest"; + addCheck number (x: x >= lowest && x <= highest) // { + name = "numberBetween"; + description = "integer or floating point number between ${betweenDesc lowest highest}"; + }; + + nonnegative = addCheck number (x: x >= 0) // { + name = "numberNonnegative"; + description = "nonnegative integer or floating point number, meaning >=0"; + }; + positive = addCheck number (x: x > 0) // { + name = "numberPositive"; + description = "positive integer or floating point number, meaning >0"; + }; + }; + + str = mkOptionType { + name = "str"; + description = "string"; + descriptionClass = "noun"; + check = isString; + merge = mergeEqualOption; + }; + + nonEmptyStr = mkOptionType { + name = "nonEmptyStr"; + description = "non-empty string"; + descriptionClass = "noun"; + check = x: str.check x && builtins.match "[ \t\n]*" x == null; + inherit (str) merge; + }; + + # Allow a newline character at the end and trim it in the merge function. + singleLineStr = + let + inherit (strMatching "[^\n\r]*\n?") check merge; + in + mkOptionType { + name = "singleLineStr"; + description = "(optionally newline-terminated) single-line string"; + descriptionClass = "noun"; + inherit check; + merge = loc: defs: + lib.removeSuffix "\n" (merge loc defs); + }; + + strMatching = pattern: mkOptionType { + name = "strMatching ${escapeNixString pattern}"; + description = "string matching the pattern ${pattern}"; + descriptionClass = "noun"; + check = x: str.check x && builtins.match pattern x != null; + inherit (str) merge; + }; + + # Merge multiple definitions by concatenating them (with the given + # separator between the values). + separatedString = sep: mkOptionType rec { + name = "separatedString"; + description = if sep == "" + then "Concatenated string" # for types.string. + else "strings concatenated with ${builtins.toJSON sep}" + ; + descriptionClass = "noun"; + check = isString; + merge = loc: defs: concatStringsSep sep (getValues defs); + functor = (defaultFunctor name) // { + payload = sep; + binOp = sepLhs: sepRhs: + if sepLhs == sepRhs then sepLhs + else null; + }; + }; + + lines = separatedString "\n"; + commas = separatedString ","; + envVar = separatedString ":"; + + # Deprecated; should not be used because it quietly concatenates + # strings, which is usually not what you want. + string = separatedString "" // { + name = "string"; + deprecationMessage = "See https://github.com/NixOS/nixpkgs/pull/66346 for better alternative types."; + }; + + passwdEntry = entryType: addCheck entryType (str: !(hasInfix ":" str || hasInfix "\n" str)) // { + name = "passwdEntry ${entryType.name}"; + description = "${optionDescriptionPhrase (class: class == "noun") entryType}, not containing newlines or colons"; + }; + + attrs = mkOptionType { + name = "attrs"; + description = "attribute set"; + check = isAttrs; + merge = loc: foldl' (res: def: res // def.value) {}; + emptyValue = { value = {}; }; + }; + + /* + A package is a top-level store path (/nix/store/hash-name). This includes: + + - derivations + - more generally, attribute sets with an `outPath` or `__toString` attribute + pointing to a store path, e.g. flake inputs + - strings with context, e.g. "${pkgs.foo}" or (toString pkgs.foo) + - hardcoded store path literals (/nix/store/hash-foo) or strings without context + ("/nix/store/hash-foo"). These get a context added to them using builtins.storePath. + */ + package = mkOptionType { + name = "package"; + descriptionClass = "noun"; + check = x: isDerivation x || isStorePath x; + merge = loc: defs: + let res = mergeOneOption loc defs; + in if builtins.isPath res || (builtins.isString res && ! builtins.hasContext res) + then toDerivation res + else res; + }; + + shellPackage = package // { + check = x: isDerivation x && hasAttr "shellPath" x; + }; + + path = mkOptionType { + name = "path"; + descriptionClass = "noun"; + check = x: isStringLike x && builtins.substring 0 1 (toString x) == "/"; + merge = mergeEqualOption; + }; + + listOf = elemType: mkOptionType rec { + name = "listOf"; + description = "list of ${optionDescriptionPhrase (class: class == "noun" || class == "composite") elemType}"; + descriptionClass = "composite"; + check = isList; + merge = loc: defs: + map (x: x.value) (filter (x: x ? value) (concatLists (imap1 (n: def: + imap1 (m: def': + (mergeDefinitions + (loc ++ ["[definition ${toString n}-entry ${toString m}]"]) + elemType + [{ inherit (def) file; value = def'; }] + ).optionalValue + ) def.value + ) defs))); + emptyValue = { value = []; }; + getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["*"]); + getSubModules = elemType.getSubModules; + substSubModules = m: listOf (elemType.substSubModules m); + functor = (defaultFunctor name) // { wrapped = elemType; }; + nestedTypes.elemType = elemType; + }; + + nonEmptyListOf = elemType: + let list = addCheck (types.listOf elemType) (l: l != []); + in list // { + description = "non-empty ${optionDescriptionPhrase (class: class == "noun") list}"; + emptyValue = { }; # no .value attr, meaning unset + }; + + attrsOf = elemType: mkOptionType rec { + name = "attrsOf"; + description = "attribute set of ${optionDescriptionPhrase (class: class == "noun" || class == "composite") elemType}"; + descriptionClass = "composite"; + check = isAttrs; + merge = loc: defs: + mapAttrs (n: v: v.value) (filterAttrs (n: v: v ? value) (zipAttrsWith (name: defs: + (mergeDefinitions (loc ++ [name]) elemType defs).optionalValue + ) + # Push down position info. + (map (def: mapAttrs (n: v: { inherit (def) file; value = v; }) def.value) defs))); + emptyValue = { value = {}; }; + getSubOptions = prefix: elemType.getSubOptions (prefix ++ [""]); + getSubModules = elemType.getSubModules; + substSubModules = m: attrsOf (elemType.substSubModules m); + functor = (defaultFunctor name) // { wrapped = elemType; }; + nestedTypes.elemType = elemType; + }; + + # A version of attrsOf that's lazy in its values at the expense of + # conditional definitions not working properly. E.g. defining a value with + # `foo.attr = mkIf false 10`, then `foo ? attr == true`, whereas with + # attrsOf it would correctly be `false`. Accessing `foo.attr` would throw an + # error that it's not defined. Use only if conditional definitions don't make sense. + lazyAttrsOf = elemType: mkOptionType rec { + name = "lazyAttrsOf"; + description = "lazy attribute set of ${optionDescriptionPhrase (class: class == "noun" || class == "composite") elemType}"; + descriptionClass = "composite"; + check = isAttrs; + merge = loc: defs: + zipAttrsWith (name: defs: + let merged = mergeDefinitions (loc ++ [name]) elemType defs; + # mergedValue will trigger an appropriate error when accessed + in merged.optionalValue.value or elemType.emptyValue.value or merged.mergedValue + ) + # Push down position info. + (map (def: mapAttrs (n: v: { inherit (def) file; value = v; }) def.value) defs); + emptyValue = { value = {}; }; + getSubOptions = prefix: elemType.getSubOptions (prefix ++ [""]); + getSubModules = elemType.getSubModules; + substSubModules = m: lazyAttrsOf (elemType.substSubModules m); + functor = (defaultFunctor name) // { wrapped = elemType; }; + nestedTypes.elemType = elemType; + }; + + # TODO: deprecate this in the future: + loaOf = elemType: types.attrsOf elemType // { + name = "loaOf"; + deprecationMessage = "Mixing lists with attribute values is no longer" + + " possible; please use `types.attrsOf` instead. See" + + " https://github.com/NixOS/nixpkgs/issues/1800 for the motivation."; + nestedTypes.elemType = elemType; + }; + + # Value of given type but with no merging (i.e. `uniq list`s are not concatenated). + uniq = elemType: mkOptionType rec { + name = "uniq"; + inherit (elemType) description descriptionClass check; + merge = mergeOneOption; + emptyValue = elemType.emptyValue; + getSubOptions = elemType.getSubOptions; + getSubModules = elemType.getSubModules; + substSubModules = m: uniq (elemType.substSubModules m); + functor = (defaultFunctor name) // { wrapped = elemType; }; + nestedTypes.elemType = elemType; + }; + + unique = { message }: type: mkOptionType rec { + name = "unique"; + inherit (type) description descriptionClass check; + merge = mergeUniqueOption { inherit message; }; + emptyValue = type.emptyValue; + getSubOptions = type.getSubOptions; + getSubModules = type.getSubModules; + substSubModules = m: uniq (type.substSubModules m); + functor = (defaultFunctor name) // { wrapped = type; }; + nestedTypes.elemType = type; + }; + + # Null or value of ... + nullOr = elemType: mkOptionType rec { + name = "nullOr"; + description = "null or ${optionDescriptionPhrase (class: class == "noun" || class == "conjunction") elemType}"; + descriptionClass = "conjunction"; + check = x: x == null || elemType.check x; + merge = loc: defs: + let nrNulls = count (def: def.value == null) defs; in + if nrNulls == length defs then null + else if nrNulls != 0 then + throw "The option `${showOption loc}` is defined both null and not null, in ${showFiles (getFiles defs)}." + else elemType.merge loc defs; + emptyValue = { value = null; }; + getSubOptions = elemType.getSubOptions; + getSubModules = elemType.getSubModules; + substSubModules = m: nullOr (elemType.substSubModules m); + functor = (defaultFunctor name) // { wrapped = elemType; }; + nestedTypes.elemType = elemType; + }; + + functionTo = elemType: mkOptionType { + name = "functionTo"; + description = "function that evaluates to a(n) ${optionDescriptionPhrase (class: class == "noun" || class == "composite") elemType}"; + descriptionClass = "composite"; + check = isFunction; + merge = loc: defs: + fnArgs: (mergeDefinitions (loc ++ [ "" ]) elemType (map (fn: { inherit (fn) file; value = fn.value fnArgs; }) defs)).mergedValue; + getSubOptions = prefix: elemType.getSubOptions (prefix ++ [ "" ]); + getSubModules = elemType.getSubModules; + substSubModules = m: functionTo (elemType.substSubModules m); + functor = (defaultFunctor "functionTo") // { wrapped = elemType; }; + nestedTypes.elemType = elemType; + }; + + # A submodule (like typed attribute set). See NixOS manual. + submodule = modules: submoduleWith { + shorthandOnlyDefinesConfig = true; + modules = toList modules; + }; + + # A module to be imported in some other part of the configuration. + deferredModule = deferredModuleWith { }; + + # A module to be imported in some other part of the configuration. + # `staticModules`' options will be added to the documentation, unlike + # options declared via `config`. + deferredModuleWith = attrs@{ staticModules ? [] }: mkOptionType { + name = "deferredModule"; + description = "module"; + descriptionClass = "noun"; + check = x: isAttrs x || isFunction x || path.check x; + merge = loc: defs: { + imports = staticModules ++ map (def: lib.setDefaultModuleLocation "${def.file}, via option ${showOption loc}" def.value) defs; + }; + inherit (submoduleWith { modules = staticModules; }) + getSubOptions + getSubModules; + substSubModules = m: deferredModuleWith (attrs // { + staticModules = m; + }); + functor = defaultFunctor "deferredModuleWith" // { + type = types.deferredModuleWith; + payload = { + inherit staticModules; + }; + binOp = lhs: rhs: { + staticModules = lhs.staticModules ++ rhs.staticModules; + }; + }; + }; + + # The type of a type! + optionType = mkOptionType { + name = "optionType"; + description = "optionType"; + descriptionClass = "noun"; + check = value: value._type or null == "option-type"; + merge = loc: defs: + if length defs == 1 + then (head defs).value + else let + # Prepares the type definitions for mergeOptionDecls, which + # annotates submodules types with file locations + optionModules = map ({ value, file }: + { + _file = file; + # There's no way to merge types directly from the module system, + # but we can cheat a bit by just declaring an option with the type + options = lib.mkOption { + type = value; + }; + } + ) defs; + # Merges all the types into a single one, including submodule merging. + # This also propagates file information to all submodules + mergedOption = fixupOptionType loc (mergeOptionDecls loc optionModules); + in mergedOption.type; + }; + + submoduleWith = + { modules + , specialArgs ? {} + , shorthandOnlyDefinesConfig ? false + , description ? null + }@attrs: + let + inherit (lib.modules) evalModules; + + allModules = defs: map ({ value, file }: + if isAttrs value && shorthandOnlyDefinesConfig + then { _file = file; config = value; } + else { _file = file; imports = [ value ]; } + ) defs; + + base = evalModules { + inherit specialArgs; + modules = [{ + # This is a work-around for the fact that some sub-modules, + # such as the one included in an attribute set, expects an "args" + # attribute to be given to the sub-module. As the option + # evaluation does not have any specific attribute name yet, we + # provide a default for the documentation and the freeform type. + # + # This is necessary as some option declaration might use the + # "name" attribute given as argument of the submodule and use it + # as the default of option declarations. + # + # We use lookalike unicode single angle quotation marks because + # of the docbook transformation the options receive. In all uses + # > and < wouldn't be encoded correctly so the encoded values + # would be used, and use of `<` and `>` would break the XML document. + # It shouldn't cause an issue since this is cosmetic for the manual. + _module.args.name = lib.mkOptionDefault "‹name›"; + }] ++ modules; + }; + + freeformType = base._module.freeformType; + + name = "submodule"; + + in + mkOptionType { + inherit name; + description = + if description != null then description + else freeformType.description or name; + check = x: isAttrs x || isFunction x || path.check x; + merge = loc: defs: + (base.extendModules { + modules = [ { _module.args.name = last loc; } ] ++ allModules defs; + prefix = loc; + }).config; + emptyValue = { value = {}; }; + getSubOptions = prefix: (base.extendModules + { inherit prefix; }).options // optionalAttrs (freeformType != null) { + # Expose the sub options of the freeform type. Note that the option + # discovery doesn't care about the attribute name used here, so this + # is just to avoid conflicts with potential options from the submodule + _freeformOptions = freeformType.getSubOptions prefix; + }; + getSubModules = modules; + substSubModules = m: submoduleWith (attrs // { + modules = m; + }); + nestedTypes = lib.optionalAttrs (freeformType != null) { + freeformType = freeformType; + }; + functor = defaultFunctor name // { + type = types.submoduleWith; + payload = { + inherit modules specialArgs shorthandOnlyDefinesConfig description; + }; + binOp = lhs: rhs: { + modules = lhs.modules ++ rhs.modules; + specialArgs = + let intersecting = builtins.intersectAttrs lhs.specialArgs rhs.specialArgs; + in if intersecting == {} + then lhs.specialArgs // rhs.specialArgs + else throw "A submoduleWith option is declared multiple times with the same specialArgs \"${toString (attrNames intersecting)}\""; + shorthandOnlyDefinesConfig = + if lhs.shorthandOnlyDefinesConfig == null + then rhs.shorthandOnlyDefinesConfig + else if rhs.shorthandOnlyDefinesConfig == null + then lhs.shorthandOnlyDefinesConfig + else if lhs.shorthandOnlyDefinesConfig == rhs.shorthandOnlyDefinesConfig + then lhs.shorthandOnlyDefinesConfig + else throw "A submoduleWith option is declared multiple times with conflicting shorthandOnlyDefinesConfig values"; + description = + if lhs.description == null + then rhs.description + else if rhs.description == null + then lhs.description + else if lhs.description == rhs.description + then lhs.description + else throw "A submoduleWith option is declared multiple times with conflicting descriptions"; + }; + }; + }; + + # A value from a set of allowed ones. + enum = values: + let + inherit (lib.lists) unique; + show = v: + if builtins.isString v then ''"${v}"'' + else if builtins.isInt v then builtins.toString v + else if builtins.isBool v then boolToString v + else ''<${builtins.typeOf v}>''; + in + mkOptionType rec { + name = "enum"; + description = + # Length 0 or 1 enums may occur in a design pattern with type merging + # where an "interface" module declares an empty enum and other modules + # provide implementations, each extending the enum with their own + # identifier. + if values == [] then + "impossible (empty enum)" + else if builtins.length values == 1 then + "value ${show (builtins.head values)} (singular enum)" + else + "one of ${concatMapStringsSep ", " show values}"; + descriptionClass = + if builtins.length values < 2 + then "noun" + else "conjunction"; + check = flip elem values; + merge = mergeEqualOption; + functor = (defaultFunctor name) // { payload = values; binOp = a: b: unique (a ++ b); }; + }; + + # Either value of type `t1` or `t2`. + either = t1: t2: mkOptionType rec { + name = "either"; + description = "${optionDescriptionPhrase (class: class == "noun" || class == "conjunction") t1} or ${optionDescriptionPhrase (class: class == "noun" || class == "conjunction" || class == "composite") t2}"; + descriptionClass = "conjunction"; + check = x: t1.check x || t2.check x; + merge = loc: defs: + let + defList = map (d: d.value) defs; + in + if all (x: t1.check x) defList + then t1.merge loc defs + else if all (x: t2.check x) defList + then t2.merge loc defs + else mergeOneOption loc defs; + typeMerge = f': + let mt1 = t1.typeMerge (elemAt f'.wrapped 0).functor; + mt2 = t2.typeMerge (elemAt f'.wrapped 1).functor; + in + if (name == f'.name) && (mt1 != null) && (mt2 != null) + then functor.type mt1 mt2 + else null; + functor = (defaultFunctor name) // { wrapped = [ t1 t2 ]; }; + nestedTypes.left = t1; + nestedTypes.right = t2; + }; + + # Any of the types in the given list + oneOf = ts: + let + head' = if ts == [] then throw "types.oneOf needs to get at least one type in its argument" else head ts; + tail' = tail ts; + in foldl' either head' tail'; + + # Either value of type `coercedType` or `finalType`, the former is + # converted to `finalType` using `coerceFunc`. + coercedTo = coercedType: coerceFunc: finalType: + assert lib.assertMsg (coercedType.getSubModules == null) + "coercedTo: coercedType must not have submodules (it’s a ${ + coercedType.description})"; + mkOptionType rec { + name = "coercedTo"; + description = "${optionDescriptionPhrase (class: class == "noun") finalType} or ${optionDescriptionPhrase (class: class == "noun") coercedType} convertible to it"; + check = x: (coercedType.check x && finalType.check (coerceFunc x)) || finalType.check x; + merge = loc: defs: + let + coerceVal = val: + if coercedType.check val then coerceFunc val + else val; + in finalType.merge loc (map (def: def // { value = coerceVal def.value; }) defs); + emptyValue = finalType.emptyValue; + getSubOptions = finalType.getSubOptions; + getSubModules = finalType.getSubModules; + substSubModules = m: coercedTo coercedType coerceFunc (finalType.substSubModules m); + typeMerge = t1: t2: null; + functor = (defaultFunctor name) // { wrapped = finalType; }; + nestedTypes.coercedType = coercedType; + nestedTypes.finalType = finalType; + }; + + # Augment the given type with an additional type check function. + addCheck = elemType: check: elemType // { check = x: elemType.check x && check x; }; + + }; +}; + +in outer_types // outer_types.types diff --git a/nix_systems b/nix_systems deleted file mode 100644 index 9bdfd5f..0000000 --- a/nix_systems +++ /dev/null @@ -1 +0,0 @@ -x86_64-linux \ No newline at end of file diff --git a/projects.toml b/projects.toml index 479502c..08d0cf2 100644 --- a/projects.toml +++ b/projects.toml @@ -32,3 +32,26 @@ workspaceMembers = [] name = "indexer" relPath = "indexer" version = "0.1.0" + +[builtins-data] +name = "builtins-data" +relPath = "scripts" +subsystem = "nodejs" +translator = "package-lock" +builder = "strict-builder" +translators = ["package-lock", "package-json"] + +[builtins-data.subsystemInfo] +nodejs = 18 + + +[tests] +name = "tests" +relPath = "tests" +subsystem = "nodejs" +translator = "package-lock" +builder = "strict-builder" +translators = ["package-lock", "package-json"] + +[tests.subsystemInfo] +nodejs = 18 diff --git a/scripts/.gitignore b/scripts/.gitignore new file mode 100644 index 0000000..809ffcf --- /dev/null +++ b/scripts/.gitignore @@ -0,0 +1,2 @@ +data.json +node_modules \ No newline at end of file diff --git a/website/scripts/data/builtins.json b/scripts/data/builtins.json similarity index 100% rename from website/scripts/data/builtins.json rename to scripts/data/builtins.json diff --git a/website/scripts/data/builtins.types.json b/scripts/data/builtins.types.json similarity index 100% rename from website/scripts/data/builtins.types.json rename to scripts/data/builtins.types.json diff --git a/website/scripts/data/derivation-doc.txt b/scripts/data/derivation-doc.txt similarity index 100% rename from website/scripts/data/derivation-doc.txt rename to scripts/data/derivation-doc.txt diff --git a/website/scripts/data/derivation-signature.txt b/scripts/data/derivation-signature.txt similarity index 100% rename from website/scripts/data/derivation-signature.txt rename to scripts/data/derivation-signature.txt diff --git a/website/scripts/data/derivation.json b/scripts/data/derivation.json similarity index 100% rename from website/scripts/data/derivation.json rename to scripts/data/derivation.json diff --git a/website/scripts/make-builtins.js b/scripts/make-builtins.js similarity index 91% rename from website/scripts/make-builtins.js rename to scripts/make-builtins.js index 20b5c8a..8ed5a8a 100755 --- a/website/scripts/make-builtins.js +++ b/scripts/make-builtins.js @@ -24,7 +24,7 @@ if (!DATA_PATH) { ], }; }); - fs.writeFile(`${DATA_PATH}/builtins.json`, JSON.stringify(info), (err) => { + fs.writeFile(`${DATA_PATH}/data.json`, JSON.stringify(info), (err) => { if (err) { console.error(err); } diff --git a/scripts/package.json b/scripts/package.json new file mode 100644 index 0000000..40e5309 --- /dev/null +++ b/scripts/package.json @@ -0,0 +1,11 @@ +{ + "name": "builtins-data", + "version": "1.0.0", + "description": "", + "main": "make-builtins.js", + "scripts": { + "build": "node ./make-builtins.js ./" + }, + "author": "", + "license": "ISC" +} diff --git a/tests/.gitignore b/tests/.gitignore new file mode 100644 index 0000000..e503ddd --- /dev/null +++ b/tests/.gitignore @@ -0,0 +1,3 @@ + +node_modules +data/* \ No newline at end of file diff --git a/tests/__snapshots__/data.test.js.snap b/tests/__snapshots__/data.test.js.snap new file mode 100644 index 0000000..88d5a29 --- /dev/null +++ b/tests/__snapshots__/data.test.js.snap @@ -0,0 +1,4160 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`confirm data update 1`] = ` +[ + { + "category": "./lib/versions.nix", + "description": "Break a version string into its component parts.", + "example": "splitVersion "1.2.3" +=> ["1" "2" "3"]", + "fn_type": null, + "id": "lib.versions.splitVersion", + "line": 12, + "name": "splitVersion", + }, + { + "category": "./lib/versions.nix", + "description": "Get the major version string from a string.", + "example": "major "1.2.3" +=> "1"", + "fn_type": null, + "id": "lib.versions.major", + "line": 20, + "name": "major", + }, + { + "category": "./lib/versions.nix", + "description": "Get the minor version string from a string.", + "example": "minor "1.2.3" +=> "2"", + "fn_type": null, + "id": "lib.versions.minor", + "line": 28, + "name": "minor", + }, + { + "category": "./lib/versions.nix", + "description": "Get the patch version string from a string.", + "example": "patch "1.2.3" +=> "3"", + "fn_type": null, + "id": "lib.versions.patch", + "line": 36, + "name": "patch", + }, + { + "category": "./lib/versions.nix", + "description": "Get string of the first two parts (major and minor) + of a version string.", + "example": "majorMinor "1.2.3" +=> "1.2"", + "fn_type": null, + "id": "lib.versions.majorMinor", + "line": 45, + "name": "majorMinor", + }, + { + "category": "./lib/versions.nix", + "description": "Pad a version string with zeros to match the given number of components.", + "example": "pad 3 "1.2" +=> "1.2.0" +pad 3 "1.3-rc1" +=> "1.3.0-rc1" +pad 3 "1.2.3.4" +=> "1.2.3"", + "fn_type": null, + "id": "lib.versions.pad", + "line": 59, + "name": "pad", + }, + { + "category": "./lib/trivial.nix", + "description": "The identity function + For when you need a function that does “nothing”.", + "example": null, + "fn_type": "id :: a -> a", + "id": "lib.trivial.id", + "line": 13, + "name": "id", + }, + { + "category": "./lib/trivial.nix", + "description": "The constant function + + Ignores the second argument. If called with only one argument, + constructs a function that always returns a static value.", + "example": "let f = const 5; in f 10 +=> 5", + "fn_type": "const :: a -> b -> a", + "id": "lib.trivial.const", + "line": 26, + "name": "const", + }, + { + "category": "./lib/trivial.nix", + "description": "Pipes a value through a list of functions, left to right.", + "example": "pipe 2 [ + (x: x + 2) # 2 + 2 = 4 + (x: x * 2) # 4 * 2 = 8 +] +=> 8 + +# ideal to do text transformations +pipe [ "a/b" "a/c" ] [ + + # create the cp command + (map (file: ''cp "\${src}/\${file}" $out\\n'')) + + # concatenate all commands into one string + lib.concatStrings + + # make that string into a nix derivation + (pkgs.runCommand "copy-to-out" {}) + +] +=> + + The output type of each function has to be the input type + of the next function, and the last function returns the + final value.", + "fn_type": "pipe :: a -> [] -> ", + "id": "lib.trivial.pipe", + "line": 61, + "name": "pipe", + }, + { + "category": "./lib/trivial.nix", + "description": "Concatenate two lists", + "example": "concat [ 1 2 ] [ 3 4 ] +=> [ 1 2 3 4 ]", + "fn_type": "concat :: [a] -> [a] -> [a]", + "id": "lib.trivial.concat", + "line": 80, + "name": "concat", + }, + { + "category": "./lib/trivial.nix", + "description": "boolean “or”", + "example": null, + "fn_type": null, + "id": "lib.trivial.or", + "line": 83, + "name": "or", + }, + { + "category": "./lib/trivial.nix", + "description": "boolean “and”", + "example": null, + "fn_type": null, + "id": "lib.trivial.and", + "line": 86, + "name": "and", + }, + { + "category": "./lib/trivial.nix", + "description": "bitwise “and”", + "example": null, + "fn_type": null, + "id": "lib.trivial.bitAnd", + "line": 89, + "name": "bitAnd", + }, + { + "category": "./lib/trivial.nix", + "description": "bitwise “or”", + "example": null, + "fn_type": null, + "id": "lib.trivial.bitOr", + "line": 95, + "name": "bitOr", + }, + { + "category": "./lib/trivial.nix", + "description": "bitwise “xor”", + "example": null, + "fn_type": null, + "id": "lib.trivial.bitXor", + "line": 100, + "name": "bitXor", + }, + { + "category": "./lib/trivial.nix", + "description": "bitwise “not”", + "example": null, + "fn_type": null, + "id": "lib.trivial.bitNot", + "line": 106, + "name": "bitNot", + }, + { + "category": "./lib/trivial.nix", + "description": "Convert a boolean to a string. + + This function uses the strings "true" and "false" to represent + boolean values. Calling \`toString\` on a bool instead returns "1" + and "" (sic!).", + "example": null, + "fn_type": "boolToString :: bool -> string", + "id": "lib.trivial.boolToString", + "line": 114, + "name": "boolToString", + }, + { + "category": "./lib/trivial.nix", + "description": "Merge two attribute sets shallowly, right side trumps left + + mergeAttrs :: attrs -> attrs -> attrs", + "example": "mergeAttrs { a = 1; b = 2; } { b = 3; c = 4; } +=> { a = 1; b = 3; c = 4; }", + "fn_type": null, + "id": "lib.trivial.mergeAttrs", + "line": 125, + "name": "mergeAttrs", + }, + { + "category": "./lib/trivial.nix", + "description": "Flip the order of the arguments of a binary function.", + "example": "flip concat [1] [2] +=> [ 2 1 ]", + "fn_type": "flip :: (a -> b -> c) -> (b -> a -> c)", + "id": "lib.trivial.flip", + "line": 140, + "name": "flip", + }, + { + "category": "./lib/trivial.nix", + "description": "Apply function if the supplied argument is non-null.", + "example": "mapNullable (x: x+1) null +=> null +mapNullable (x: x+1) 22 +=> 23", + "fn_type": null, + "id": "lib.trivial.mapNullable", + "line": 149, + "name": "mapNullable", + }, + { + "category": "./lib/trivial.nix", + "description": "Returns the current full nixpkgs version number.", + "example": null, + "fn_type": null, + "id": "lib.trivial.version", + "line": 164, + "name": "version", + }, + { + "category": "./lib/trivial.nix", + "description": "Returns the current nixpkgs release number as string.", + "example": null, + "fn_type": null, + "id": "lib.trivial.release", + "line": 167, + "name": "release", + }, + { + "category": "./lib/trivial.nix", + "description": "The latest release that is supported, at the time of release branch-off, + if applicable. + + Ideally, out-of-tree modules should be able to evaluate cleanly with all + supported Nixpkgs versions (master, release and old release until EOL). + So if possible, deprecation warnings should take effect only when all + out-of-tree expressions/libs/modules can upgrade to the new way without + losing support for supported Nixpkgs versions. + + This release number allows deprecation warnings to be implemented such that + they take effect as soon as the oldest release reaches end of life.", + "example": null, + "fn_type": null, + "id": "lib.trivial.oldestSupportedRelease", + "line": 181, + "name": "oldestSupportedRelease", + }, + { + "category": "./lib/trivial.nix", + "description": "Whether a feature is supported in all supported releases (at the time of + release branch-off, if applicable). See \`oldestSupportedRelease\`.", + "example": null, + "fn_type": null, + "id": "lib.trivial.isInOldestRelease", + "line": 187, + "name": "isInOldestRelease", + }, + { + "category": "./lib/trivial.nix", + "description": "Returns the current nixpkgs release code name. + + On each release the first letter is bumped and a new animal is chosen + starting with that new letter.", + "example": null, + "fn_type": null, + "id": "lib.trivial.codeName", + "line": 200, + "name": "codeName", + }, + { + "category": "./lib/trivial.nix", + "description": "Returns the current nixpkgs version suffix as string.", + "example": null, + "fn_type": null, + "id": "lib.trivial.versionSuffix", + "line": 202, + "name": "versionSuffix", + }, + { + "category": "./lib/trivial.nix", + "description": "Attempts to return the the current revision of nixpkgs and + returns the supplied default value otherwise.", + "example": null, + "fn_type": "revisionWithDefault :: string -> string", + "id": "lib.trivial.revisionWithDefault", + "line": 213, + "name": "revisionWithDefault", + }, + { + "category": "./lib/trivial.nix", + "description": "Determine whether the function is being called from inside a Nix + shell.", + "example": null, + "fn_type": "inNixShell :: bool", + "id": "lib.trivial.inNixShell", + "line": 230, + "name": "inNixShell", + }, + { + "category": "./lib/trivial.nix", + "description": "Determine whether the function is being called from inside pure-eval mode + by seeing whether \`builtins\` contains \`currentSystem\`. If not, we must be in + pure-eval mode.", + "example": null, + "fn_type": "inPureEvalMode :: bool", + "id": "lib.trivial.inPureEvalMode", + "line": 238, + "name": "inPureEvalMode", + }, + { + "category": "./lib/trivial.nix", + "description": "Return minimum of two numbers.", + "example": null, + "fn_type": null, + "id": "lib.trivial.min", + "line": 243, + "name": "min", + }, + { + "category": "./lib/trivial.nix", + "description": "Return maximum of two numbers.", + "example": null, + "fn_type": null, + "id": "lib.trivial.max", + "line": 246, + "name": "max", + }, + { + "category": "./lib/trivial.nix", + "description": "Integer modulus", + "example": "mod 11 10 +=> 1 +mod 1 10 +=> 1", + "fn_type": null, + "id": "lib.trivial.mod", + "line": 256, + "name": "mod", + }, + { + "category": "./lib/trivial.nix", + "description": "C-style comparisons + + a < b, compare a b => -1 + a == b, compare a b => 0 + a > b, compare a b => 1", + "example": null, + "fn_type": null, + "id": "lib.trivial.compare", + "line": 269, + "name": "compare", + }, + { + "category": "./lib/trivial.nix", + "description": "Split type into two subtypes by predicate \`p\`, take all elements + of the first subtype to be less than all the elements of the + second subtype, compare elements of a single subtype with \`yes\` + and \`no\` respectively.", + "example": "let cmp = splitByAndCompare (hasPrefix "foo") compare compare; in + +cmp "a" "z" => -1 +cmp "fooa" "fooz" => -1 + +cmp "f" "a" => 1 +cmp "fooa" "a" => -1 +# while +compare "fooa" "a" => 1", + "fn_type": "(a -> bool) -> (a -> a -> int) -> (a -> a -> int) -> (a -> a -> int)", + "id": "lib.trivial.splitByAndCompare", + "line": 293, + "name": "splitByAndCompare", + }, + { + "category": "./lib/trivial.nix", + "description": "Reads a JSON file. + + Type :: path -> any", + "example": null, + "fn_type": null, + "id": "lib.trivial.importJSON", + "line": 313, + "name": "importJSON", + }, + { + "category": "./lib/trivial.nix", + "description": "Reads a TOML file. + + Type :: path -> any", + "example": null, + "fn_type": null, + "id": "lib.trivial.importTOML", + "line": 320, + "name": "importTOML", + }, + { + "category": "./lib/trivial.nix", + "description": "Print a warning before returning the second argument. This function behaves +like \`builtins.trace\`, but requires a string message and formats it as a +warning, including the \`warning: \` prefix. + +To get a call stack trace and abort evaluation, set the environment variable +\`NIX_ABORT_ON_WARN=true\` and set the Nix options \`--option pure-eval false --show-trace\`", + "example": null, + "fn_type": "string -> a -> a", + "id": "lib.trivial.warn", + "line": 348, + "name": "warn", + }, + { + "category": "./lib/trivial.nix", + "description": "Like warn, but only warn when the first argument is \`true\`.", + "example": null, + "fn_type": "bool -> string -> a -> a", + "id": "lib.trivial.warnIf", + "line": 357, + "name": "warnIf", + }, + { + "category": "./lib/trivial.nix", + "description": "Like warnIf, but negated (warn if the first argument is \`false\`).", + "example": null, + "fn_type": "bool -> string -> a -> a", + "id": "lib.trivial.warnIfNot", + "line": 364, + "name": "warnIfNot", + }, + { + "category": "./lib/trivial.nix", + "description": "Like the \`assert b; e\` expression, but with a custom error message and +without the semicolon. + +If true, return the identity function, \`r: r\`. + +If false, throw the error message. + +Calls can be juxtaposed using function application, as \`(r: r) a = a\`, so +\`(r: r) (r: r) a = a\`, and so forth.", + "example": "throwIfNot (lib.isList overlays) "The overlays argument to nixpkgs must be a list." +lib.foldr (x: throwIfNot (lib.isFunction x) "All overlays passed to nixpkgs must be functions.") (r: r) overlays +pkgs", + "fn_type": "bool -> string -> a -> a", + "id": "lib.trivial.throwIfNot", + "line": 386, + "name": "throwIfNot", + }, + { + "category": "./lib/trivial.nix", + "description": "Like throwIfNot, but negated (throw if the first argument is \`true\`).", + "example": null, + "fn_type": "bool -> string -> a -> a", + "id": "lib.trivial.throwIf", + "line": 393, + "name": "throwIf", + }, + { + "category": "./lib/trivial.nix", + "description": "Check if the elements in a list are valid values from a enum, returning the identity function, or throwing an error message otherwise.", + "example": "let colorVariants = ["bright" "dark" "black"] +in checkListOfEnum "color variants" [ "standard" "light" "dark" ] colorVariants; +=> +error: color variants: bright, black unexpected; valid ones: standard, light, dark", + "fn_type": "String -> List ComparableVal -> List ComparableVal -> a -> a", + "id": "lib.trivial.checkListOfEnum", + "line": 405, + "name": "checkListOfEnum", + }, + { + "category": "./lib/trivial.nix", + "description": "Add metadata about expected function arguments to a function. + The metadata should match the format given by + builtins.functionArgs, i.e. a set from expected argument to a bool + representing whether that argument has a default or not. + setFunctionArgs : (a → b) → Map String Bool → (a → b) + + This function is necessary because you can't dynamically create a + function of the { a, b ? foo, ... }: format, but some facilities + like callPackage expect to be able to query expected arguments.", + "example": null, + "fn_type": null, + "id": "lib.trivial.setFunctionArgs", + "line": 429, + "name": "setFunctionArgs", + }, + { + "category": "./lib/trivial.nix", + "description": "Extract the expected function arguments from a function. + This works both with nix-native { a, b ? foo, ... }: style + functions and functions with args set with 'setFunctionArgs'. It + has the same return type and semantics as builtins.functionArgs. + setFunctionArgs : (a → b) → Map String Bool.", + "example": null, + "fn_type": null, + "id": "lib.trivial.functionArgs", + "line": 442, + "name": "functionArgs", + }, + { + "category": "./lib/trivial.nix", + "description": "Check whether something is a function or something + annotated with function args.", + "example": null, + "fn_type": null, + "id": "lib.trivial.isFunction", + "line": 449, + "name": "isFunction", + }, + { + "category": "./lib/trivial.nix", + "description": "Turns any non-callable values into constant functions. +Returns callable values as is.", + "example": "nix-repl> lib.toFunction 1 2 +1 + +nix-repl> lib.toFunction (x: x + 1) 2 +3", + "fn_type": null, + "id": "lib.trivial.toFunction", + "line": 466, + "name": "toFunction", + }, + { + "category": "./lib/trivial.nix", + "description": "Convert the given positive integer to a string of its hexadecimal + representation. For example: + + toHexString 0 => "0" + + toHexString 16 => "10" + + toHexString 250 => "FA"", + "example": null, + "fn_type": null, + "id": "lib.trivial.toHexString", + "line": 481, + "name": "toHexString", + }, + { + "category": "./lib/trivial.nix", + "description": "\`toBaseDigits base i\` converts the positive integer i to a list of its + digits in the given base. For example: + + toBaseDigits 10 123 => [ 1 2 3 ] + + toBaseDigits 2 6 => [ 1 1 0 ] + + toBaseDigits 16 250 => [ 15 10 ]", + "example": null, + "fn_type": null, + "id": "lib.trivial.toBaseDigits", + "line": 507, + "name": "toBaseDigits", + }, + { + "category": "./lib/strings.nix", + "description": "Concatenate a list of strings.", + "example": "concatStrings ["foo" "bar"] +=> "foobar"", + "fn_type": "concatStrings :: [string] -> string", + "id": "lib.strings.concatStrings", + "line": 45, + "name": "concatStrings", + }, + { + "category": "./lib/strings.nix", + "description": "Map a function over a list and concatenate the resulting strings.", + "example": "concatMapStrings (x: "a" + x) ["foo" "bar"] +=> "afooabar"", + "fn_type": "concatMapStrings :: (a -> string) -> [a] -> string", + "id": "lib.strings.concatMapStrings", + "line": 55, + "name": "concatMapStrings", + }, + { + "category": "./lib/strings.nix", + "description": "Like \`concatMapStrings\` except that the f functions also gets the + position as a parameter.", + "example": "concatImapStrings (pos: x: "\${toString pos}-\${x}") ["foo" "bar"] +=> "1-foo2-bar"", + "fn_type": "concatImapStrings :: (int -> a -> string) -> [a] -> string", + "id": "lib.strings.concatImapStrings", + "line": 66, + "name": "concatImapStrings", + }, + { + "category": "./lib/strings.nix", + "description": "Place an element between each element of a list", + "example": "intersperse "/" ["usr" "local" "bin"] +=> ["usr" "/" "local" "/" "bin"].", + "fn_type": "intersperse :: a -> [a] -> [a]", + "id": "lib.strings.intersperse", + "line": 76, + "name": "intersperse", + }, + { + "category": "./lib/strings.nix", + "description": "Concatenate a list of strings with a separator between each element", + "example": "concatStringsSep "/" ["usr" "local" "bin"] +=> "usr/local/bin"", + "fn_type": "concatStringsSep :: string -> [string] -> string", + "id": "lib.strings.concatStringsSep", + "line": 93, + "name": "concatStringsSep", + }, + { + "category": "./lib/strings.nix", + "description": "Maps a function over a list of strings and then concatenates the + result with the specified separator interspersed between + elements.", + "example": "concatMapStringsSep "-" (x: toUpper x) ["foo" "bar" "baz"] +=> "FOO-BAR-BAZ"", + "fn_type": "concatMapStringsSep :: string -> (a -> string) -> [a] -> string", + "id": "lib.strings.concatMapStringsSep", + "line": 106, + "name": "concatMapStringsSep", + }, + { + "category": "./lib/strings.nix", + "description": "Same as \`concatMapStringsSep\`, but the mapping function + additionally receives the position of its argument.", + "example": "concatImapStringsSep "-" (pos: x: toString (x / pos)) [ 6 6 6 ] +=> "6-3-2"", + "fn_type": "concatIMapStringsSep :: string -> (int -> a -> string) -> [a] -> string", + "id": "lib.strings.concatImapStringsSep", + "line": 123, + "name": "concatImapStringsSep", + }, + { + "category": "./lib/strings.nix", + "description": "Concatenate a list of strings, adding a newline at the end of each one. + Defined as \`concatMapStrings (s: s + "\\n")\`.", + "example": "concatLines [ "foo" "bar" ] +=> "foo\\nbar\\n"", + "fn_type": "concatLines :: [string] -> string", + "id": "lib.strings.concatLines", + "line": 140, + "name": "concatLines", + }, + { + "category": "./lib/strings.nix", + "description": "Construct a Unix-style, colon-separated search path consisting of + the given \`subDir\` appended to each of the given paths.", + "example": "makeSearchPath "bin" ["/root" "/usr" "/usr/local"] +=> "/root/bin:/usr/bin:/usr/local/bin" +makeSearchPath "bin" [""] +=> "/bin"", + "fn_type": "makeSearchPath :: string -> [string] -> string", + "id": "lib.strings.makeSearchPath", + "line": 153, + "name": "makeSearchPath", + }, + { + "category": "./lib/strings.nix", + "description": "Construct a Unix-style search path by appending the given + \`subDir\` to the specified \`output\` of each of the packages. If no + output by the given name is found, fallback to \`.out\` and then to + the default.", + "example": "makeSearchPathOutput "dev" "bin" [ pkgs.openssl pkgs.zlib ] +=> "/nix/store/9rz8gxhzf8sw4kf2j2f1grr49w8zx5vj-openssl-1.0.1r-dev/bin:/nix/store/wwh7mhwh269sfjkm6k5665b5kgp7jrk2-zlib-1.2.8/bin"", + "fn_type": "string -> string -> [package] -> string", + "id": "lib.strings.makeSearchPathOutput", + "line": 171, + "name": "makeSearchPathOutput", + }, + { + "category": "./lib/strings.nix", + "description": "Construct a library search path (such as RPATH) containing the + libraries for a set of packages", + "example": "makeLibraryPath [ "/usr" "/usr/local" ] +=> "/usr/lib:/usr/local/lib" +pkgs = import { } +makeLibraryPath [ pkgs.openssl pkgs.zlib ] +=> "/nix/store/9rz8gxhzf8sw4kf2j2f1grr49w8zx5vj-openssl-1.0.1r/lib:/nix/store/wwh7mhwh269sfjkm6k5665b5kgp7jrk2-zlib-1.2.8/lib"", + "fn_type": null, + "id": "lib.strings.makeLibraryPath", + "line": 189, + "name": "makeLibraryPath", + }, + { + "category": "./lib/strings.nix", + "description": "Construct a binary search path (such as $PATH) containing the + binaries for a set of packages.", + "example": "makeBinPath ["/root" "/usr" "/usr/local"] +=> "/root/bin:/usr/bin:/usr/local/bin"", + "fn_type": null, + "id": "lib.strings.makeBinPath", + "line": 198, + "name": "makeBinPath", + }, + { + "category": "./lib/strings.nix", + "description": "Normalize path, removing extraneous /s", + "example": "normalizePath "/a//b///c/" +=> "/a/b/c/"", + "fn_type": "normalizePath :: string -> string", + "id": "lib.strings.normalizePath", + "line": 208, + "name": "normalizePath", + }, + { + "category": "./lib/strings.nix", + "description": "Depending on the boolean \`cond', return either the given string + or the empty string. Useful to concatenate against a bigger string.", + "example": "optionalString true "some-string" +=> "some-string" +optionalString false "some-string" +=> """, + "fn_type": "optionalString :: bool -> string -> string", + "id": "lib.strings.optionalString", + "line": 221, + "name": "optionalString", + }, + { + "category": "./lib/strings.nix", + "description": "Determine whether a string has given prefix.", + "example": "hasPrefix "foo" "foobar" +=> true +hasPrefix "foo" "barfoo" +=> false", + "fn_type": "hasPrefix :: string -> string -> bool", + "id": "lib.strings.hasPrefix", + "line": 237, + "name": "hasPrefix", + }, + { + "category": "./lib/strings.nix", + "description": "Determine whether a string has given suffix.", + "example": "hasSuffix "foo" "foobar" +=> false +hasSuffix "foo" "barfoo" +=> true", + "fn_type": "hasSuffix :: string -> string -> bool", + "id": "lib.strings.hasSuffix", + "line": 253, + "name": "hasSuffix", + }, + { + "category": "./lib/strings.nix", + "description": "Determine whether a string contains the given infix", + "example": "hasInfix "bc" "abcd" +=> true +hasInfix "ab" "abcd" +=> true +hasInfix "cd" "abcd" +=> true +hasInfix "foo" "abcd" +=> false", + "fn_type": "hasInfix :: string -> string -> bool", + "id": "lib.strings.hasInfix", + "line": 278, + "name": "hasInfix", + }, + { + "category": "./lib/strings.nix", + "description": "Convert a string to a list of characters (i.e. singleton strings). + This allows you to, e.g., map a function over each character. However, + note that this will likely be horribly inefficient; Nix is not a + general purpose programming language. Complex string manipulations + should, if appropriate, be done in a derivation. + Also note that Nix treats strings as a list of bytes and thus doesn't + handle unicode.", + "example": "stringToCharacters "" +=> [ ] +stringToCharacters "abc" +=> [ "a" "b" "c" ] +stringToCharacters "🦄" +=> [ "�" "�" "�" "�" ]", + "fn_type": "stringToCharacters :: string -> [string]", + "id": "lib.strings.stringToCharacters", + "line": 299, + "name": "stringToCharacters", + }, + { + "category": "./lib/strings.nix", + "description": "Manipulate a string character by character and replace them by + strings before concatenating the results.", + "example": "stringAsChars (x: if x == "a" then "i" else x) "nax" +=> "nix"", + "fn_type": "stringAsChars :: (string -> string) -> string -> string", + "id": "lib.strings.stringAsChars", + "line": 311, + "name": "stringAsChars", + }, + { + "category": "./lib/strings.nix", + "description": "Convert char to ascii value, must be in printable range", + "example": "charToInt "A" +=> 65 +charToInt "(" +=> 40", + "fn_type": "charToInt :: string -> int", + "id": "lib.strings.charToInt", + "line": 330, + "name": "charToInt", + }, + { + "category": "./lib/strings.nix", + "description": "Escape occurrence of the elements of \`list\` in \`string\` by + prefixing it with a backslash.", + "example": "escape ["(" ")"] "(foo)" +=> "\\\\(foo\\\\)"", + "fn_type": "escape :: [string] -> string -> string", + "id": "lib.strings.escape", + "line": 343, + "name": "escape", + }, + { + "category": "./lib/strings.nix", + "description": "Escape occurrence of the element of \`list\` in \`string\` by + converting to its ASCII value and prefixing it with \\\\x. + Only works for printable ascii characters.", + "example": "escapeC [" "] "foo bar" +=> "foo\\\\x20bar"", + "fn_type": "escapeC = [string] -> string -> string", + "id": "lib.strings.escapeC", + "line": 356, + "name": "escapeC", + }, + { + "category": "./lib/strings.nix", + "description": "Quote string to be used safely within the Bourne shell.", + "example": "escapeShellArg "esc'ape\\nme" +=> "'esc'\\\\''ape\\nme'"", + "fn_type": "escapeShellArg :: string -> string", + "id": "lib.strings.escapeShellArg", + "line": 366, + "name": "escapeShellArg", + }, + { + "category": "./lib/strings.nix", + "description": "Quote all arguments to be safely passed to the Bourne shell.", + "example": "escapeShellArgs ["one" "two three" "four'five"] +=> "'one' 'two three' 'four'\\\\''five'"", + "fn_type": "escapeShellArgs :: [string] -> string", + "id": "lib.strings.escapeShellArgs", + "line": 376, + "name": "escapeShellArgs", + }, + { + "category": "./lib/strings.nix", + "description": "Test whether the given name is a valid POSIX shell variable name.", + "example": "isValidPosixName "foo_bar000" +=> true +isValidPosixName "0-bad.jpg" +=> false", + "fn_type": "string -> bool", + "id": "lib.strings.isValidPosixName", + "line": 388, + "name": "isValidPosixName", + }, + { + "category": "./lib/strings.nix", + "description": "Translate a Nix value into a shell variable declaration, with proper escaping. + + The value can be a string (mapped to a regular variable), a list of strings + (mapped to a Bash-style array) or an attribute set of strings (mapped to a + Bash-style associative array). Note that "string" includes string-coercible + values like paths or derivations. + + Strings are translated into POSIX sh-compatible code; lists and attribute sets + assume a shell that understands Bash syntax (e.g. Bash or ZSH).", + "example": "'' + \${toShellVar "foo" "some string"} + [[ "$foo" == "some string" ]] +''", + "fn_type": "string -> (string | listOf string | attrsOf string) -> string", + "id": "lib.strings.toShellVar", + "line": 408, + "name": "toShellVar", + }, + { + "category": "./lib/strings.nix", + "description": "Translate an attribute set into corresponding shell variable declarations + using \`toShellVar\`.", + "example": "let + foo = "value"; + bar = foo; +in '' + \${toShellVars { inherit foo bar; }} + [[ "$foo" == "$bar" ]] +''", + "fn_type": "attrsOf (string | listOf string | attrsOf string) -> string", + "id": "lib.strings.toShellVars", + "line": 436, + "name": "toShellVars", + }, + { + "category": "./lib/strings.nix", + "description": "Turn a string into a Nix expression representing that string", + "example": "escapeNixString "hello\\\${}\\n" +=> "\\"hello\\\\\\\${}\\\\n\\""", + "fn_type": "string -> string", + "id": "lib.strings.escapeNixString", + "line": 446, + "name": "escapeNixString", + }, + { + "category": "./lib/strings.nix", + "description": "Turn a string into an exact regular expression", + "example": "escapeRegex "[^a-z]*" +=> "\\\\[\\\\^a-z]\\\\*"", + "fn_type": "string -> string", + "id": "lib.strings.escapeRegex", + "line": 456, + "name": "escapeRegex", + }, + { + "category": "./lib/strings.nix", + "description": "Quotes a string if it can't be used as an identifier directly.", + "example": "escapeNixIdentifier "hello" +=> "hello" +escapeNixIdentifier "0abc" +=> "\\"0abc\\""", + "fn_type": "string -> string", + "id": "lib.strings.escapeNixIdentifier", + "line": 468, + "name": "escapeNixIdentifier", + }, + { + "category": "./lib/strings.nix", + "description": "Escapes a string such that it is safe to include verbatim in an XML + document.", + "example": "escapeXML ''"test" 'test' < & >'' +=> ""test" 'test' < & >"", + "fn_type": "string -> string", + "id": "lib.strings.escapeXML", + "line": 482, + "name": "escapeXML", + }, + { + "category": "./lib/strings.nix", + "description": "Converts an ASCII string to lower-case.", + "example": "toLower "HOME" +=> "home"", + "fn_type": "toLower :: string -> string", + "id": "lib.strings.toLower", + "line": 501, + "name": "toLower", + }, + { + "category": "./lib/strings.nix", + "description": "Converts an ASCII string to upper-case.", + "example": "toUpper "home" +=> "HOME"", + "fn_type": "toUpper :: string -> string", + "id": "lib.strings.toUpper", + "line": 511, + "name": "toUpper", + }, + { + "category": "./lib/strings.nix", + "description": "Appends string context from another string. This is an implementation + detail of Nix and should be used carefully. + + Strings in Nix carry an invisible \`context\` which is a list of strings + representing store paths. If the string is later used in a derivation + attribute, the derivation will properly populate the inputDrvs and + inputSrcs.", + "example": "pkgs = import { }; +addContextFrom pkgs.coreutils "bar" +=> "bar"", + "fn_type": null, + "id": "lib.strings.addContextFrom", + "line": 526, + "name": "addContextFrom", + }, + { + "category": "./lib/strings.nix", + "description": "Cut a string with a separator and produces a list of strings which + were separated by this separator.", + "example": "splitString "." "foo.bar.baz" +=> [ "foo" "bar" "baz" ] +splitString "/" "/usr/local/bin" +=> [ "" "usr" "local" "bin" ]", + "fn_type": null, + "id": "lib.strings.splitString", + "line": 537, + "name": "splitString", + }, + { + "category": "./lib/strings.nix", + "description": "Return a string without the specified prefix, if the prefix matches.", + "example": "removePrefix "foo." "foo.bar.baz" +=> "bar.baz" +removePrefix "xxx" "foo.bar.baz" +=> "foo.bar.baz"", + "fn_type": "string -> string -> string", + "id": "lib.strings.removePrefix", + "line": 553, + "name": "removePrefix", + }, + { + "category": "./lib/strings.nix", + "description": "Return a string without the specified suffix, if the suffix matches.", + "example": "removeSuffix "front" "homefront" +=> "home" +removeSuffix "xxx" "homefront" +=> "homefront"", + "fn_type": "string -> string -> string", + "id": "lib.strings.removeSuffix", + "line": 577, + "name": "removeSuffix", + }, + { + "category": "./lib/strings.nix", + "description": "Return true if string v1 denotes a version older than v2.", + "example": "versionOlder "1.1" "1.2" +=> true +versionOlder "1.1" "1.1" +=> false", + "fn_type": null, + "id": "lib.strings.versionOlder", + "line": 599, + "name": "versionOlder", + }, + { + "category": "./lib/strings.nix", + "description": "Return true if string v1 denotes a version equal to or newer than v2.", + "example": "versionAtLeast "1.1" "1.0" +=> true +versionAtLeast "1.1" "1.1" +=> true +versionAtLeast "1.1" "1.2" +=> false", + "fn_type": null, + "id": "lib.strings.versionAtLeast", + "line": 611, + "name": "versionAtLeast", + }, + { + "category": "./lib/strings.nix", + "description": "This function takes an argument that's either a derivation or a + derivation's "name" attribute and extracts the name part from that + argument.", + "example": "getName "youtube-dl-2016.01.01" +=> "youtube-dl" +getName pkgs.youtube-dl +=> "youtube-dl"", + "fn_type": null, + "id": "lib.strings.getName", + "line": 623, + "name": "getName", + }, + { + "category": "./lib/strings.nix", + "description": "This function takes an argument that's either a derivation or a + derivation's "name" attribute and extracts the version part from that + argument.", + "example": "getVersion "youtube-dl-2016.01.01" +=> "2016.01.01" +getVersion pkgs.youtube-dl +=> "2016.01.01"", + "fn_type": null, + "id": "lib.strings.getVersion", + "line": 640, + "name": "getVersion", + }, + { + "category": "./lib/strings.nix", + "description": "Extract name with version from URL. Ask for separator which is + supposed to start extension.", + "example": "nameFromURL "https://nixos.org/releases/nix/nix-1.7/nix-1.7-x86_64-linux.tar.bz2" "-" +=> "nix" +nameFromURL "https://nixos.org/releases/nix/nix-1.7/nix-1.7-x86_64-linux.tar.bz2" "_" +=> "nix-1.7-x86"", + "fn_type": null, + "id": "lib.strings.nameFromURL", + "line": 656, + "name": "nameFromURL", + }, + { + "category": "./lib/strings.nix", + "description": "Create a -D= string that can be passed to typical Meson + invocations.", + "example": "mesonOption "engine" "opengl" +=> "-Dengine=opengl"", + "fn_type": "mesonOption :: string -> string -> string + + @param feature The feature to be set + @param value The desired value", + "id": "lib.strings.mesonOption", + "line": 675, + "name": "mesonOption", + }, + { + "category": "./lib/strings.nix", + "description": "Create a -D={true,false} string that can be passed to typical + Meson invocations.", + "example": "mesonBool "hardened" true +=> "-Dhardened=true" +mesonBool "static" false +=> "-Dstatic=false"", + "fn_type": "mesonBool :: string -> bool -> string + + @param condition The condition to be made true or false + @param flag The controlling flag of the condition", + "id": "lib.strings.mesonBool", + "line": 694, + "name": "mesonBool", + }, + { + "category": "./lib/strings.nix", + "description": "Create a -D={enabled,disabled} string that can be passed to + typical Meson invocations.", + "example": "mesonEnable "docs" true +=> "-Ddocs=enabled" +mesonEnable "savage" false +=> "-Dsavage=disabled"", + "fn_type": "mesonEnable :: string -> bool -> string + + @param feature The feature to be enabled or disabled + @param flag The controlling flag", + "id": "lib.strings.mesonEnable", + "line": 713, + "name": "mesonEnable", + }, + { + "category": "./lib/strings.nix", + "description": "Create an --{enable,disable}- string that can be passed to + standard GNU Autoconf scripts.", + "example": "enableFeature true "shared" +=> "--enable-shared" +enableFeature false "shared" +=> "--disable-shared"", + "fn_type": null, + "id": "lib.strings.enableFeature", + "line": 727, + "name": "enableFeature", + }, + { + "category": "./lib/strings.nix", + "description": "Create an --{enable-=,disable-} string that can be passed to + standard GNU Autoconf scripts.", + "example": "enableFeatureAs true "shared" "foo" +=> "--enable-shared=foo" +enableFeatureAs false "shared" (throw "ignored") +=> "--disable-shared"", + "fn_type": null, + "id": "lib.strings.enableFeatureAs", + "line": 740, + "name": "enableFeatureAs", + }, + { + "category": "./lib/strings.nix", + "description": "Create an --{with,without}- string that can be passed to + standard GNU Autoconf scripts.", + "example": "withFeature true "shared" +=> "--with-shared" +withFeature false "shared" +=> "--without-shared"", + "fn_type": null, + "id": "lib.strings.withFeature", + "line": 751, + "name": "withFeature", + }, + { + "category": "./lib/strings.nix", + "description": "Create an --{with-=,without-} string that can be passed to + standard GNU Autoconf scripts.", + "example": "withFeatureAs true "shared" "foo" +=> "--with-shared=foo" +withFeatureAs false "shared" (throw "ignored") +=> "--without-shared"", + "fn_type": null, + "id": "lib.strings.withFeatureAs", + "line": 764, + "name": "withFeatureAs", + }, + { + "category": "./lib/strings.nix", + "description": "Create a fixed width string with additional prefix to match + required width. + + This function will fail if the input string is longer than the + requested length.", + "example": "fixedWidthString 5 "0" (toString 15) +=> "00015"", + "fn_type": "fixedWidthString :: int -> string -> string -> string", + "id": "lib.strings.fixedWidthString", + "line": 778, + "name": "fixedWidthString", + }, + { + "category": "./lib/strings.nix", + "description": "Format a number adding leading zeroes up to fixed width.", + "example": "fixedWidthNumber 5 15 +=> "00015"", + "fn_type": null, + "id": "lib.strings.fixedWidthNumber", + "line": 795, + "name": "fixedWidthNumber", + }, + { + "category": "./lib/strings.nix", + "description": "Convert a float to a string, but emit a warning when precision is lost + during the conversion", + "example": "floatToString 0.000001 +=> "0.000001" +floatToString 0.0000001 +=> trace: warning: Imprecise conversion from float to string 0.000000 + "0.000000"", + "fn_type": null, + "id": "lib.strings.floatToString", + "line": 807, + "name": "floatToString", + }, + { + "category": "./lib/strings.nix", + "description": "Soft-deprecated function. While the original implementation is available as + isConvertibleWithToString, consider using isStringLike instead, if suitable.", + "example": null, + "fn_type": null, + "id": "lib.strings.isCoercibleToString", + "line": 815, + "name": "isCoercibleToString", + }, + { + "category": "./lib/strings.nix", + "description": "Check whether a list or other value can be passed to toString. + + Many types of value are coercible to string this way, including int, float, + null, bool, list of similarly coercible values.", + "example": null, + "fn_type": null, + "id": "lib.strings.isConvertibleWithToString", + "line": 824, + "name": "isConvertibleWithToString", + }, + { + "category": "./lib/strings.nix", + "description": "Check whether a value can be coerced to a string. + The value must be a string, path, or attribute set. + + String-like values can be used without explicit conversion in + string interpolations and in most functions that expect a string.", + "example": null, + "fn_type": null, + "id": "lib.strings.isStringLike", + "line": 835, + "name": "isStringLike", + }, + { + "category": "./lib/strings.nix", + "description": "Check whether a value is a store path.", + "example": "isStorePath "/nix/store/d945ibfx9x185xf04b890y4f9g3cbb63-python-2.7.11/bin/python" +=> false +isStorePath "/nix/store/d945ibfx9x185xf04b890y4f9g3cbb63-python-2.7.11" +=> true +isStorePath pkgs.python +=> true +isStorePath [] || isStorePath 42 || isStorePath {} || … +=> false", + "fn_type": null, + "id": "lib.strings.isStorePath", + "line": 853, + "name": "isStorePath", + }, + { + "category": "./lib/strings.nix", + "description": "Parse a string as an int. Does not support parsing of integers with preceding zero due to + ambiguity between zero-padded and octal numbers. See toIntBase10.", + "example": "toInt "1337" +=> 1337 + +toInt "-4" +=> -4 + +toInt " 123 " +=> 123 + +toInt "00024" +=> error: Ambiguity in interpretation of 00024 between octal and zero padded integer. + +toInt "3.14" +=> error: floating point JSON numbers are not supported", + "fn_type": "string -> int", + "id": "lib.strings.toInt", + "line": 884, + "name": "toInt", + }, + { + "category": "./lib/strings.nix", + "description": "Parse a string as a base 10 int. This supports parsing of zero-padded integers.", + "example": "toIntBase10 "1337" +=> 1337 + +toIntBase10 "-4" +=> -4 + +toIntBase10 " 123 " +=> 123 + +toIntBase10 "00024" +=> 24 + +toIntBase10 "3.14" +=> error: floating point JSON numbers are not supported", + "fn_type": "string -> int", + "id": "lib.strings.toIntBase10", + "line": 934, + "name": "toIntBase10", + }, + { + "category": "./lib/strings.nix", + "description": "Read a list of paths from \`file\`, relative to the \`rootPath\`. + Lines beginning with \`#\` are treated as comments and ignored. + Whitespace is significant. + + NOTE: This function is not performant and should be avoided.", + "example": "readPathsFromFile /prefix + ./pkgs/development/libraries/qt-5/5.4/qtbase/series +=> [ "/prefix/dlopen-resolv.patch" "/prefix/tzdir.patch" + "/prefix/dlopen-libXcursor.patch" "/prefix/dlopen-openssl.patch" + "/prefix/dlopen-dbus.patch" "/prefix/xdg-config-dirs.patch" + "/prefix/nix-profiles-library-paths.patch" + "/prefix/compose-search-path.patch" ]", + "fn_type": null, + "id": "lib.strings.readPathsFromFile", + "line": 977, + "name": "readPathsFromFile", + }, + { + "category": "./lib/strings.nix", + "description": "Read the contents of a file removing the trailing \\n", + "example": "$ echo "1.0" > ./version + +fileContents ./version +=> "1.0"", + "fn_type": "fileContents :: path -> string", + "id": "lib.strings.fileContents", + "line": 997, + "name": "fileContents", + }, + { + "category": "./lib/strings.nix", + "description": "Creates a valid derivation name from a potentially invalid one.", + "example": "sanitizeDerivationName "../hello.bar # foo" +=> "-hello.bar-foo" +sanitizeDerivationName "" +=> "unknown" +sanitizeDerivationName pkgs.hello +=> "-nix-store-2g75chlbpxlrqn15zlby2dfh8hr9qwbk-hello-2.10"", + "fn_type": "sanitizeDerivationName :: String -> String", + "id": "lib.strings.sanitizeDerivationName", + "line": 1012, + "name": "sanitizeDerivationName", + }, + { + "category": "./lib/strings.nix", + "description": "Computes the Levenshtein distance between two strings. + Complexity O(n*m) where n and m are the lengths of the strings. + Algorithm adjusted from https://stackoverflow.com/a/9750974/6605742", + "example": "levenshtein "foo" "foo" +=> 0 +levenshtein "book" "hook" +=> 1 +levenshtein "hello" "Heyo" +=> 3", + "fn_type": "levenshtein :: string -> string -> int", + "id": "lib.strings.levenshtein", + "line": 1051, + "name": "levenshtein", + }, + { + "category": "./lib/strings.nix", + "description": "Returns the length of the prefix common to both strings.", + "example": null, + "fn_type": null, + "id": "lib.strings.commonPrefixLength", + "line": 1072, + "name": "commonPrefixLength", + }, + { + "category": "./lib/strings.nix", + "description": "Returns the length of the suffix common to both strings.", + "example": null, + "fn_type": null, + "id": "lib.strings.commonSuffixLength", + "line": 1080, + "name": "commonSuffixLength", + }, + { + "category": "./lib/strings.nix", + "description": "Returns whether the levenshtein distance between two strings is at most some value + Complexity is O(min(n,m)) for k <= 2 and O(n*m) otherwise", + "example": "levenshteinAtMost 0 "foo" "foo" +=> true +levenshteinAtMost 1 "foo" "boa" +=> false +levenshteinAtMost 2 "foo" "boa" +=> true +levenshteinAtMost 2 "This is a sentence" "this is a sentense." +=> false +levenshteinAtMost 3 "This is a sentence" "this is a sentense." +=> true", + "fn_type": "levenshteinAtMost :: int -> string -> string -> bool", + "id": "lib.strings.levenshteinAtMost", + "line": 1104, + "name": "levenshteinAtMost", + }, + { + "category": "./lib/strings-with-deps.nix", + "description": "!!! The interface of this function is kind of messed up, since + it's way too overloaded and almost but not quite computes a + topological sort of the depstrings.", + "example": null, + "fn_type": null, + "id": "lib.strings-with-deps.textClosureList", + "line": 59, + "name": "textClosureList", + }, + { + "category": "./lib/sources.nix", + "description": "Returns the type of a path: regular (for file), symlink, or directory.", + "example": null, + "fn_type": null, + "id": "lib.sources.pathType", + "line": 25, + "name": "pathType", + }, + { + "category": "./lib/sources.nix", + "description": "Returns true if the path exists and is a directory, false otherwise.", + "example": null, + "fn_type": null, + "id": "lib.sources.pathIsDirectory", + "line": 30, + "name": "pathIsDirectory", + }, + { + "category": "./lib/sources.nix", + "description": "Returns true if the path exists and is a regular file, false otherwise.", + "example": null, + "fn_type": null, + "id": "lib.sources.pathIsRegularFile", + "line": 35, + "name": "pathIsRegularFile", + }, + { + "category": "./lib/sources.nix", + "description": "A basic filter for \`cleanSourceWith\` that removes +directories of version control system, backup files (*~) +and some generated files.", + "example": null, + "fn_type": null, + "id": "lib.sources.cleanSourceFilter", + "line": 42, + "name": "cleanSourceFilter", + }, + { + "category": "./lib/sources.nix", + "description": "Filters a source tree removing version control files and directories using cleanSourceFilter.", + "example": "cleanSource ./.", + "fn_type": null, + "id": "lib.sources.cleanSource", + "line": 65, + "name": "cleanSource", + }, + { + "category": "./lib/sources.nix", + "description": "Like \`builtins.filterSource\`, except it will compose with itself, +allowing you to chain multiple calls together without any +intermediate copies being put in the nix store.", + "example": "lib.cleanSourceWith { + filter = f; + src = lib.cleanSourceWith { + filter = g; + src = ./.; + }; +} +# Succeeds! + +builtins.filterSource f (builtins.filterSource g ./.) +# Fails!", + "fn_type": null, + "id": "lib.sources.cleanSourceWith", + "line": 86, + "name": "cleanSourceWith", + }, + { + "category": "./lib/sources.nix", + "description": "Add logging to a source, for troubleshooting the filtering behavior.", + "example": null, + "fn_type": "sources.trace :: sourceLike -> Source", + "id": "lib.sources.trace", + "line": 114, + "name": "trace", + }, + { + "category": "./lib/sources.nix", + "description": "Filter sources by a list of regular expressions.", + "example": "src = sourceByRegex ./my-subproject [".*\\.py$" "^database.sql$"]", + "fn_type": null, + "id": "lib.sources.sourceByRegex", + "line": 137, + "name": "sourceByRegex", + }, + { + "category": "./lib/sources.nix", + "description": "Get all files ending with the specified suffices from the given +source directory or its descendants, omitting files that do not match +any suffix. The result of the example below will include files like +\`./dir/module.c\` and \`./dir/subdir/doc.xml\` if present.", + "example": "sourceFilesBySuffices ./. [ ".xml" ".c" ]", + "fn_type": "sourceLike -> [String] -> Source", + "id": "lib.sources.sourceFilesBySuffices", + "line": 159, + "name": "sourceFilesBySuffices", + }, + { + "category": "./lib/sources.nix", + "description": "Get the commit id of a git repo.", + "example": "commitIdFromGitRepo ", + "fn_type": null, + "id": "lib.sources.commitIdFromGitRepo", + "line": 176, + "name": "commitIdFromGitRepo", + }, + { + "category": "./lib/options.nix", + "description": "Returns true when the given argument is an option", + "example": "isOption 1 // => false +isOption (mkOption {}) // => true", + "fn_type": "isOption :: a -> bool", + "id": "lib.options.isOption", + "line": 53, + "name": "isOption", + }, + { + "category": "./lib/options.nix", + "description": "Creates an Option attribute set. mkOption accepts an attribute set with the following keys: + + All keys default to \`null\` when not given.", + "example": "mkOption { } // => { _type = "option"; } +mkOption { default = "foo"; } // => { _type = "option"; default = "foo"; }", + "fn_type": null, + "id": "lib.options.mkOption", + "line": 63, + "name": "mkOption", + }, + { + "category": "./lib/options.nix", + "description": "Creates an Option attribute set for a boolean value option i.e an + option to be toggled on or off:", + "example": "mkEnableOption "foo" +=> { _type = "option"; default = false; description = "Whether to enable foo."; example = true; type = { ... }; }", + "fn_type": null, + "id": "lib.options.mkEnableOption", + "line": 95, + "name": "mkEnableOption", + }, + { + "category": "./lib/options.nix", + "description": "Creates an Option attribute set for an option that specifies the + package a module should use for some purpose. + + The package is specified as a list of strings representing its attribute path in nixpkgs. + + Because of this, you need to pass nixpkgs itself as the first argument. + + The second argument is the name of the option, used in the description "The package to use.". + + You can also pass an example value, either a literal string or a package's attribute path. + + You can omit the default path if the name of the option is also attribute path in nixpkgs.", + "example": "mkPackageOption pkgs "hello" { } +=> { _type = "option"; default = «derivation /nix/store/3r2vg51hlxj3cx5vscp0vkv60bqxkaq0-hello-2.10.drv»; defaultText = { ... }; description = "The hello package to use."; type = { ... }; } + + +mkPackageOption pkgs "GHC" { + default = [ "ghc" ]; + example = "pkgs.haskell.packages.ghc92.ghc.withPackages (hkgs: [ hkgs.primes ])"; +} +=> { _type = "option"; default = «derivation /nix/store/jxx55cxsjrf8kyh3fp2ya17q99w7541r-ghc-8.10.7.drv»; defaultText = { ... }; description = "The GHC package to use."; example = { ... }; type = { ... }; }", + "fn_type": "mkPackageOption :: pkgs -> string -> { default :: [string]; example :: null | string | [string]; } -> option", + "id": "lib.options.mkPackageOption", + "line": 133, + "name": "mkPackageOption", + }, + { + "category": "./lib/options.nix", + "description": "Like mkPackageOption, but emit an mdDoc description instead of DocBook.", + "example": null, + "fn_type": null, + "id": "lib.options.mkPackageOptionMD", + "line": 151, + "name": "mkPackageOptionMD", + }, + { + "category": "./lib/options.nix", + "description": "This option accepts anything, but it does not produce any result. + + This is useful for sharing a module across different module sets + without having to implement similar features as long as the + values of the options are not accessed.", + "example": null, + "fn_type": null, + "id": "lib.options.mkSinkUndeclaredOptions", + "line": 160, + "name": "mkSinkUndeclaredOptions", + }, + { + "category": "./lib/options.nix", + "description": ""Merge" option definitions by checking that they all have the same value.", + "example": null, + "fn_type": null, + "id": "lib.options.mergeEqualOption", + "line": 193, + "name": "mergeEqualOption", + }, + { + "category": "./lib/options.nix", + "description": "Extracts values of all "value" keys of the given list.", + "example": "getValues [ { value = 1; } { value = 2; } ] // => [ 1 2 ] +getValues [ ] // => [ ]", + "fn_type": "getValues :: [ { value :: a; } ] -> [a]", + "id": "lib.options.getValues", + "line": 213, + "name": "getValues", + }, + { + "category": "./lib/options.nix", + "description": "Extracts values of all "file" keys of the given list", + "example": "getFiles [ { file = "file1"; } { file = "file2"; } ] // => [ "file1" "file2" ] +getFiles [ ] // => [ ]", + "fn_type": "getFiles :: [ { file :: a; } ] -> [a]", + "id": "lib.options.getFiles", + "line": 223, + "name": "getFiles", + }, + { + "category": "./lib/options.nix", + "description": "This function recursively removes all derivation attributes from + \`x\` except for the \`name\` attribute. + + This is to make the generation of \`options.xml\` much more + efficient: the XML representation of derivations is very large + (on the order of megabytes) and is not actually used by the + manual generator. + + This function was made obsolete by renderOptionValue and is kept for + compatibility with out-of-tree code.", + "example": null, + "fn_type": null, + "id": "lib.options.scrubOptionValue", + "line": 281, + "name": "scrubOptionValue", + }, + { + "category": "./lib/options.nix", + "description": "Ensures that the given option value (default or example) is a \`_type\`d string + by rendering Nix values to \`literalExpression\`s.", + "example": null, + "fn_type": null, + "id": "lib.options.renderOptionValue", + "line": 292, + "name": "renderOptionValue", + }, + { + "category": "./lib/options.nix", + "description": "For use in the \`defaultText\` and \`example\` option attributes. Causes the + given string to be rendered verbatim in the documentation as Nix code. This + is necessary for complex values, e.g. functions, or values that depend on + other values or packages.", + "example": null, + "fn_type": null, + "id": "lib.options.literalExpression", + "line": 305, + "name": "literalExpression", + }, + { + "category": "./lib/options.nix", + "description": "For use in the \`defaultText\` and \`example\` option attributes. Causes the + given DocBook text to be inserted verbatim in the documentation, for when + a \`literalExpression\` would be too hard to read.", + "example": null, + "fn_type": null, + "id": "lib.options.literalDocBook", + "line": 316, + "name": "literalDocBook", + }, + { + "category": "./lib/options.nix", + "description": "Transition marker for documentation that's already migrated to markdown + syntax.", + "example": null, + "fn_type": null, + "id": "lib.options.mdDoc", + "line": 326, + "name": "mdDoc", + }, + { + "category": "./lib/options.nix", + "description": "For use in the \`defaultText\` and \`example\` option attributes. Causes the + given MD text to be inserted verbatim in the documentation, for when + a \`literalExpression\` would be too hard to read.", + "example": null, + "fn_type": null, + "id": "lib.options.literalMD", + "line": 334, + "name": "literalMD", + }, + { + "category": "./lib/options.nix", + "description": "Convert an option, described as a list of the option parts to a + human-readable version.", + "example": "(showOption ["foo" "bar" "baz"]) == "foo.bar.baz" +(showOption ["foo" "bar.baz" "tux"]) == "foo.\\"bar.baz\\".tux" +(showOption ["windowManager" "2bwm" "enable"]) == "windowManager.\\"2bwm\\".enable" + + Placeholders will not be quoted as they are not actual values: +(showOption ["foo" "*" "bar"]) == "foo.*.bar" +(showOption ["foo" "" "bar"]) == "foo..bar"", + "fn_type": null, + "id": "lib.options.showOption", + "line": 352, + "name": "showOption", + }, + { + "category": "./lib/modules.nix", + "description": "Evaluate a set of modules. The result is a set with the attributes: + + ‘options’: The nested set of all option declarations, + + ‘config’: The nested set of all option values. + + ‘type’: A module system type representing the module set as a submodule, + to be extended by configuration from the containing module set. + + This is also available as the module argument ‘moduleType’. + + ‘extendModules’: A function similar to ‘evalModules’ but building on top + of the module set. Its arguments, ‘modules’ and ‘specialArgs’ are + added to the existing values. + + Using ‘extendModules’ a few times has no performance impact as long + as you only reference the final ‘options’ and ‘config’. + If you do reference multiple ‘config’ (or ‘options’) from before and + after ‘extendModules’, performance is the same as with multiple + ‘evalModules’ invocations, because the new modules' ability to + override existing configuration fundamentally requires a new + fixpoint to be constructed. + + This is also available as a module argument. + + ‘_module’: A portion of the configuration tree which is elided from + ‘config’. It contains some values that are mostly internal to the + module system implementation. + + !!! Please think twice before adding to this argument list! The more + that is specified here instead of in the modules themselves the harder + it is to transparently move a set of modules to be a submodule of another + config (as the proper arguments need to be replicated at each call to + evalModules) and the less declarative the module set is.", + "example": null, + "fn_type": null, + "id": "lib.modules.evalModules", + "line": 103, + "name": "evalModules", + }, + { + "category": "./lib/modules.nix", + "description": "Collects all modules recursively into the form + + { + disabled = [ ]; + # All modules of the main module list + modules = [ + { + key = ; + module = ; + # All modules imported by the module for key1 + modules = [ + { + key = ; + module = ; + # All modules imported by the module for key1-1 + modules = [ ... ]; + } + ... + ]; + } + ... + ]; + }", + "example": null, + "fn_type": null, + "id": "lib.modules.collectStructuredModules", + "line": 394, + "name": "collectStructuredModules", + }, + { + "category": "./lib/modules.nix", + "description": "Wrap a module with a default location for reporting errors.", + "example": null, + "fn_type": null, + "id": "lib.modules.setDefaultModuleLocation", + "line": 430, + "name": "setDefaultModuleLocation", + }, + { + "category": "./lib/modules.nix", + "description": "Massage a module into canonical form, that is, a set consisting + of ‘options’, ‘config’ and ‘imports’ attributes.", + "example": null, + "fn_type": null, + "id": "lib.modules.unifyModuleSyntax", + "line": 437, + "name": "unifyModuleSyntax", + }, + { + "category": "./lib/modules.nix", + "description": "Merge a list of modules. This will recurse over the option + declarations in all modules, combining them into a single set. + At the same time, for each option declaration, it will merge the + corresponding option definitions in all machines, returning them + in the ‘value’ attribute of each option. + + This returns a set like + { + # A recursive set of options along with their final values + matchedOptions = { + foo = { _type = "option"; value = "option value of foo"; ... }; + bar.baz = { _type = "option"; value = "option value of bar.baz"; ... }; + ... + }; + # A list of definitions that weren't matched by any option + unmatchedDefns = [ + { file = "file.nix"; prefix = [ "qux" ]; value = "qux"; } + ... + ]; + }", + "example": null, + "fn_type": null, + "id": "lib.modules.mergeModules", + "line": 517, + "name": "mergeModules", + }, + { + "category": "./lib/modules.nix", + "description": "byName is like foldAttrs, but will look for attributes to merge in the + specified attribute name. + + byName "foo" (module: value: ["module.hidden=\${module.hidden},value=\${value}"]) + [ + { + hidden="baz"; + foo={qux="bar"; gla="flop";}; + } + { + hidden="fli"; + foo={qux="gne"; gli="flip";}; + } + ] + ===> + { + gla = [ "module.hidden=baz,value=flop" ]; + gli = [ "module.hidden=fli,value=flip" ]; + qux = [ "module.hidden=baz,value=bar" "module.hidden=fli,value=gne" ]; + }", + "example": null, + "fn_type": null, + "id": "lib.modules.byName", + "line": 544, + "name": "byName", + }, + { + "category": "./lib/modules.nix", + "description": "Merge multiple option declarations into a single declaration. In + general, there should be only one declaration of each option. + The exception is the ‘options’ attribute, which specifies + sub-options. These can be specified multiple times to allow one + module to add sub-options to an option declared somewhere else + (e.g. multiple modules define sub-options for ‘fileSystems’). + + 'loc' is the list of attribute names where the option is located. + + 'opts' is a list of modules. Each module has an options attribute which + correspond to the definition of 'loc' in 'opt.file'.", + "example": null, + "fn_type": null, + "id": "lib.modules.mergeOptionDecls", + "line": 670, + "name": "mergeOptionDecls", + }, + { + "category": "./lib/modules.nix", + "description": "Merge all the definitions of an option to produce the final + config value.", + "example": null, + "fn_type": null, + "id": "lib.modules.evalOptionValue", + "line": 702, + "name": "evalOptionValue", + }, + { + "category": "./lib/modules.nix", + "description": "Given a config set, expand mkMerge properties, and push down the + other properties into the children. The result is a list of + config sets that do not have properties at top-level. For + example, + + mkMerge [ { boot = set1; } (mkIf cond { boot = set2; services = set3; }) ] + + is transformed into + + [ { boot = set1; } { boot = mkIf cond set2; services = mkIf cond set3; } ]. + + This transform is the critical step that allows mkIf conditions + to refer to the full configuration without creating an infinite + recursion.", + "example": null, + "fn_type": null, + "id": "lib.modules.pushDownProperties", + "line": 797, + "name": "pushDownProperties", + }, + { + "category": "./lib/modules.nix", + "description": "Given a config value, expand mkMerge properties, and discharge + any mkIf conditions. That is, this is the place where mkIf + conditions are actually evaluated. The result is a list of + config values. For example, ‘mkIf false x’ yields ‘[]’, + ‘mkIf true x’ yields ‘[x]’, and + + mkMerge [ 1 (mkIf true 2) (mkIf true (mkIf false 3)) ] + + yields ‘[ 1 2 ]’.", + "example": null, + "fn_type": null, + "id": "lib.modules.dischargeProperties", + "line": 818, + "name": "dischargeProperties", + }, + { + "category": "./lib/modules.nix", + "description": "Given a list of config values, process the mkOverride properties, + that is, return the values that have the highest (that is, + numerically lowest) priority, and strip the mkOverride + properties. For example, + + [ { file = "/1"; value = mkOverride 10 "a"; } + { file = "/2"; value = mkOverride 20 "b"; } + { file = "/3"; value = "z"; } + { file = "/4"; value = mkOverride 10 "d"; } + ] + + yields + + [ { file = "/1"; value = "a"; } + { file = "/4"; value = "d"; } + ] + + Note that "z" has the default priority 100.", + "example": null, + "fn_type": null, + "id": "lib.modules.filterOverrides", + "line": 852, + "name": "filterOverrides", + }, + { + "category": "./lib/modules.nix", + "description": "Sort a list of properties. The sort priority of a property is + defaultOrderPriority by default, but can be overridden by wrapping the property + using mkOrder.", + "example": null, + "fn_type": null, + "id": "lib.modules.sortProperties", + "line": 867, + "name": "sortProperties", + }, + { + "category": "./lib/modules.nix", + "description": "Properties.", + "example": null, + "fn_type": null, + "id": "lib.modules.mkIf", + "line": 889, + "name": "mkIf", + }, + { + "category": "./lib/modules.nix", + "description": "Compatibility.", + "example": null, + "fn_type": null, + "id": "lib.modules.fixMergeModules", + "line": 964, + "name": "fixMergeModules", + }, + { + "category": "./lib/modules.nix", + "description": "Return a module that causes a warning to be shown if the + specified option is defined. For example, + + mkRemovedOptionModule [ "boot" "loader" "grub" "bootDevice" ] "" + + causes a assertion if the user defines boot.loader.grub.bootDevice. + + replacementInstructions is a string that provides instructions on + how to achieve the same functionality without the removed option, + or alternatively a reasoning why the functionality is not needed. + replacementInstructions SHOULD be provided!", + "example": null, + "fn_type": null, + "id": "lib.modules.mkRemovedOptionModule", + "line": 978, + "name": "mkRemovedOptionModule", + }, + { + "category": "./lib/modules.nix", + "description": "Return a module that causes a warning to be shown if the + specified "from" option is defined; the defined value is however + forwarded to the "to" option. This can be used to rename options + while providing backward compatibility. For example, + + mkRenamedOptionModule [ "boot" "copyKernels" ] [ "boot" "loader" "grub" "copyKernels" ] + + forwards any definitions of boot.copyKernels to + boot.loader.grub.copyKernels while printing a warning. + + This also copies over the priority from the aliased option to the + non-aliased option.", + "example": null, + "fn_type": null, + "id": "lib.modules.mkRenamedOptionModule", + "line": 1009, + "name": "mkRenamedOptionModule", + }, + { + "category": "./lib/modules.nix", + "description": "Return a module that causes a warning to be shown if any of the "from" + option is defined; the defined values can be used in the "mergeFn" to set + the "to" value. + This function can be used to merge multiple options into one that has a + different type. + + "mergeFn" takes the module "config" as a parameter and must return a value + of "to" option type. + + mkMergedOptionModule + [ [ "a" "b" "c" ] + [ "d" "e" "f" ] ] + [ "x" "y" "z" ] + (config: + let value = p: getAttrFromPath p config; + in + if (value [ "a" "b" "c" ]) == true then "foo" + else if (value [ "d" "e" "f" ]) == true then "bar" + else "baz") + + - options.a.b.c is a removed boolean option + - options.d.e.f is a removed boolean option + - options.x.y.z is a new str option that combines a.b.c and d.e.f + functionality + + This show a warning if any a.b.c or d.e.f is set, and set the value of + x.y.z to the result of the merge function", + "example": null, + "fn_type": null, + "id": "lib.modules.mkMergedOptionModule", + "line": 1063, + "name": "mkMergedOptionModule", + }, + { + "category": "./lib/modules.nix", + "description": "Single "from" version of mkMergedOptionModule. + Return a module that causes a warning to be shown if the "from" option is + defined; the defined value can be used in the "mergeFn" to set the "to" + value. + This function can be used to change an option into another that has a + different type. + + "mergeFn" takes the module "config" as a parameter and must return a value of + "to" option type. + + mkChangedOptionModule [ "a" "b" "c" ] [ "x" "y" "z" ] + (config: + let value = getAttrFromPath [ "a" "b" "c" ] config; + in + if value > 100 then "high" + else "normal") + + - options.a.b.c is a removed int option + - options.x.y.z is a new str option that supersedes a.b.c + + This show a warning if a.b.c is set, and set the value of x.y.z to the + result of the change function", + "example": null, + "fn_type": null, + "id": "lib.modules.mkChangedOptionModule", + "line": 1110, + "name": "mkChangedOptionModule", + }, + { + "category": "./lib/modules.nix", + "description": "Like ‘mkRenamedOptionModule’, but doesn't show a warning.", + "example": null, + "fn_type": null, + "id": "lib.modules.mkAliasOptionModule", + "line": 1118, + "name": "mkAliasOptionModule", + }, + { + "category": "./lib/modules.nix", + "description": "Transitional version of mkAliasOptionModule that uses MD docs.", + "example": null, + "fn_type": null, + "id": "lib.modules.mkAliasOptionModuleMD", + "line": 1124, + "name": "mkAliasOptionModuleMD", + }, + { + "category": "./lib/modules.nix", + "description": "mkDerivedConfig : Option a -> (a -> Definition b) -> Definition b + + Create config definitions with the same priority as the definition of another option. + This should be used for option definitions where one option sets the value of another as a convenience. + For instance a config file could be set with a \`text\` or \`source\` option, where text translates to a \`source\` + value using \`mkDerivedConfig options.text (pkgs.writeText "filename.conf")\`. + + It takes care of setting the right priority using \`mkOverride\`.", + "example": null, + "fn_type": null, + "id": "lib.modules.mkDerivedConfig", + "line": 1147, + "name": "mkDerivedConfig", + }, + { + "category": "./lib/modules.nix", + "description": "Use this function to import a JSON file as NixOS configuration. + + modules.importJSON :: path -> attrs", + "example": null, + "fn_type": null, + "id": "lib.modules.importJSON", + "line": 1185, + "name": "importJSON", + }, + { + "category": "./lib/modules.nix", + "description": "Use this function to import a TOML file as NixOS configuration. + + modules.importTOML :: path -> attrs", + "example": null, + "fn_type": null, + "id": "lib.modules.importTOML", + "line": null, + "name": "importTOML", + }, + { + "category": "./lib/meta.nix", + "description": "Add to or override the meta attributes of the given + derivation.", + "example": "addMetaAttrs {description = "Bla blah";} somePkg", + "fn_type": null, + "id": "lib.meta.addMetaAttrs", + "line": 15, + "name": "addMetaAttrs", + }, + { + "category": "./lib/meta.nix", + "description": "Disable Hydra builds of given derivation.", + "example": null, + "fn_type": null, + "id": "lib.meta.dontDistribute", + "line": 21, + "name": "dontDistribute", + }, + { + "category": "./lib/meta.nix", + "description": "Change the symbolic name of a package for presentation purposes + (i.e., so that nix-env users can tell them apart).", + "example": null, + "fn_type": null, + "id": "lib.meta.setName", + "line": 27, + "name": "setName", + }, + { + "category": "./lib/meta.nix", + "description": "Like \`setName\`, but takes the previous name as an argument.", + "example": "updateName (oldName: oldName + "-experimental") somePkg", + "fn_type": null, + "id": "lib.meta.updateName", + "line": 35, + "name": "updateName", + }, + { + "category": "./lib/meta.nix", + "description": "Append a suffix to the name of a package (before the version + part).", + "example": null, + "fn_type": null, + "id": "lib.meta.appendToName", + "line": 40, + "name": "appendToName", + }, + { + "category": "./lib/meta.nix", + "description": "Apply a function to each derivation and only to derivations in an attrset.", + "example": null, + "fn_type": null, + "id": "lib.meta.mapDerivationAttrset", + "line": 46, + "name": "mapDerivationAttrset", + }, + { + "category": "./lib/meta.nix", + "description": "Set the nix-env priority of the package.", + "example": null, + "fn_type": null, + "id": "lib.meta.setPrio", + "line": 50, + "name": "setPrio", + }, + { + "category": "./lib/meta.nix", + "description": "Decrease the nix-env priority of the package, i.e., other + versions/variants of the package will be preferred.", + "example": null, + "fn_type": null, + "id": "lib.meta.lowPrio", + "line": 55, + "name": "lowPrio", + }, + { + "category": "./lib/meta.nix", + "description": "Apply lowPrio to an attrset with derivations", + "example": null, + "fn_type": null, + "id": "lib.meta.lowPrioSet", + "line": 59, + "name": "lowPrioSet", + }, + { + "category": "./lib/meta.nix", + "description": "Increase the nix-env priority of the package, i.e., this + version/variant of the package will be preferred.", + "example": null, + "fn_type": null, + "id": "lib.meta.hiPrio", + "line": 65, + "name": "hiPrio", + }, + { + "category": "./lib/meta.nix", + "description": "Apply hiPrio to an attrset with derivations", + "example": null, + "fn_type": null, + "id": "lib.meta.hiPrioSet", + "line": 69, + "name": "hiPrioSet", + }, + { + "category": "./lib/meta.nix", + "description": "Check to see if a platform is matched by the given \`meta.platforms\` + element. + + A \`meta.platform\` pattern is either + + 1. (legacy) a system string. + + 2. (modern) a pattern for the entire platform structure (see \`lib.systems.inspect.platformPatterns\`). + + 3. (modern) a pattern for the platform \`parsed\` field (see \`lib.systems.inspect.patterns\`). + + We can inject these into a pattern for the whole of a structured platform, + and then match that.", + "example": null, + "fn_type": null, + "id": "lib.meta.platformMatch", + "line": 86, + "name": "platformMatch", + }, + { + "category": "./lib/meta.nix", + "description": "Check if a package is available on a given platform. + + A package is available on a platform if both + + 1. One of \`meta.platforms\` pattern matches the given + platform, or \`meta.platforms\` is not present. + + 2. None of \`meta.badPlatforms\` pattern matches the given platform.", + "example": null, + "fn_type": null, + "id": "lib.meta.availableOn", + "line": 104, + "name": "availableOn", + }, + { + "category": "./lib/meta.nix", + "description": "Get the corresponding attribute in lib.licenses + from the SPDX ID. + For SPDX IDs, see + https://spdx.org/licenses", + "example": "lib.getLicenseFromSpdxId "MIT" == lib.licenses.mit +=> true +lib.getLicenseFromSpdxId "mIt" == lib.licenses.mit +=> true +lib.getLicenseFromSpdxId "MY LICENSE" +=> trace: warning: getLicenseFromSpdxId: No license matches the given SPDX ID: MY LICENSE +=> { shortName = "MY LICENSE"; }", + "fn_type": "getLicenseFromSpdxId :: str -> AttrSet", + "id": "lib.meta.getLicenseFromSpdxId", + "line": 125, + "name": "getLicenseFromSpdxId", + }, + { + "category": "./lib/meta.nix", + "description": "Get the path to the main program of a derivation with either + meta.mainProgram or pname or name", + "example": "getExe pkgs.hello +=> "/nix/store/g124820p9hlv4lj8qplzxw1c44dxaw1k-hello-2.12/bin/hello" +getExe pkgs.mustache-go +=> "/nix/store/am9ml4f4ywvivxnkiaqwr0hyxka1xjsf-mustache-go-1.3.0/bin/mustache"", + "fn_type": "getExe :: derivation -> string", + "id": "lib.meta.getExe", + "line": 146, + "name": "getExe", + }, + { + "category": "./lib/lists.nix", + "description": "Create a list consisting of a single element. \`singleton x\` is + sometimes more convenient with respect to indentation than \`[x]\` + when x spans multiple lines.", + "example": "singleton "foo" +=> [ "foo" ]", + "fn_type": "singleton :: a -> [a]", + "id": "lib.lists.singleton", + "line": 23, + "name": "singleton", + }, + { + "category": "./lib/lists.nix", + "description": "Apply the function to each element in the list. Same as \`map\`, but arguments + flipped.", + "example": "forEach [ 1 2 ] (x: + toString x +) +=> [ "1" "2" ]", + "fn_type": "forEach :: [a] -> (a -> b) -> [b]", + "id": "lib.lists.forEach", + "line": 36, + "name": "forEach", + }, + { + "category": "./lib/lists.nix", + "description": "“right fold” a binary function \`op\` between successive elements of + \`list\` with \`nul\` as the starting value, i.e., + \`foldr op nul [x_1 x_2 ... x_n] == op x_1 (op x_2 ... (op x_n nul))\`.", + "example": "concat = foldr (a: b: a + b) "z" +concat [ "a" "b" "c" ] +=> "abcz" +# different types +strange = foldr (int: str: toString (int + 1) + str) "a" +strange [ 1 2 3 4 ] +=> "2345a"", + "fn_type": "foldr :: (a -> b -> b) -> b -> [a] -> b", + "id": "lib.lists.foldr", + "line": 53, + "name": "foldr", + }, + { + "category": "./lib/lists.nix", + "description": "\`fold\` is an alias of \`foldr\` for historic reasons", + "example": null, + "fn_type": null, + "id": "lib.lists.fold", + "line": 64, + "name": "fold", + }, + { + "category": "./lib/lists.nix", + "description": "“left fold”, like \`foldr\`, but from the left: + \`foldl op nul [x_1 x_2 ... x_n] == op (... (op (op nul x_1) x_2) ... x_n)\`.", + "example": "lconcat = foldl (a: b: a + b) "z" +lconcat [ "a" "b" "c" ] +=> "zabc" +# different types +lstrange = foldl (str: int: str + toString (int + 1)) "a" +lstrange [ 1 2 3 4 ] +=> "a2345"", + "fn_type": "foldl :: (b -> a -> b) -> b -> [a] -> b", + "id": "lib.lists.foldl", + "line": 81, + "name": "foldl", + }, + { + "category": "./lib/lists.nix", + "description": "Strict version of \`foldl\`. + + The difference is that evaluation is forced upon access. Usually used + with small whole results (in contrast with lazily-generated list or large + lists where only a part is consumed.)", + "example": null, + "fn_type": "foldl' :: (b -> a -> b) -> b -> [a] -> b", + "id": "lib.lists.foldl'", + "line": 97, + "name": "foldl'", + }, + { + "category": "./lib/lists.nix", + "description": "Map with index starting from 0", + "example": "imap0 (i: v: "\${v}-\${toString i}") ["a" "b"] +=> [ "a-0" "b-1" ]", + "fn_type": "imap0 :: (int -> a -> b) -> [a] -> [b]", + "id": "lib.lists.imap0", + "line": 107, + "name": "imap0", + }, + { + "category": "./lib/lists.nix", + "description": "Map with index starting from 1", + "example": "imap1 (i: v: "\${v}-\${toString i}") ["a" "b"] +=> [ "a-1" "b-2" ]", + "fn_type": "imap1 :: (int -> a -> b) -> [a] -> [b]", + "id": "lib.lists.imap1", + "line": 117, + "name": "imap1", + }, + { + "category": "./lib/lists.nix", + "description": "Map and concatenate the result.", + "example": "concatMap (x: [x] ++ ["z"]) ["a" "b"] +=> [ "a" "z" "b" "z" ]", + "fn_type": "concatMap :: (a -> [b]) -> [a] -> [b]", + "id": "lib.lists.concatMap", + "line": 127, + "name": "concatMap", + }, + { + "category": "./lib/lists.nix", + "description": "Flatten the argument into a single list; that is, nested lists are + spliced into the top-level lists.", + "example": "flatten [1 [2 [3] 4] 5] +=> [1 2 3 4 5] +flatten 1 +=> [1]", + "fn_type": null, + "id": "lib.lists.flatten", + "line": 138, + "name": "flatten", + }, + { + "category": "./lib/lists.nix", + "description": "Remove elements equal to 'e' from a list. Useful for buildInputs.", + "example": "remove 3 [ 1 3 4 3 ] +=> [ 1 4 ]", + "fn_type": "remove :: a -> [a] -> [a]", + "id": "lib.lists.remove", + "line": 152, + "name": "remove", + }, + { + "category": "./lib/lists.nix", + "description": "Find the sole element in the list matching the specified + predicate, returns \`default\` if no such element exists, or + \`multiple\` if there are multiple matching elements.", + "example": "findSingle (x: x == 3) "none" "multiple" [ 1 3 3 ] +=> "multiple" +findSingle (x: x == 3) "none" "multiple" [ 1 3 ] +=> 3 +findSingle (x: x == 3) "none" "multiple" [ 1 9 ] +=> "none"", + "fn_type": "findSingle :: (a -> bool) -> a -> a -> [a] -> a", + "id": "lib.lists.findSingle", + "line": 169, + "name": "findSingle", + }, + { + "category": "./lib/lists.nix", + "description": "Find the first element in the list matching the specified + predicate or return \`default\` if no such element exists.", + "example": "findFirst (x: x > 3) 7 [ 1 6 4 ] +=> 6 +findFirst (x: x > 9) 7 [ 1 6 4 ] +=> 7", + "fn_type": "findFirst :: (a -> bool) -> a -> [a] -> a", + "id": "lib.lists.findFirst", + "line": 194, + "name": "findFirst", + }, + { + "category": "./lib/lists.nix", + "description": "Return true if function \`pred\` returns true for at least one + element of \`list\`.", + "example": "any isString [ 1 "a" { } ] +=> true +any isString [ 1 { } ] +=> false", + "fn_type": "any :: (a -> bool) -> [a] -> bool", + "id": "lib.lists.any", + "line": 215, + "name": "any", + }, + { + "category": "./lib/lists.nix", + "description": "Return true if function \`pred\` returns true for all elements of + \`list\`.", + "example": "all (x: x < 3) [ 1 2 ] +=> true +all (x: x < 3) [ 1 2 3 ] +=> false", + "fn_type": "all :: (a -> bool) -> [a] -> bool", + "id": "lib.lists.all", + "line": 228, + "name": "all", + }, + { + "category": "./lib/lists.nix", + "description": "Count how many elements of \`list\` match the supplied predicate + function.", + "example": "count (x: x == 3) [ 3 2 3 4 6 ] +=> 2", + "fn_type": "count :: (a -> bool) -> [a] -> int", + "id": "lib.lists.count", + "line": 240, + "name": "count", + }, + { + "category": "./lib/lists.nix", + "description": "Return a singleton list or an empty list, depending on a boolean + value. Useful when building lists with optional elements + (e.g. \`++ optional (system == "i686-linux") firefox\`).", + "example": "optional true "foo" +=> [ "foo" ] +optional false "foo" +=> [ ]", + "fn_type": "optional :: bool -> a -> [a]", + "id": "lib.lists.optional", + "line": 255, + "name": "optional", + }, + { + "category": "./lib/lists.nix", + "description": "Return a list or an empty list, depending on a boolean value.", + "example": "optionals true [ 2 3 ] +=> [ 2 3 ] +optionals false [ 2 3 ] +=> [ ]", + "fn_type": "optionals :: bool -> [a] -> [a]", + "id": "lib.lists.optionals", + "line": 267, + "name": "optionals", + }, + { + "category": "./lib/lists.nix", + "description": "If argument is a list, return it; else, wrap it in a singleton + list. If you're using this, you should almost certainly + reconsider if there isn't a more "well-typed" approach.", + "example": "toList [ 1 2 ] +=> [ 1 2 ] +toList "hi" +=> [ "hi "]", + "fn_type": null, + "id": "lib.lists.toList", + "line": 284, + "name": "toList", + }, + { + "category": "./lib/lists.nix", + "description": "Return a list of integers from \`first\` up to and including \`last\`.", + "example": "range 2 4 +=> [ 2 3 4 ] +range 3 2 +=> [ ]", + "fn_type": "range :: int -> int -> [int]", + "id": "lib.lists.range", + "line": 297, + "name": "range", + }, + { + "category": "./lib/lists.nix", + "description": "Return a list with \`n\` copies of an element.", + "example": "replicate 3 "a" +=> [ "a" "a" "a" ] +replicate 2 true +=> [ true true ]", + "fn_type": "replicate :: int -> a -> [a]", + "id": "lib.lists.replicate", + "line": 316, + "name": "replicate", + }, + { + "category": "./lib/lists.nix", + "description": "Splits the elements of a list in two lists, \`right\` and + \`wrong\`, depending on the evaluation of a predicate.", + "example": "partition (x: x > 2) [ 5 1 2 3 4 ] +=> { right = [ 5 3 4 ]; wrong = [ 1 2 ]; }", + "fn_type": "(a -> bool) -> [a] -> { right :: [a]; wrong :: [a]; }", + "id": "lib.lists.partition", + "line": 327, + "name": "partition", + }, + { + "category": "./lib/lists.nix", + "description": "Splits the elements of a list into many lists, using the return value of a predicate. + Predicate should return a string which becomes keys of attrset \`groupBy\` returns. + + \`groupBy'\` allows to customise the combining function and initial value", + "example": "groupBy (x: boolToString (x > 2)) [ 5 1 2 3 4 ] +=> { true = [ 5 3 4 ]; false = [ 1 2 ]; } +groupBy (x: x.name) [ {name = "icewm"; script = "icewm &";} + {name = "xfce"; script = "xfce4-session &";} + {name = "icewm"; script = "icewmbg &";} + {name = "mate"; script = "gnome-session &";} + ] +=> { icewm = [ { name = "icewm"; script = "icewm &"; } + { name = "icewm"; script = "icewmbg &"; } ]; + mate = [ { name = "mate"; script = "gnome-session &"; } ]; + xfce = [ { name = "xfce"; script = "xfce4-session &"; } ]; + } + +groupBy' builtins.add 0 (x: boolToString (x > 2)) [ 5 1 2 3 4 ] +=> { true = 12; false = 3; }", + "fn_type": null, + "id": "lib.lists.groupBy'", + "line": 356, + "name": "groupBy'", + }, + { + "category": "./lib/lists.nix", + "description": "Merges two lists of the same size together. If the sizes aren't the same + the merging stops at the shortest. How both lists are merged is defined + by the first argument.", + "example": "zipListsWith (a: b: a + b) ["h" "l"] ["e" "o"] +=> ["he" "lo"]", + "fn_type": "zipListsWith :: (a -> b -> c) -> [a] -> [b] -> [c]", + "id": "lib.lists.zipListsWith", + "line": 376, + "name": "zipListsWith", + }, + { + "category": "./lib/lists.nix", + "description": "Merges two lists of the same size together. If the sizes aren't the same + the merging stops at the shortest.", + "example": "zipLists [ 1 2 ] [ "a" "b" ] +=> [ { fst = 1; snd = "a"; } { fst = 2; snd = "b"; } ]", + "fn_type": "zipLists :: [a] -> [b] -> [{ fst :: a; snd :: b; }]", + "id": "lib.lists.zipLists", + "line": 395, + "name": "zipLists", + }, + { + "category": "./lib/lists.nix", + "description": "Reverse the order of the elements of a list.", + "example": "reverseList [ "b" "o" "j" ] +=> [ "j" "o" "b" ]", + "fn_type": "reverseList :: [a] -> [a]", + "id": "lib.lists.reverseList", + "line": 406, + "name": "reverseList", + }, + { + "category": "./lib/lists.nix", + "description": "Depth-First Search (DFS) for lists \`list != []\`. + + \`before a b == true\` means that \`b\` depends on \`a\` (there's an + edge from \`b\` to \`a\`).", + "example": "listDfs true hasPrefix [ "/home/user" "other" "/" "/home" ] + == { minimal = "/"; # minimal element + visited = [ "/home/user" ]; # seen elements (in reverse order) + rest = [ "/home" "other" ]; # everything else + } + +listDfs true hasPrefix [ "/home/user" "other" "/" "/home" "/" ] + == { cycle = "/"; # cycle encountered at this element + loops = [ "/" ]; # and continues to these elements + visited = [ "/" "/home/user" ]; # elements leading to the cycle (in reverse order) + rest = [ "/home" "other" ]; # everything else", + "fn_type": null, + "id": "lib.lists.listDfs", + "line": 428, + "name": "listDfs", + }, + { + "category": "./lib/lists.nix", + "description": "Sort a list based on a partial ordering using DFS. This + implementation is O(N^2), if your ordering is linear, use \`sort\` + instead. + + \`before a b == true\` means that \`b\` should be after \`a\` + in the result.", + "example": "toposort hasPrefix [ "/home/user" "other" "/" "/home" ] + == { result = [ "/" "/home" "/home/user" "other" ]; } + +toposort hasPrefix [ "/home/user" "other" "/" "/home" "/" ] + == { cycle = [ "/home/user" "/" "/" ]; # path leading to a cycle + loops = [ "/" ]; } # loops back to these elements + +toposort hasPrefix [ "other" "/home/user" "/home" "/" ] + == { result = [ "other" "/" "/home" "/home/user" ]; } + +toposort (a: b: a < b) [ 3 2 1 ] == { result = [ 1 2 3 ]; }", + "fn_type": null, + "id": "lib.lists.toposort", + "line": 467, + "name": "toposort", + }, + { + "category": "./lib/lists.nix", + "description": "Sort a list based on a comparator function which compares two + elements and returns true if the first argument is strictly below + the second argument. The returned list is sorted in an increasing + order. The implementation does a quick-sort.", + "example": "sort (a: b: a < b) [ 5 3 7 ] +=> [ 3 5 7 ]", + "fn_type": null, + "id": "lib.lists.sort", + "line": 495, + "name": "sort", + }, + { + "category": "./lib/lists.nix", + "description": "Compare two lists element-by-element.", + "example": "compareLists compare [] [] +=> 0 +compareLists compare [] [ "a" ] +=> -1 +compareLists compare [ "a" ] [] +=> 1 +compareLists compare [ "a" "b" ] [ "a" "c" ] +=> -1", + "fn_type": null, + "id": "lib.lists.compareLists", + "line": 524, + "name": "compareLists", + }, + { + "category": "./lib/lists.nix", + "description": "Sort list using "Natural sorting". + Numeric portions of strings are sorted in numeric order.", + "example": "naturalSort ["disk11" "disk8" "disk100" "disk9"] +=> ["disk8" "disk9" "disk11" "disk100"] +naturalSort ["10.46.133.149" "10.5.16.62" "10.54.16.25"] +=> ["10.5.16.62" "10.46.133.149" "10.54.16.25"] +naturalSort ["v0.2" "v0.15" "v0.0.9"] +=> [ "v0.0.9" "v0.2" "v0.15" ]", + "fn_type": null, + "id": "lib.lists.naturalSort", + "line": 547, + "name": "naturalSort", + }, + { + "category": "./lib/lists.nix", + "description": "Return the first (at most) N elements of a list.", + "example": "take 2 [ "a" "b" "c" "d" ] +=> [ "a" "b" ] +take 2 [ ] +=> [ ]", + "fn_type": "take :: int -> [a] -> [a]", + "id": "lib.lists.take", + "line": 566, + "name": "take", + }, + { + "category": "./lib/lists.nix", + "description": "Remove the first (at most) N elements of a list.", + "example": "drop 2 [ "a" "b" "c" "d" ] +=> [ "c" "d" ] +drop 2 [ ] +=> [ ]", + "fn_type": "drop :: int -> [a] -> [a]", + "id": "lib.lists.drop", + "line": 580, + "name": "drop", + }, + { + "category": "./lib/lists.nix", + "description": "Return a list consisting of at most \`count\` elements of \`list\`, + starting at index \`start\`.", + "example": "sublist 1 3 [ "a" "b" "c" "d" "e" ] +=> [ "b" "c" "d" ] +sublist 1 3 [ ] +=> [ ]", + "fn_type": "sublist :: int -> int -> [a] -> [a]", + "id": "lib.lists.sublist", + "line": 596, + "name": "sublist", + }, + { + "category": "./lib/lists.nix", + "description": "Return the last element of a list. + + This function throws an error if the list is empty.", + "example": "last [ 1 2 3 ] +=> 3", + "fn_type": "last :: [a] -> a", + "id": "lib.lists.last", + "line": 620, + "name": "last", + }, + { + "category": "./lib/lists.nix", + "description": "Return all elements but the last. + + This function throws an error if the list is empty.", + "example": "init [ 1 2 3 ] +=> [ 1 2 ]", + "fn_type": "init :: [a] -> [a]", + "id": "lib.lists.init", + "line": 634, + "name": "init", + }, + { + "category": "./lib/lists.nix", + "description": "Return the image of the cross product of some lists by a function.", + "example": "crossLists (x:y: "\${toString x}\${toString y}") [[1 2] [3 4]] +=> [ "13" "14" "23" "24" ]", + "fn_type": null, + "id": "lib.lists.crossLists", + "line": 645, + "name": "crossLists", + }, + { + "category": "./lib/lists.nix", + "description": "Remove duplicate elements from the list. O(n^2) complexity.", + "example": "unique [ 3 2 3 4 ] +=> [ 3 2 4 ]", + "fn_type": "unique :: [a] -> [a]", + "id": "lib.lists.unique", + "line": 658, + "name": "unique", + }, + { + "category": "./lib/lists.nix", + "description": "Intersects list 'e' and another list. O(nm) complexity.", + "example": "intersectLists [ 1 2 3 ] [ 6 3 2 ] +=> [ 3 2 ]", + "fn_type": null, + "id": "lib.lists.intersectLists", + "line": 666, + "name": "intersectLists", + }, + { + "category": "./lib/lists.nix", + "description": "Subtracts list 'e' from another list. O(nm) complexity.", + "example": "subtractLists [ 3 2 ] [ 1 2 3 4 5 3 ] +=> [ 1 4 5 ]", + "fn_type": null, + "id": "lib.lists.subtractLists", + "line": 674, + "name": "subtractLists", + }, + { + "category": "./lib/lists.nix", + "description": "Test if two lists have no common element. + It should be slightly more efficient than (intersectLists a b == [])", + "example": null, + "fn_type": null, + "id": "lib.lists.mutuallyExclusive", + "line": 679, + "name": "mutuallyExclusive", + }, + { + "category": "./lib/licenses.nix", + "description": "License identifiers from spdx.org where possible. + * If you cannot find your license here, then look for a similar license or + * add it to this list. The URL mentioned above is a good source for inspiration.", + "example": null, + "fn_type": null, + "id": "lib.licenses.abstyles", + "line": 28, + "name": "abstyles", + }, + { + "category": "./lib/kernel.nix", + "description": "Common patterns/legacy used in common-config/hardened/config.nix", + "example": null, + "fn_type": null, + "id": "lib.kernel.whenHelpers", + "line": 19, + "name": "whenHelpers", + }, + { + "category": "./lib/generators.nix", + "description": "Convert a value to a sensible default string representation. + * The builtin \`toString\` function has some strange defaults, + * suitable for bash scripts but not much else.", + "example": null, + "fn_type": null, + "id": "lib.generators.mkValueStringDefault", + "line": 33, + "name": "mkValueStringDefault", + }, + { + "category": "./lib/generators.nix", + "description": "Generate a line of key k and value v, separated by + * character sep. If sep appears in k, it is escaped. + * Helper for synaxes with different separators. + * + * mkValueString specifies how values should be formatted. + * + * mkKeyValueDefault {} ":" "f:oo" "bar" + * > "f\\:oo:bar"", + "example": null, + "fn_type": null, + "id": "lib.generators.mkKeyValueDefault", + "line": 69, + "name": "mkKeyValueDefault", + }, + { + "category": "./lib/generators.nix", + "description": "Generate a key-value-style config file from an attrset. + * + * mkKeyValue is the same as in toINI.", + "example": null, + "fn_type": null, + "id": "lib.generators.toKeyValue", + "line": 82, + "name": "toKeyValue", + }, + { + "category": "./lib/generators.nix", + "description": "Generate an INI-style config file from an + * attrset of sections to an attrset of key-value pairs. + * + * generators.toINI {} { + * foo = { hi = "\${pkgs.hello}"; ciao = "bar"; }; + * baz = { "also, integers" = 42; }; + * } + * + *> [baz] + *> also, integers=42 + *> + *> [foo] + *> ciao=bar + *> hi=/nix/store/y93qql1p5ggfnaqjjqhxcw0vqw95rlz0-hello-2.10 + * + * The mk* configuration attributes can generically change + * the way sections and key-value strings are generated. + * + * For more examples see the test cases in ./tests/misc.nix.", + "example": null, + "fn_type": null, + "id": "lib.generators.toINI", + "line": 113, + "name": "toINI", + }, + { + "category": "./lib/generators.nix", + "description": "Generate an INI-style config file from an attrset + * specifying the global section (no header), and an + * attrset of sections to an attrset of key-value pairs. + * + * generators.toINIWithGlobalSection {} { + * globalSection = { + * someGlobalKey = "hi"; + * }; + * sections = { + * foo = { hi = "\${pkgs.hello}"; ciao = "bar"; }; + * baz = { "also, integers" = 42; }; + * } + * + *> someGlobalKey=hi + *> + *> [baz] + *> also, integers=42 + *> + *> [foo] + *> ciao=bar + *> hi=/nix/store/y93qql1p5ggfnaqjjqhxcw0vqw95rlz0-hello-2.10 + * + * The mk* configuration attributes can generically change + * the way sections and key-value strings are generated. + * + * For more examples see the test cases in ./tests/misc.nix. + * + * If you don’t need a global section, you can also use + * \`generators.toINI\` directly, which only takes + * the part in \`sections\`.", + "example": null, + "fn_type": null, + "id": "lib.generators.toINIWithGlobalSection", + "line": 164, + "name": "toINIWithGlobalSection", + }, + { + "category": "./lib/generators.nix", + "description": "Generate a git-config file from an attrset. + * + * It has two major differences from the regular INI format: + * + * 1. values are indented with tabs + * 2. sections can have sub-sections + * + * generators.toGitINI { + * url."ssh://git@github.com/".insteadOf = "https://github.com"; + * user.name = "edolstra"; + * } + * + *> [url "ssh://git@github.com/"] + *> insteadOf = https://github.com/ + *> + *> [user] + *> name = edolstra", + "example": null, + "fn_type": null, + "id": "lib.generators.toGitINI", + "line": 196, + "name": "toGitINI", + }, + { + "category": "./lib/generators.nix", + "description": "Generates JSON from an arbitrary (non-function) value. + * For more information see the documentation of the builtin.", + "example": null, + "fn_type": null, + "id": "lib.generators.toJSON", + "line": 235, + "name": "toJSON", + }, + { + "category": "./lib/generators.nix", + "description": "YAML has been a strict superset of JSON since 1.2, so we + * use toJSON. Before it only had a few differences referring + * to implicit typing rules, so it should work with older + * parsers as well.", + "example": null, + "fn_type": null, + "id": "lib.generators.toYAML", + "line": 243, + "name": "toYAML", + }, + { + "category": "./lib/generators.nix", + "description": "Pretty print a value, akin to \`builtins.trace\`. + * Should probably be a builtin as well. + * The pretty-printed string should be suitable for rendering default values + * in the NixOS manual. In particular, it should be as close to a valid Nix expression + * as possible.", + "example": null, + "fn_type": null, + "id": "lib.generators.toPretty", + "line": 286, + "name": "toPretty", + }, + { + "category": "./lib/generators.nix", + "description": "Translate a simple Nix expression to Dhall notation. + * Note that integers are translated to Integer and never + * the Natural type.", + "example": null, + "fn_type": null, + "id": "lib.generators.toDhall", + "line": 409, + "name": "toDhall", + }, + { + "category": "./lib/filesystem.nix", + "description": "A map of all haskell packages defined in the given path, +identified by having a cabal file with the same name as the +directory itself.", + "example": null, + "fn_type": "Path -> Map String Path", + "id": "lib.filesystem.haskellPathsInDir", + "line": 18, + "name": "haskellPathsInDir", + }, + { + "category": "./lib/filesystem.nix", + "description": "Find the first directory containing a file matching 'pattern' +upward from a given 'file'. +Returns 'null' if no directories contain a file matching 'pattern'.", + "example": null, + "fn_type": "RegExp -> Path -> Nullable { path : Path; matches : [ MatchResults ]; }", + "id": "lib.filesystem.locateDominatingFile", + "line": 41, + "name": "locateDominatingFile", + }, + { + "category": "./lib/filesystem.nix", + "description": "Given a directory, return a flattened list of all files within it recursively.", + "example": null, + "fn_type": "Path -> [ Path ]", + "id": "lib.filesystem.listFilesRecursive", + "line": 69, + "name": "listFilesRecursive", + }, + { + "category": "./lib/derivations.nix", + "description": "Restrict a derivation to a predictable set of attribute names, so +that the returned attrset is not strict in the actual derivation, +saving a lot of computation when the derivation is non-trivial. + +This is useful in situations where a derivation might only be used for its +passthru attributes, improving evaluation performance. + +The returned attribute set is lazy in \`derivation\`. Specifically, this +means that the derivation will not be evaluated in at least the +situations below. + +For illustration and/or testing, we define derivation such that its +evaluation is very noticeable. + + let derivation = throw "This won't be evaluated."; + +In the following expressions, \`derivation\` will _not_ be evaluated: + + (lazyDerivation { inherit derivation; }).type + + attrNames (lazyDerivation { inherit derivation; }) + + (lazyDerivation { inherit derivation; } // { foo = true; }).foo + + (lazyDerivation { inherit derivation; meta.foo = true; }).meta + +In these expressions, it \`derivation\` _will_ be evaluated: + + "\${lazyDerivation { inherit derivation }}" + + (lazyDerivation { inherit derivation }).outPath + + (lazyDerivation { inherit derivation }).meta + +And the following expressions are not valid, because the refer to +implementation details and/or attributes that may not be present on +some derivations: + + (lazyDerivation { inherit derivation }).buildInputs + + (lazyDerivation { inherit derivation }).passthru + + (lazyDerivation { inherit derivation }).pythonPath", + "example": null, + "fn_type": null, + "id": "lib.derivations.lazyDerivation", + "line": 53, + "name": "lazyDerivation", + }, + { + "category": "./lib/deprecated.nix", + "description": "deprecated: + + For historical reasons, imap has an index starting at 1. + + But for consistency with the rest of the library we want an index + starting at zero.", + "example": null, + "fn_type": null, + "id": "lib.deprecated.imap", + "line": 301, + "name": "imap", + }, + { + "category": "./lib/debug.nix", + "description": "Conditionally trace the supplied message, based on a predicate.", + "example": "traceIf true "hello" 3 +trace: hello +=> 3", + "fn_type": "traceIf :: bool -> string -> a -> a", + "id": "lib.debug.traceIf", + "line": 51, + "name": "traceIf", + }, + { + "category": "./lib/debug.nix", + "description": "Trace the supplied value after applying a function to it, and + return the original value.", + "example": "traceValFn (v: "mystring \${v}") "foo" +trace: mystring foo +=> "foo"", + "fn_type": "traceValFn :: (a -> b) -> a -> a", + "id": "lib.debug.traceValFn", + "line": 69, + "name": "traceValFn", + }, + { + "category": "./lib/debug.nix", + "description": "Trace the supplied value and return it.", + "example": "traceVal 42 +# trace: 42 +=> 42", + "fn_type": "traceVal :: a -> a", + "id": "lib.debug.traceVal", + "line": 84, + "name": "traceVal", + }, + { + "category": "./lib/debug.nix", + "description": "\`builtins.trace\`, but the value is \`builtins.deepSeq\`ed first.", + "example": "trace { a.b.c = 3; } null +trace: { a = ; } +=> null +traceSeq { a.b.c = 3; } null +trace: { a = { b = { c = 3; }; }; } +=> null", + "fn_type": "traceSeq :: a -> b -> b", + "id": "lib.debug.traceSeq", + "line": 98, + "name": "traceSeq", + }, + { + "category": "./lib/debug.nix", + "description": "Like \`traceSeq\`, but only evaluate down to depth n. + This is very useful because lots of \`traceSeq\` usages + lead to an infinite recursion.", + "example": "traceSeqN 2 { a.b.c = 3; } null +trace: { a = { b = {…}; }; } +=> null", + "fn_type": "traceSeqN :: Int -> a -> b -> b", + "id": "lib.debug.traceSeqN", + "line": 115, + "name": "traceSeqN", + }, + { + "category": "./lib/debug.nix", + "description": "A combination of \`traceVal\` and \`traceSeq\` that applies a + provided function to the value to be traced after \`deepSeq\`ing + it.", + "example": null, + "fn_type": null, + "id": "lib.debug.traceValSeqFn", + "line": 132, + "name": "traceValSeqFn", + }, + { + "category": "./lib/debug.nix", + "description": "A combination of \`traceVal\` and \`traceSeq\`.", + "example": null, + "fn_type": null, + "id": "lib.debug.traceValSeq", + "line": 139, + "name": "traceValSeq", + }, + { + "category": "./lib/debug.nix", + "description": "A combination of \`traceVal\` and \`traceSeqN\` that applies a + provided function to the value to be traced.", + "example": null, + "fn_type": null, + "id": "lib.debug.traceValSeqNFn", + "line": 143, + "name": "traceValSeqNFn", + }, + { + "category": "./lib/debug.nix", + "description": "A combination of \`traceVal\` and \`traceSeqN\`.", + "example": null, + "fn_type": null, + "id": "lib.debug.traceValSeqN", + "line": 151, + "name": "traceValSeqN", + }, + { + "category": "./lib/debug.nix", + "description": "Trace the input and output of a function \`f\` named \`name\`, + both down to \`depth\`. + + This is useful for adding around a function call, + to see the before/after of values as they are transformed.", + "example": "traceFnSeqN 2 "id" (x: x) { a.b.c = 3; } +trace: { fn = "id"; from = { a.b = {…}; }; to = { a.b = {…}; }; } +=> { a.b.c = 3; }", + "fn_type": null, + "id": "lib.debug.traceFnSeqN", + "line": 164, + "name": "traceFnSeqN", + }, + { + "category": "./lib/debug.nix", + "description": "Evaluates a set of tests. + + A test is an attribute set \`{expr, expected}\`, + denoting an expression and its expected result. + + The result is a \`list\` of __failed tests__, each represented as + \`{name, expected, result}\`, + + - expected + - What was passed as \`expected\` + - result + - The actual \`result\` of the test + + Used for regression testing of the functions in lib; see + tests.nix for more examples. + + Important: Only attributes that start with \`test\` are executed. + + - If you want to run only a subset of the tests add the attribute \`tests = ["testName"];\`", + "example": "runTests { + testAndOk = { + expr = lib.and true false; + expected = false; + }; + testAndFail = { + expr = lib.and true false; + expected = true; + }; +} +-> +[ + { + name = "testAndFail"; + expected = true; + result = false; + } +]", + "fn_type": "runTests :: { + tests = [ String ]; + \${testName} :: { + expr :: a; + expected :: a; + }; +} +-> +[ + { + name :: String; + expected :: a; + result :: a; + } +]", + "id": "lib.debug.runTests", + "line": 237, + "name": "runTests", + }, + { + "category": "./lib/debug.nix", + "description": "Create a test assuming that list elements are \`true\`.", + "example": "{ testX = allTrue [ true ]; }", + "fn_type": null, + "id": "lib.debug.testAllTrue", + "line": 252, + "name": "testAllTrue", + }, + { + "category": "./lib/customisation.nix", + "description": "\`overrideDerivation drv f\` takes a derivation (i.e., the result + of a call to the builtin function \`derivation\`) and returns a new + derivation in which the attributes of the original are overridden + according to the function \`f\`. The function \`f\` is called with + the original derivation attributes. + + \`overrideDerivation\` allows certain "ad-hoc" customisation + scenarios (e.g. in ~/.config/nixpkgs/config.nix). For instance, + if you want to "patch" the derivation returned by a package + function in Nixpkgs to build another version than what the + function itself provides, you can do something like this: + + mySed = overrideDerivation pkgs.gnused (oldAttrs: { + name = "sed-4.2.2-pre"; + src = fetchurl { + url = ftp://alpha.gnu.org/gnu/sed/sed-4.2.2-pre.tar.bz2; + sha256 = "11nq06d131y4wmf3drm0yk502d2xc6n5qy82cg88rb9nqd2lj41k"; + }; + patches = []; + }); + + For another application, see build-support/vm, where this + function is used to build arbitrary derivations inside a QEMU + virtual machine. + + Note that in order to preserve evaluation errors, the new derivation's + outPath depends on the old one's, which means that this function cannot + be used in circular situations when the old derivation also depends on the + new one. + + You should in general prefer \`drv.overrideAttrs\` over this function; + see the nixpkgs manual for more information on overriding.", + "example": null, + "fn_type": null, + "id": "lib.customisation.overrideDerivation", + "line": 39, + "name": "overrideDerivation", + }, + { + "category": "./lib/customisation.nix", + "description": "\`makeOverridable\` takes a function from attribute set to attribute set and + injects \`override\` attribute which can be used to override arguments of + the function. + + nix-repl> x = {a, b}: { result = a + b; } + + nix-repl> y = lib.makeOverridable x { a = 1; b = 2; } + + nix-repl> y + { override = «lambda»; overrideDerivation = «lambda»; result = 3; } + + nix-repl> y.override { a = 10; } + { override = «lambda»; overrideDerivation = «lambda»; result = 12; } + + Please refer to "Nixpkgs Contributors Guide" section + ".overrideDerivation" to learn about \`overrideDerivation\` and caveats + related to its use.", + "example": null, + "fn_type": null, + "id": "lib.customisation.makeOverridable", + "line": 78, + "name": "makeOverridable", + }, + { + "category": "./lib/customisation.nix", + "description": "Call the package function in the file \`fn\` with the required + arguments automatically. The function is called with the + arguments \`args\`, but any missing arguments are obtained from + \`autoArgs\`. This function is intended to be partially + parameterised, e.g., + + callPackage = callPackageWith pkgs; + pkgs = { + libfoo = callPackage ./foo.nix { }; + libbar = callPackage ./bar.nix { }; + }; + + If the \`libbar\` function expects an argument named \`libfoo\`, it is + automatically passed as an argument. Overrides or missing + arguments can be supplied in \`args\`, e.g. + + libbar = callPackage ./bar.nix { + libfoo = null; + enableX11 = true; + };", + "example": null, + "fn_type": null, + "id": "lib.customisation.callPackageWith", + "line": 128, + "name": "callPackageWith", + }, + { + "category": "./lib/customisation.nix", + "description": "Like callPackage, but for a function that returns an attribute + set of derivations. The override function is added to the + individual attributes.", + "example": null, + "fn_type": null, + "id": "lib.customisation.callPackagesWith", + "line": 185, + "name": "callPackagesWith", + }, + { + "category": "./lib/customisation.nix", + "description": "Add attributes to each output of a derivation without changing + the derivation itself and check a given condition when evaluating.", + "example": null, + "fn_type": null, + "id": "lib.customisation.extendDerivation", + "line": 202, + "name": "extendDerivation", + }, + { + "category": "./lib/customisation.nix", + "description": "Strip a derivation of all non-essential attributes, returning + only those needed by hydra-eval-jobs. Also strictly evaluate the + result to ensure that there are no thunks kept alive to prevent + garbage collection.", + "example": null, + "fn_type": null, + "id": "lib.customisation.hydraJob", + "line": 229, + "name": "hydraJob", + }, + { + "category": "./lib/customisation.nix", + "description": "Make a set of packages with a common scope. All packages called + with the provided \`callPackage\` will be evaluated with the same + arguments. Any package in the set may depend on any other. The + \`overrideScope'\` function allows subsequent modification of the package + set in a consistent way, i.e. all packages in the set will be + called with the overridden packages. The package sets may be + hierarchical: the packages in the set are called with the scope + provided by \`newScope\` and the set provides a \`newScope\` attribute + which can form the parent scope for later package sets.", + "example": null, + "fn_type": null, + "id": "lib.customisation.makeScope", + "line": 267, + "name": "makeScope", + }, + { + "category": "./lib/customisation.nix", + "description": "Like the above, but aims to support cross compilation. It's still ugly, but + hopefully it helps a little bit.", + "example": null, + "fn_type": null, + "id": "lib.customisation.makeScopeWithSplicing", + "line": 281, + "name": "makeScopeWithSplicing", + }, + { + "category": "./lib/cli.nix", + "description": "Automatically convert an attribute set to command-line options. + + This helps protect against malformed command lines and also to reduce + boilerplate related to command-line construction for simple use cases. + + \`toGNUCommandLine\` returns a list of nix strings. + \`toGNUCommandLineShell\` returns an escaped shell string.", + "example": "cli.toGNUCommandLine {} { + data = builtins.toJSON { id = 0; }; + X = "PUT"; + retry = 3; + retry-delay = null; + url = [ "https://example.com/foo" "https://example.com/bar" ]; + silent = false; + verbose = true; +} +=> [ + "-X" "PUT" + "--data" "{\\"id\\":0}" + "--retry" "3" + "--url" "https://example.com/foo" + "--url" "https://example.com/bar" + "--verbose" +] + +cli.toGNUCommandLineShell {} { + data = builtins.toJSON { id = 0; }; + X = "PUT"; + retry = 3; + retry-delay = null; + url = [ "https://example.com/foo" "https://example.com/bar" ]; + silent = false; + verbose = true; +} +=> "'-X' 'PUT' '--data' '{\\"id\\":0}' '--retry' '3' '--url' 'https://example.com/foo' '--url' 'https://example.com/bar' '--verbose'";", + "fn_type": null, + "id": "lib.cli.toGNUCommandLineShell", + "line": 42, + "name": "toGNUCommandLineShell", + }, + { + "category": "./lib/attrsets.nix", + "description": "Return an attribute from nested attribute sets.", + "example": "x = { a = { b = 3; }; } +# ["a" "b"] is equivalent to x.a.b +# 6 is a default value to return if the path does not exist in attrset +attrByPath ["a" "b"] 6 x +=> 3 +attrByPath ["z" "z"] 6 x +=> 6", + "fn_type": "attrByPath :: [String] -> Any -> AttrSet -> Any", + "id": "lib.attrsets.attrByPath", + "line": 30, + "name": "attrByPath", + }, + { + "category": "./lib/attrsets.nix", + "description": "Return if an attribute from nested attribute set exists.", + "example": "x = { a = { b = 3; }; } +hasAttrByPath ["a" "b"] x +=> true +hasAttrByPath ["z" "z"] x +=> false", + "fn_type": "hasAttrByPath :: [String] -> AttrSet -> Bool", + "id": "lib.attrsets.hasAttrByPath", + "line": 56, + "name": "hasAttrByPath", + }, + { + "category": "./lib/attrsets.nix", + "description": "Create a new attribute set with \`value\` set at the nested attribute location specified in \`attrPath\`.", + "example": "setAttrByPath ["a" "b"] 3 +=> { a = { b = 3; }; }", + "fn_type": "setAttrByPath :: [String] -> Any -> AttrSet", + "id": "lib.attrsets.setAttrByPath", + "line": 78, + "name": "setAttrByPath", + }, + { + "category": "./lib/attrsets.nix", + "description": "Like \`attrByPath\`, but without a default value. If it doesn't find the + path it will throw an error.", + "example": "x = { a = { b = 3; }; } +getAttrFromPath ["a" "b"] x +=> 3 +getAttrFromPath ["z" "z"] x +=> error: cannot find attribute \`z.z'", + "fn_type": "getAttrFromPath :: [String] -> AttrSet -> Any", + "id": "lib.attrsets.getAttrFromPath", + "line": 104, + "name": "getAttrFromPath", + }, + { + "category": "./lib/attrsets.nix", + "description": "Map each attribute in the given set and merge them into a new attribute set.", + "example": "concatMapAttrs + (name: value: { + \${name} = value; + \${name + value} = value; + }) + { x = "a"; y = "b"; } +=> { x = "a"; xa = "a"; y = "b"; yb = "b"; }", + "fn_type": "concatMapAttrs :: (String -> a -> AttrSet) -> AttrSet -> AttrSet", + "id": "lib.attrsets.concatMapAttrs", + "line": 126, + "name": "concatMapAttrs", + }, + { + "category": "./lib/attrsets.nix", + "description": "Update or set specific paths of an attribute set. + + Takes a list of updates to apply and an attribute set to apply them to, + and returns the attribute set with the updates applied. Updates are + represented as \`{ path = ...; update = ...; }\` values, where \`path\` is a + list of strings representing the attribute path that should be updated, + and \`update\` is a function that takes the old value at that attribute path + as an argument and returns the new + value it should be. + + Properties: + + - Updates to deeper attribute paths are applied before updates to more + shallow attribute paths + + - Multiple updates to the same attribute path are applied in the order + they appear in the update list + + - If any but the last \`path\` element leads into a value that is not an + attribute set, an error is thrown + + - If there is an update for an attribute path that doesn't exist, + accessing the argument in the update function causes an error, but + intermediate attribute sets are implicitly created as needed", + "example": "updateManyAttrsByPath [ + { + path = [ "a" "b" ]; + update = old: { d = old.c; }; + } + { + path = [ "a" "b" "c" ]; + update = old: old + 1; + } + { + path = [ "x" "y" ]; + update = old: "xy"; + } +] { a.b.c = 0; } +=> { a = { b = { d = 1; }; }; x = { y = "xy"; }; }", + "fn_type": "updateManyAttrsByPath :: [{ path :: [String]; update :: (Any -> Any); }] -> AttrSet -> AttrSet", + "id": "lib.attrsets.updateManyAttrsByPath", + "line": 173, + "name": "updateManyAttrsByPath", + }, + { + "category": "./lib/attrsets.nix", + "description": "Return the specified attributes from a set.", + "example": "attrVals ["a" "b" "c"] as +=> [as.a as.b as.c]", + "fn_type": "attrVals :: [String] -> AttrSet -> [Any]", + "id": "lib.attrsets.attrVals", + "line": 241, + "name": "attrVals", + }, + { + "category": "./lib/attrsets.nix", + "description": "Return the values of all attributes in the given set, sorted by + attribute name.", + "example": "attrValues {c = 3; a = 1; b = 2;} +=> [1 2 3]", + "fn_type": "attrValues :: AttrSet -> [Any]", + "id": "lib.attrsets.attrValues", + "line": 258, + "name": "attrValues", + }, + { + "category": "./lib/attrsets.nix", + "description": "Given a set of attribute names, return the set of the corresponding + attributes from the given set.", + "example": "getAttrs [ "a" "b" ] { a = 1; b = 2; c = 3; } +=> { a = 1; b = 2; }", + "fn_type": "getAttrs :: [String] -> AttrSet -> AttrSet", + "id": "lib.attrsets.getAttrs", + "line": 271, + "name": "getAttrs", + }, + { + "category": "./lib/attrsets.nix", + "description": "Collect each attribute named \`attr\` from a list of attribute + sets. Sets that don't contain the named attribute are ignored.", + "example": "catAttrs "a" [{a = 1;} {b = 0;} {a = 2;}] +=> [1 2]", + "fn_type": "catAttrs :: String -> [AttrSet] -> [Any]", + "id": "lib.attrsets.catAttrs", + "line": 287, + "name": "catAttrs", + }, + { + "category": "./lib/attrsets.nix", + "description": "Filter an attribute set by removing all attributes for which the + given predicate return false.", + "example": "filterAttrs (n: v: n == "foo") { foo = 1; bar = 2; } +=> { foo = 1; }", + "fn_type": "filterAttrs :: (String -> Any -> Bool) -> AttrSet -> AttrSet", + "id": "lib.attrsets.filterAttrs", + "line": 301, + "name": "filterAttrs", + }, + { + "category": "./lib/attrsets.nix", + "description": "Filter an attribute set recursively by removing all attributes for + which the given predicate return false.", + "example": "filterAttrsRecursive (n: v: v != null) { foo = { bar = null; }; } +=> { foo = {}; }", + "fn_type": "filterAttrsRecursive :: (String -> Any -> Bool) -> AttrSet -> AttrSet", + "id": "lib.attrsets.filterAttrsRecursive", + "line": 319, + "name": "filterAttrsRecursive", + }, + { + "category": "./lib/attrsets.nix", + "description": "Apply fold functions to values grouped by key.", + "example": "foldAttrs (item: acc: [item] ++ acc) [] [{ a = 2; } { a = 3; }] +=> { a = [ 2 3 ]; }", + "fn_type": "foldAttrs :: (Any -> Any -> Any) -> Any -> [AttrSets] -> Any", + "id": "lib.attrsets.foldAttrs", + "line": 346, + "name": "foldAttrs", + }, + { + "category": "./lib/attrsets.nix", + "description": "Recursively collect sets that verify a given predicate named \`pred\` + from the set \`attrs\`. The recursion is stopped when the predicate is + verified.", + "example": "collect isList { a = { b = ["b"]; }; c = [1]; } +=> [["b"] [1]] + +collect (x: x ? outPath) + { a = { outPath = "a/"; }; b = { outPath = "b/"; }; } +=> [{ outPath = "a/"; } { outPath = "b/"; }]", + "fn_type": "collect :: (AttrSet -> Bool) -> AttrSet -> [x]", + "id": "lib.attrsets.collect", + "line": 375, + "name": "collect", + }, + { + "category": "./lib/attrsets.nix", + "description": "Return the cartesian product of attribute set value combinations.", + "example": "cartesianProductOfSets { a = [ 1 2 ]; b = [ 10 20 ]; } +=> [ + { a = 1; b = 10; } + { a = 1; b = 20; } + { a = 2; b = 10; } + { a = 2; b = 20; } + ]", + "fn_type": "cartesianProductOfSets :: AttrSet -> [AttrSet]", + "id": "lib.attrsets.cartesianProductOfSets", + "line": 400, + "name": "cartesianProductOfSets", + }, + { + "category": "./lib/attrsets.nix", + "description": "Utility function that creates a \`{name, value}\` pair as expected by \`builtins.listToAttrs\`.", + "example": "nameValuePair "some" 6 +=> { name = "some"; value = 6; }", + "fn_type": "nameValuePair :: String -> Any -> { name :: String; value :: Any; }", + "id": "lib.attrsets.nameValuePair", + "line": 419, + "name": "nameValuePair", + }, + { + "category": "./lib/attrsets.nix", + "description": "Apply a function to each element in an attribute set, creating a new attribute set.", + "example": "mapAttrs (name: value: name + "-" + value) + { x = "foo"; y = "bar"; } +=> { x = "x-foo"; y = "y-bar"; }", + "fn_type": "mapAttrs :: (String -> Any -> Any) -> AttrSet -> AttrSet", + "id": "lib.attrsets.mapAttrs", + "line": 437, + "name": "mapAttrs", + }, + { + "category": "./lib/attrsets.nix", + "description": "Like \`mapAttrs\`, but allows the name of each attribute to be + changed in addition to the value. The applied function should + return both the new name and value as a \`nameValuePair\`.", + "example": "mapAttrs' (name: value: nameValuePair ("foo_" + name) ("bar-" + value)) + { x = "a"; y = "b"; } +=> { foo_x = "bar-a"; foo_y = "bar-b"; }", + "fn_type": "mapAttrs' :: (String -> Any -> { name :: String; value :: Any; }) -> AttrSet -> AttrSet", + "id": "lib.attrsets.mapAttrs'", + "line": 454, + "name": "mapAttrs'", + }, + { + "category": "./lib/attrsets.nix", + "description": "Call a function for each attribute in the given set and return + the result in a list.", + "example": "mapAttrsToList (name: value: name + value) + { x = "a"; y = "b"; } +=> [ "xa" "yb" ]", + "fn_type": "mapAttrsToList :: (String -> a -> b) -> AttrSet -> [b]", + "id": "lib.attrsets.mapAttrsToList", + "line": 474, + "name": "mapAttrsToList", + }, + { + "category": "./lib/attrsets.nix", + "description": "Like \`mapAttrs\`, except that it recursively applies itself to + the *leaf* attributes of a potentially-nested attribute set: + the second argument of the function will never be an attrset. + Also, the first argument of the argument function is a *list* + of the attribute names that form the path to the leaf attribute. + + For a function that gives you control over what counts as a leaf, + see \`mapAttrsRecursiveCond\`.", + "example": "mapAttrsRecursive (path: value: concatStringsSep "-" (path ++ [value])) + { n = { a = "A"; m = { b = "B"; c = "C"; }; }; d = "D"; } +=> { n = { a = "n-a-A"; m = { b = "n-m-b-B"; c = "n-m-c-C"; }; }; d = "d-D"; }", + "fn_type": "mapAttrsRecursive :: ([String] -> a -> b) -> AttrSet -> AttrSet", + "id": "lib.attrsets.mapAttrsRecursive", + "line": 499, + "name": "mapAttrsRecursive", + }, + { + "category": "./lib/attrsets.nix", + "description": "Like \`mapAttrsRecursive\`, but it takes an additional predicate + function that tells it whether to recurse into an attribute + set. If it returns false, \`mapAttrsRecursiveCond\` does not + recurse, but does apply the map function. If it returns true, it + does recurse, and does not apply the map function.", + "example": "# To prevent recursing into derivations (which are attribute +# sets with the attribute "type" equal to "derivation"): +mapAttrsRecursiveCond + (as: !(as ? "type" && as.type == "derivation")) + (x: ... do something ...) + attrs", + "fn_type": "mapAttrsRecursiveCond :: (AttrSet -> Bool) -> ([String] -> a -> b) -> AttrSet -> AttrSet", + "id": "lib.attrsets.mapAttrsRecursiveCond", + "line": 524, + "name": "mapAttrsRecursiveCond", + }, + { + "category": "./lib/attrsets.nix", + "description": "Generate an attribute set by mapping a function over a list of + attribute names.", + "example": "genAttrs [ "foo" "bar" ] (name: "x_" + name) +=> { foo = "x_foo"; bar = "x_bar"; }", + "fn_type": "genAttrs :: [ String ] -> (String -> Any) -> AttrSet", + "id": "lib.attrsets.genAttrs", + "line": 553, + "name": "genAttrs", + }, + { + "category": "./lib/attrsets.nix", + "description": "Check whether the argument is a derivation. Any set with + \`{ type = "derivation"; }\` counts as a derivation.", + "example": "nixpkgs = import {} +isDerivation nixpkgs.ruby +=> true +isDerivation "foobar" +=> false", + "fn_type": "isDerivation :: Any -> Bool", + "id": "lib.attrsets.isDerivation", + "line": 574, + "name": "isDerivation", + }, + { + "category": "./lib/attrsets.nix", + "description": "Converts a store path to a fake derivation.", + "example": null, + "fn_type": "toDerivation :: Path -> Derivation", + "id": "lib.attrsets.toDerivation", + "line": 583, + "name": "toDerivation", + }, + { + "category": "./lib/attrsets.nix", + "description": "If \`cond\` is true, return the attribute set \`as\`, + otherwise an empty attribute set.", + "example": "optionalAttrs (true) { my = "set"; } +=> { my = "set"; } +optionalAttrs (false) { my = "set"; } +=> { }", + "fn_type": "optionalAttrs :: Bool -> AttrSet -> AttrSet", + "id": "lib.attrsets.optionalAttrs", + "line": 611, + "name": "optionalAttrs", + }, + { + "category": "./lib/attrsets.nix", + "description": "Merge sets of attributes and use the function \`f\` to merge attributes + values.", + "example": "zipAttrsWithNames ["a"] (name: vs: vs) [{a = "x";} {a = "y"; b = "z";}] +=> { a = ["x" "y"]; }", + "fn_type": "zipAttrsWithNames :: [ String ] -> (String -> [ Any ] -> Any) -> [ AttrSet ] -> AttrSet", + "id": "lib.attrsets.zipAttrsWithNames", + "line": 629, + "name": "zipAttrsWithNames", + }, + { + "category": "./lib/attrsets.nix", + "description": "Merge sets of attributes and use the function f to merge attribute values. + Like \`lib.attrsets.zipAttrsWithNames\` with all key names are passed for \`names\`. + + Implementation note: Common names appear multiple times in the list of + names, hopefully this does not affect the system because the maximal + laziness avoid computing twice the same expression and \`listToAttrs\` does + not care about duplicated attribute names.", + "example": "zipAttrsWith (name: values: values) [{a = "x";} {a = "y"; b = "z";}] +=> { a = ["x" "y"]; b = ["z"]; }", + "fn_type": "zipAttrsWith :: (String -> [ Any ] -> Any) -> [ AttrSet ] -> AttrSet", + "id": "lib.attrsets.zipAttrsWith", + "line": 657, + "name": "zipAttrsWith", + }, + { + "category": "./lib/attrsets.nix", + "description": "Merge sets of attributes and combine each attribute value in to a list. + + Like \`lib.attrsets.zipAttrsWith\` with \`(name: values: values)\` as the function.", + "example": "zipAttrs [{a = "x";} {a = "y"; b = "z";}] +=> { a = ["x" "y"]; b = ["z"]; }", + "fn_type": "zipAttrs :: [ AttrSet ] -> AttrSet", + "id": "lib.attrsets.zipAttrs", + "line": 672, + "name": "zipAttrs", + }, + { + "category": "./lib/attrsets.nix", + "description": "Does the same as the update operator '//' except that attributes are + merged until the given predicate is verified. The predicate should + accept 3 arguments which are the path to reach the attribute, a part of + the first attribute set and a part of the second attribute set. When + the predicate is satisfied, the value of the first attribute set is + replaced by the value of the second attribute set.", + "example": "recursiveUpdateUntil (path: l: r: path == ["foo"]) { + # first attribute set + foo.bar = 1; + foo.baz = 2; + bar = 3; +} { + #second attribute set + foo.bar = 1; + foo.quz = 2; + baz = 4; +} + +=> { + foo.bar = 1; # 'foo.*' from the second set + foo.quz = 2; # + bar = 3; # 'bar' from the first set + baz = 4; # 'baz' from the second set +}", + "fn_type": "recursiveUpdateUntil :: ( [ String ] -> AttrSet -> AttrSet -> Bool ) -> AttrSet -> AttrSet -> AttrSet", + "id": "lib.attrsets.recursiveUpdateUntil", + "line": 708, + "name": "recursiveUpdateUntil", + }, + { + "category": "./lib/attrsets.nix", + "description": "A recursive variant of the update operator ‘//’. The recursion + stops when one of the attribute values is not an attribute set, + in which case the right hand side value takes precedence over the + left hand side value.", + "example": "recursiveUpdate { + boot.loader.grub.enable = true; + boot.loader.grub.device = "/dev/hda"; +} { + boot.loader.grub.device = ""; +} + +returns: { + boot.loader.grub.enable = true; + boot.loader.grub.device = ""; +}", + "fn_type": "recursiveUpdate :: AttrSet -> AttrSet -> AttrSet", + "id": "lib.attrsets.recursiveUpdate", + "line": 748, + "name": "recursiveUpdate", + }, + { + "category": "./lib/attrsets.nix", + "description": "Returns true if the pattern is contained in the set. False otherwise.", + "example": "matchAttrs { cpu = {}; } { cpu = { bits = 64; }; } +=> true", + "fn_type": "matchAttrs :: AttrSet -> AttrSet -> Bool", + "id": "lib.attrsets.matchAttrs", + "line": 765, + "name": "matchAttrs", + }, + { + "category": "./lib/attrsets.nix", + "description": "Override only the attributes that are already present in the old set + useful for deep-overriding.", + "example": "overrideExisting {} { a = 1; } +=> {} +overrideExisting { b = 2; } { a = 1; } +=> { b = 2; } +overrideExisting { a = 3; b = 2; } { a = 1; } +=> { a = 1; b = 2; }", + "fn_type": "overrideExisting :: AttrSet -> AttrSet -> AttrSet", + "id": "lib.attrsets.overrideExisting", + "line": 793, + "name": "overrideExisting", + }, + { + "category": "./lib/attrsets.nix", + "description": "Turns a list of strings into a human-readable description of those + strings represented as an attribute path. The result of this function is + not intended to be machine-readable. + Create a new attribute set with \`value\` set at the nested attribute location specified in \`attrPath\`.", + "example": "showAttrPath [ "foo" "10" "bar" ] +=> "foo.\\"10\\".bar" +showAttrPath [] +=> """, + "fn_type": "showAttrPath :: [String] -> String", + "id": "lib.attrsets.showAttrPath", + "line": 815, + "name": "showAttrPath", + }, + { + "category": "./lib/attrsets.nix", + "description": "Get a package output. + If no output is found, fallback to \`.out\` and then to the default.", + "example": "getOutput "dev" pkgs.openssl +=> "/nix/store/9rz8gxhzf8sw4kf2j2f1grr49w8zx5vj-openssl-1.0.1r-dev"", + "fn_type": "getOutput :: String -> Derivation -> String", + "id": "lib.attrsets.getOutput", + "line": 832, + "name": "getOutput", + }, + { + "category": "./lib/attrsets.nix", + "description": "Get a package's \`bin\` output. + If the output does not exist, fallback to \`.out\` and then to the default.", + "example": "getBin pkgs.openssl +=> "/nix/store/9rz8gxhzf8sw4kf2j2f1grr49w8zx5vj-openssl-1.0.1r"", + "fn_type": "getBin :: Derivation -> String", + "id": "lib.attrsets.getBin", + "line": 847, + "name": "getBin", + }, + { + "category": "./lib/attrsets.nix", + "description": "Get a package's \`lib\` output. + If the output does not exist, fallback to \`.out\` and then to the default.", + "example": "getLib pkgs.openssl +=> "/nix/store/9rz8gxhzf8sw4kf2j2f1grr49w8zx5vj-openssl-1.0.1r-lib"", + "fn_type": "getLib :: Derivation -> String", + "id": "lib.attrsets.getLib", + "line": 860, + "name": "getLib", + }, + { + "category": "./lib/attrsets.nix", + "description": "Get a package's \`dev\` output. + If the output does not exist, fallback to \`.out\` and then to the default.", + "example": "getDev pkgs.openssl +=> "/nix/store/9rz8gxhzf8sw4kf2j2f1grr49w8zx5vj-openssl-1.0.1r-dev"", + "fn_type": "getDev :: Derivation -> String", + "id": "lib.attrsets.getDev", + "line": 873, + "name": "getDev", + }, + { + "category": "./lib/attrsets.nix", + "description": "Get a package's \`man\` output. + If the output does not exist, fallback to \`.out\` and then to the default.", + "example": "getMan pkgs.openssl +=> "/nix/store/9rz8gxhzf8sw4kf2j2f1grr49w8zx5vj-openssl-1.0.1r-man"", + "fn_type": "getMan :: Derivation -> String", + "id": "lib.attrsets.getMan", + "line": 886, + "name": "getMan", + }, + { + "category": "./lib/attrsets.nix", + "description": "Pick the outputs of packages to place in \`buildInputs\`", + "example": null, + "fn_type": "chooseDevOutputs :: [Derivation] -> [String]", + "id": "lib.attrsets.chooseDevOutputs", + "line": 893, + "name": "chooseDevOutputs", + }, + { + "category": "./lib/attrsets.nix", + "description": "Make various Nix tools consider the contents of the resulting + attribute set when looking for what to build, find, etc. + + This function only affects a single attribute set; it does not + apply itself recursively for nested attribute sets.", + "example": "{ pkgs ? import {} }: +{ + myTools = pkgs.lib.recurseIntoAttrs { + inherit (pkgs) hello figlet; + }; +}", + "fn_type": "recurseIntoAttrs :: AttrSet -> AttrSet", + "id": "lib.attrsets.recurseIntoAttrs", + "line": 916, + "name": "recurseIntoAttrs", + }, + { + "category": "./lib/attrsets.nix", + "description": "Undo the effect of recurseIntoAttrs.", + "example": null, + "fn_type": "dontRecurseIntoAttrs :: AttrSet -> AttrSet", + "id": "lib.attrsets.dontRecurseIntoAttrs", + "line": 926, + "name": "dontRecurseIntoAttrs", + }, + { + "category": "./lib/attrsets.nix", + "description": "\`unionOfDisjoint x y\` is equal to \`x // y // z\` where the + attrnames in \`z\` are the intersection of the attrnames in \`x\` and + \`y\`, and all values \`assert\` with an error message. This + operator is commutative, unlike (//).", + "example": null, + "fn_type": "unionOfDisjoint :: AttrSet -> AttrSet -> AttrSet", + "id": "lib.attrsets.unionOfDisjoint", + "line": 938, + "name": "unionOfDisjoint", + }, + { + "category": "./lib/asserts.nix", + "description": "Throw if pred is false, else return pred. + Intended to be used to augment asserts with helpful error messages.", + "example": "assertMsg false "nope" +stderr> error: nope + +assert assertMsg ("foo" == "bar") "foo is not bar, silly"; "" +stderr> error: foo is not bar, silly", + "fn_type": "assertMsg :: Bool -> String -> Bool", + "id": "lib.asserts.assertMsg", + "line": 19, + "name": "assertMsg", + }, + { + "category": "./lib/asserts.nix", + "description": "Specialized \`assertMsg\` for checking if \`val\` is one of the elements + of the list \`xs\`. Useful for checking enums.", + "example": "let sslLibrary = "libressl"; +in assertOneOf "sslLibrary" sslLibrary [ "openssl" "bearssl" ] +stderr> error: sslLibrary must be one of [ +stderr> "openssl" +stderr> "bearssl" +stderr> ], but is: "libressl"", + "fn_type": "assertOneOf :: String -> ComparableVal -> List ComparableVal -> Bool", + "id": "lib.asserts.assertOneOf", + "line": 40, + "name": "assertOneOf", + }, +] +`; diff --git a/tests/data.test.js b/tests/data.test.js new file mode 100644 index 0000000..97c1887 --- /dev/null +++ b/tests/data.test.js @@ -0,0 +1,9 @@ +import libData from "./data/lib.json"; + +test("adds 1 + 2 to equal 3", () => { + expect(1 + 2).toBe(3); +}); + +it("confirm data update", () => { + expect(libData).toMatchSnapshot(); +}); diff --git a/tests/jest.config.js b/tests/jest.config.js new file mode 100644 index 0000000..043645f --- /dev/null +++ b/tests/jest.config.js @@ -0,0 +1,10 @@ +/** @type {import('jest').Config} */ + +import { defaults } from "jest-config"; + +const config = { + ...defaults, + // transform: {}, +}; + +export default config; diff --git a/tests/package-lock.json b/tests/package-lock.json new file mode 100644 index 0000000..8f1a0c2 --- /dev/null +++ b/tests/package-lock.json @@ -0,0 +1,3434 @@ +{ + "name": "tests", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tests", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "jest": "^29.4.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", + "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", + "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.0", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.0", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.0", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/@babel/generator": { + "version": "7.21.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", + "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", + "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", + "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.2", + "@babel/types": "^7.21.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", + "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.4.3.tgz", + "integrity": "sha512-W/o/34+wQuXlgqlPYTansOSiBnuxrTv61dEVkA6HNmpcgHLUjfaUbdqt6oVvOzaawwo9IdW9QOtMgQ1ScSZC4A==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.4.3", + "jest-util": "^29.4.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.4.3.tgz", + "integrity": "sha512-56QvBq60fS4SPZCuM7T+7scNrkGIe7Mr6PVIXUpu48ouvRaWOFqRPV91eifvFM0ay2HmfswXiGf97NGUN5KofQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.4.3", + "@jest/reporters": "^29.4.3", + "@jest/test-result": "^29.4.3", + "@jest/transform": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.4.3", + "jest-config": "^29.4.3", + "jest-haste-map": "^29.4.3", + "jest-message-util": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.4.3", + "jest-resolve-dependencies": "^29.4.3", + "jest-runner": "^29.4.3", + "jest-runtime": "^29.4.3", + "jest-snapshot": "^29.4.3", + "jest-util": "^29.4.3", + "jest-validate": "^29.4.3", + "jest-watcher": "^29.4.3", + "micromatch": "^4.0.4", + "pretty-format": "^29.4.3", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.4.3.tgz", + "integrity": "sha512-dq5S6408IxIa+lr54zeqce+QgI+CJT4nmmA+1yzFgtcsGK8c/EyiUb9XQOgz3BMKrRDfKseeOaxj2eO8LlD3lA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/node": "*", + "jest-mock": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.4.3.tgz", + "integrity": "sha512-iktRU/YsxEtumI9zsPctYUk7ptpC+AVLLk1Ax3AsA4g1C+8OOnKDkIQBDHtD5hA/+VtgMd5AWI5gNlcAlt2vxQ==", + "dev": true, + "dependencies": { + "expect": "^29.4.3", + "jest-snapshot": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.4.3.tgz", + "integrity": "sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.4.3.tgz", + "integrity": "sha512-4Hote2MGcCTWSD2gwl0dwbCpBRHhE6olYEuTj8FMowdg3oQWNKr2YuxenPQYZ7+PfqPY1k98wKDU4Z+Hvd4Tiw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.4.3", + "jest-mock": "^29.4.3", + "jest-util": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.4.3.tgz", + "integrity": "sha512-8BQ/5EzfOLG7AaMcDh7yFCbfRLtsc+09E1RQmRBI4D6QQk4m6NSK/MXo+3bJrBN0yU8A2/VIcqhvsOLFmziioA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.4.3", + "@jest/expect": "^29.4.3", + "@jest/types": "^29.4.3", + "jest-mock": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.4.3.tgz", + "integrity": "sha512-sr2I7BmOjJhyqj9ANC6CTLsL4emMoka7HkQpcoMRlhCbQJjz2zsRzw0BDPiPyEFDXAbxKgGFYuQZiSJ1Y6YoTg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.4.3", + "@jest/test-result": "^29.4.3", + "@jest/transform": "^29.4.3", + "@jest/types": "^29.4.3", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.4.3", + "jest-util": "^29.4.3", + "jest-worker": "^29.4.3", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.25.16" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", + "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.4.3.tgz", + "integrity": "sha512-Oi4u9NfBolMq9MASPwuWTlC5WvmNRwI4S8YrQg5R5Gi47DYlBe3sh7ILTqi/LGrK1XUE4XY9KZcQJTH1WJCLLA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.4.3.tgz", + "integrity": "sha512-yi/t2nES4GB4G0mjLc0RInCq/cNr9dNwJxcGg8sslajua5Kb4kmozAc+qPLzplhBgfw1vLItbjyHzUN92UXicw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.4.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.3.tgz", + "integrity": "sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.4.3", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.4.3", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", + "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "18.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.1.tgz", + "integrity": "sha512-QH+37Qds3E0eDlReeboBxfHbX9omAcBCXEzswCu6jySP642jiM3cYSIkU/REqwhCUqXdonHFuBfJDiAJxMNhaQ==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", + "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/babel-jest": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.4.3.tgz", + "integrity": "sha512-o45Wyn32svZE+LnMVWv/Z4x0SwtLbh4FyGcYtR20kIWd+rdrDZ9Fzq8Ml3MYLD+mZvEdzCjZsCnYZ2jpJyQ+Nw==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.4.3", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.4.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.3.tgz", + "integrity": "sha512-mB6q2q3oahKphy5V7CpnNqZOCkxxZ9aokf1eh82Dy3jQmg4xvM1tGrh5y6BQUJh4a3Pj9+eLfwvAZ7VNKg7H8Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.4.3.tgz", + "integrity": "sha512-gWx6COtSuma6n9bw+8/F+2PCXrIgxV/D1TJFnp6OyBK2cxPWg0K9p/sriNYeifKjpUkMViWQ09DSWtzJQRETsw==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.4.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001457", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001457.tgz", + "integrity": "sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", + "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.310", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.310.tgz", + "integrity": "sha512-/xlATgfwkm5uDDwLw5nt/MNEf7c1oazLURMZLy39vOioGYyYzLWIDT8fZMJak6qTiAJ7udFTy7JG7ziyjNutiA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.4.3.tgz", + "integrity": "sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.4.3", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.4.3", + "jest-message-util": "^29.4.3", + "jest-util": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.4.3.tgz", + "integrity": "sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA==", + "dev": true, + "dependencies": { + "@jest/core": "^29.4.3", + "@jest/types": "^29.4.3", + "import-local": "^3.0.2", + "jest-cli": "^29.4.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.4.3.tgz", + "integrity": "sha512-Vn5cLuWuwmi2GNNbokPOEcvrXGSGrqVnPEZV7rC6P7ck07Dyw9RFnvWglnupSh+hGys0ajGtw/bc2ZgweljQoQ==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.4.3.tgz", + "integrity": "sha512-Vw/bVvcexmdJ7MLmgdT3ZjkJ3LKu8IlpefYokxiqoZy6OCQ2VAm6Vk3t/qHiAGUXbdbJKJWnc8gH3ypTbB/OBw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.4.3", + "@jest/expect": "^29.4.3", + "@jest/test-result": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.4.3", + "jest-matcher-utils": "^29.4.3", + "jest-message-util": "^29.4.3", + "jest-runtime": "^29.4.3", + "jest-snapshot": "^29.4.3", + "jest-util": "^29.4.3", + "p-limit": "^3.1.0", + "pretty-format": "^29.4.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.4.3.tgz", + "integrity": "sha512-PiiAPuFNfWWolCE6t3ZrDXQc6OsAuM3/tVW0u27UWc1KE+n/HSn5dSE6B2juqN7WP+PP0jAcnKtGmI4u8GMYCg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.4.3", + "@jest/test-result": "^29.4.3", + "@jest/types": "^29.4.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.4.3", + "jest-util": "^29.4.3", + "jest-validate": "^29.4.3", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.4.3.tgz", + "integrity": "sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.4.3", + "@jest/types": "^29.4.3", + "babel-jest": "^29.4.3", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.4.3", + "jest-environment-node": "^29.4.3", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.4.3", + "jest-runner": "^29.4.3", + "jest-util": "^29.4.3", + "jest-validate": "^29.4.3", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.4.3", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.4.3.tgz", + "integrity": "sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.4.3.tgz", + "integrity": "sha512-1ElHNAnKcbJb/b+L+7j0/w7bDvljw4gTv1wL9fYOczeJrbTbkMGQ5iQPFJ3eFQH19VPTx1IyfePdqSpePKss7Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.4.3", + "pretty-format": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.4.3.tgz", + "integrity": "sha512-gAiEnSKF104fsGDXNkwk49jD/0N0Bqu2K9+aMQXA6avzsA9H3Fiv1PW2D+gzbOSR705bWd2wJZRFEFpV0tXISg==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.4.3", + "@jest/fake-timers": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/node": "*", + "jest-mock": "^29.4.3", + "jest-util": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", + "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.4.3", + "jest-worker": "^29.4.3", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.4.3.tgz", + "integrity": "sha512-9yw4VC1v2NspMMeV3daQ1yXPNxMgCzwq9BocCwYrRgXe4uaEJPAN0ZK37nFBhcy3cUwEVstFecFLaTHpF7NiGA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.4.3.tgz", + "integrity": "sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.4.3.tgz", + "integrity": "sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.4.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.4.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.4.3.tgz", + "integrity": "sha512-LjFgMg+xed9BdkPMyIJh+r3KeHt1klXPJYBULXVVAkbTaaKjPX1o1uVCAZADMEp/kOxGTwy/Ot8XbvgItOrHEg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.3", + "@types/node": "*", + "jest-util": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.4.3.tgz", + "integrity": "sha512-GPokE1tzguRyT7dkxBim4wSx6E45S3bOQ7ZdKEG+Qj0Oac9+6AwJPCk0TZh5Vu0xzeX4afpb+eDmgbmZFFwpOw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.3", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.4.3", + "jest-validate": "^29.4.3", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.3.tgz", + "integrity": "sha512-uvKMZAQ3nmXLH7O8WAOhS5l0iWyT3WmnJBdmIHiV5tBbdaDZ1wqtNX04FONGoaFvSOSHBJxnwAVnSn1WHdGVaw==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.4.3.tgz", + "integrity": "sha512-GWPTEiGmtHZv1KKeWlTX9SIFuK19uLXlRQU43ceOQ2hIfA5yPEJC7AMkvFKpdCHx6pNEdOD+2+8zbniEi3v3gA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.4.3", + "@jest/environment": "^29.4.3", + "@jest/test-result": "^29.4.3", + "@jest/transform": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.4.3", + "jest-haste-map": "^29.4.3", + "jest-leak-detector": "^29.4.3", + "jest-message-util": "^29.4.3", + "jest-resolve": "^29.4.3", + "jest-runtime": "^29.4.3", + "jest-util": "^29.4.3", + "jest-watcher": "^29.4.3", + "jest-worker": "^29.4.3", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.4.3.tgz", + "integrity": "sha512-F5bHvxSH+LvLV24vVB3L8K467dt3y3dio6V3W89dUz9nzvTpqd/HcT9zfYKL2aZPvD63vQFgLvaUX/UpUhrP6Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.4.3", + "@jest/fake-timers": "^29.4.3", + "@jest/globals": "^29.4.3", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.4.3", + "@jest/transform": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.3", + "jest-message-util": "^29.4.3", + "jest-mock": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.4.3", + "jest-snapshot": "^29.4.3", + "jest-util": "^29.4.3", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.4.3.tgz", + "integrity": "sha512-NGlsqL0jLPDW91dz304QTM/SNO99lpcSYYAjNiX0Ou+sSGgkanKBcSjCfp/pqmiiO1nQaOyLp6XQddAzRcx3Xw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.4.3", + "@jest/transform": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.4.3", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.4.3", + "jest-get-type": "^29.4.3", + "jest-haste-map": "^29.4.3", + "jest-matcher-utils": "^29.4.3", + "jest-message-util": "^29.4.3", + "jest-util": "^29.4.3", + "natural-compare": "^1.4.0", + "pretty-format": "^29.4.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", + "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.4.3.tgz", + "integrity": "sha512-J3u5v7aPQoXPzaar6GndAVhdQcZr/3osWSgTeKg5v574I9ybX/dTyH0AJFb5XgXIB7faVhf+rS7t4p3lL9qFaw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.4.3.tgz", + "integrity": "sha512-zwlXH3DN3iksoIZNk73etl1HzKyi5FuQdYLnkQKm5BW4n8HpoG59xSwpVdFrnh60iRRaRBGw0gcymIxjJENPcA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.4.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", + "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.4.3", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.3.tgz", + "integrity": "sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.0.tgz", + "integrity": "sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/tests/package.json b/tests/package.json new file mode 100644 index 0000000..82328a5 --- /dev/null +++ b/tests/package.json @@ -0,0 +1,15 @@ +{ + "name": "tests", + "version": "1.0.0", + "description": "", + "module": "index.js", + "type": "module", + "scripts": { + "test": "NODE_OPTIONS=--experimental-vm-modules npx jest" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "jest": "^29.4.3" + } +}