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
- Make each resolvedDependencies value a full dependency object with type and uri fields
- Regenerate the deps file with the Pkl CLI rather than editing manually
- 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
- Keep each resolvedDependencies value a complete dependency object
- Validate entries before parsing
- Regenerate the file with tooling instead of manual edits
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
- array
- double
- FormatException(key, "array", ret.getClass())
- FormatException(key, "boolean", ret.getClass())
- FormatException(key, "integer", ret.getClass())
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)