lib/modules: Only interpret class declaration in non-shorthand mode

This is to avoid stealing keys from submodules. `class` might be
common enough that reinterpreting existing `class` attributes in
configurations as a declaration leads to fairly widespread problems.

+1 -1
lib/modules.nix
···
imports = m.require or [] ++ m.imports or [];
options = {};
config = addFreeformType (removeAttrs m ["_file" "key" "disabledModules" "require" "imports" "freeformType"]);
-
class = m.class or null;
+
class = null;
};
applyModuleArgsIfFunction = key: f: args@{ config, options, lib, ... }:
+2
lib/tests/modules.sh
···
## Freeform modules
# Assigning without a declared option should work
checkConfigOutput '^"24"$' config.value ./freeform-attrsOf.nix ./define-value-string.nix
+
# Shorthand modules interpret `meta` and `class` as config items
+
checkConfigOutput '^true$' options._module.args.value.result ./freeform-attrsOf.nix ./define-freeform-keywords-shorthand.nix
# No freeform assignments shouldn't make it error
checkConfigOutput '^{ }$' config ./freeform-attrsOf.nix
# but only if the type matches
+1
lib/tests/modules/class-check.nix
···
./module-class-is-nixos.nix
{ _file = "foo.nix#darwinModules.default";
class = "darwin";
+
config = {};
imports = [];
}
];
+15
lib/tests/modules/define-freeform-keywords-shorthand.nix
···
+
{ config, ... }: {
+
class = { "just" = "data"; };
+
a = "one";
+
b = "two";
+
meta = "meta";
+
+
_module.args.result =
+
let r = builtins.removeAttrs config [ "_module" ];
+
in builtins.trace (builtins.deepSeq r r) (r == {
+
a = "one";
+
b = "two";
+
class = { "just" = "data"; };
+
meta = "meta";
+
});
+
}