pentaho/pentaho-kettle · error · ArgumentInvalidError

Module with id ' ' provides no specification.

Error message

Module with id '{id}' provides no specification.

What it means

pentaho.lang.ArgumentInvalidError thrown by prepareModule when a moduleSpecMap entry exists under a valid id but its specification value is falsy (null, undefined, empty). Each module id must map to a non-empty specification object.

Solutions

  1. Provide a non-empty specification object for every module id in the map.
  2. Remove entries whose specs are not yet defined.
  3. Validate the spec map before passing it to configuration.

Example fix

// before
{"pentaho/visual/impl/bar": null}
// after
{"pentaho/visual/impl/bar": {"type": "pentaho/type/complex"}}
Defensive patterns

Strategy: validation

Validate before calling

Object.keys(moduleSpecMap).forEach(function(k) {
  if(!moduleSpecMap[k]) throw new Error("module '" + k + "' has empty spec");
});

Type guard

function allSpecsPresent(map) { return Object.keys(map).every(function(k) { return !!map[k]; }); }

Try / catch

try { metaService.__configure(map); } catch(e) { if(/provides no specification/.test(e.message)) { console.error("missing spec entry", e.message); } else { throw e; } }

Prevention

When it happens

Trigger: Passing {"my/module": null} or {"my/module": undefined} in a moduleSpecMap to MetaService configuration.

Common situations: Config file where a module entry was left empty; a variable holding the spec was undefined; YAML/JSON config converted with null values for placeholder entries.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/513b01b02ded95a1. Report an issue: GitHub.

Appendix: source

Thrown at plugins/core-ui/src/main/resources/app/pentaho/_core/module/MetaService.js:92

        preparedModuleIdList.forEach(function(id) {
          moduleResolver(id);
        });

        return this;

        // ---

        // 1. Perform basic validation and index by id and alias.
        function prepareModule(moduleSpec, id) {
          if(!id) {
            throw new ArgumentInvalidError(
              "moduleSpecMap",
              "Module map contains an empty module identifier.");
          }

          if(!moduleSpec) {
            throw new ArgumentInvalidError(
              "moduleSpecMap",
              "Module with id '" + id + "' provides no specification.");
          }

          // ---

          var module = this.__get(id);
          if(module !== null) {
            module.__configure(moduleSpec);
          } else {

            if(O.hasOwn(preparedModuleSpecMap, id)) {
              throw new ArgumentInvalidError(
                "moduleSpecMap",
                "A module with the id or alias '" + id + "' is already being defined.");
            }

            moduleSpec = Object.create(moduleSpec);

View on GitHub (pinned to f3058517a1)