apple/pkl · error · VmException

invalid object

invalid object

Error message

invalid object

What it means

parseResolvedDependency requires each resolved dependency entry value to be a JSON object. If the value is not a JsObject, a VmException evalError 'invalid object' is thrown. The message is unhelpfully vague — it does not name the key or expected shape.

Solutions

  1. Make each resolvedDependencies value a full dependency object with type and uri fields
  2. Regenerate the deps file with the Pkl CLI rather than editing manually
  3. Locate the offending entry by validating every value is an object before parsing

Example fix

// before
"resolvedDependencies": { "package://example.com/foo@1": "remote" }
// after
"resolvedDependencies": { "package://example.com/foo@1": { "type": "remote", "uri": "package://example.com/foo@1", "checksums": {...} } }
Defensive patterns

Strategy: type-guard

Validate before calling

for (var e : resolvedDeps.entrySet()) {
  if (!(e.getValue() instanceof Map)) throw new IllegalArgumentException("entry not an object: " + e.getKey());
}

Type guard

boolean isDependencyObject(Object o) { return o instanceof Map<?,?> m && m.containsKey("type") && m.containsKey("uri"); }

Try / catch

try { ProjectDeps.parse(input); } catch (PklException e) { /* find non-object entry and regenerate file */ }

Prevention

When it happens

Trigger: ProjectDeps parsing where any entry under resolvedDependencies maps to a non-object value (string, number, array, null) instead of {type, uri, checksums?}.

Common situations: Hand-edited deps files; missing dependency object fields due to partial writes or merge conflicts; script-generated JSON with the wrong nesting.

Understand the failure class

Background: Type mismatch errors: IllegalArgumentException, TypeError and type guards across 150 open-source libraries — this error's family across 150 libraries.

Related errors


AI-assisted analysis of apple/pkl@f3efcbfc9b (2026-09-08). Data as JSON: /api/errors/5d5cd43f68889fe2. Report an issue: GitHub.

Appendix: source

Thrown at pkl-core/src/main/java/org/pkl/core/project/ProjectDeps.java:119

  private static EconomicMap<CanonicalPackageUri, Dependency> parseResolvedDependencies(
      Object object) throws JsonParseException, URISyntaxException {
    if (!(object instanceof JsObject jsObj)) {
      throw new FormatException("resolvedDependencies", "object", object.getClass());
    }
    var ret = EconomicMaps.<CanonicalPackageUri, Dependency>create(jsObj.size());
    for (var entry : jsObj.entrySet()) {
      Dependency resolvedDependency = parseResolvedDependency(entry);
      var canonicalPackageUri = CanonicalPackageUri.of(entry.getKey());
      ret.put(canonicalPackageUri, resolvedDependency);
    }
    return ret;
  }

  private static Dependency parseResolvedDependency(Entry<String, Object> entry)
      throws JsonParseException {
    var input = entry.getValue();
    if (!(input instanceof JsObject obj)) {
      throw new VmExceptionBuilder().evalError("invalid object").build();
    }
    var type = obj.getString("type");
    var uri = obj.get("uri", PackageUtils::parsePackageUriWithoutChecksums);
    if (type.equals("remote")) {
      var checksums = DependencyMetadata.parseChecksums(obj.getObject("checksums"));
      return new RemoteDependency(uri, checksums);
    } else {
      assert type.equals("local");
      var pathStr = obj.getString("path");
      return new Dependency.LocalDependency(uri, Path.of(pathStr));
    }
  }

  public ProjectDeps(EconomicMap<CanonicalPackageUri, Dependency> resolvedDependencies) {
    this.resolvedDependencies = resolvedDependencies;
  }

  /** Given a declared dependency, return the resolved dependency. */

View on GitHub (pinned to f3efcbfc9b)