Skip to content

Poor typecheck error message when using absolute package import for project dependency #1314

@StefMa

Description

@StefMa

[bioball] When using an absolute package import in place of a project import, Pkl eval will fail (expected). However, the error message thrown by Pkl is quite poor.

Original issue:


Given

PklProject:

amends "pkl:Project"

dependencies {
  ["pkl.impl.ghactions"] { uri = "package://pkg.pkl-lang.org/pkl-project-commons/pkl.impl.ghactions@0.4.2" }
  ["gha"] { uri = "package://pkg.pkl-lang.org/github.com/stefma/pkl-gha/com.github.action@0.0.6" }
}

index.pkl:

amends "@gha/Workflow.pkl"
import "ver/test.pkl"

name = "PKL IntelliJ CI"

on {
  public {}
}

jobs {
  ["a"] {
    name = "Placeholder"
    `runs-on` = "ubuntu-latest"
    steps {
      new {
        name = "Do nothing"
        run = "echo 'This is a placeholder job.'"
      }
      new test.Action {
        with {
          `java-version` = ""
        }
      }
    }
  }
}

ver/test.pkl:

import "package://pkg.pkl-lang.org/github.com/stefma/pkl-gha/com.github.action@0.0.6#/Workflow.pkl"

class Action extends Workflow.TypedStep {
  fixed uses = "actions/setup-java@v3"
  with: ActionInputs?
}

class ActionInputs {
  `java-version`: (String|Number|Boolean)?
}

Caution

Note the different imports. ver/test.pkl doesn't use @gha but the full package import.

When-Then

If I run pkl eval index.pkl then I get the following error

–– Pkl Error ––
Expected value of type `*Step|TypedStep`, but got type `test#Action`.
Value: new Action { name = ?; id = ?; `if` = ?; `timeout-minutes` = ?; env = ?; `wor...                                                                                                                                                                                                                                    

1019 | steps: Listing<*Step|TypedStep>
                      ^^^^^^^^^^^^^^^
at com.github.action.Workflow#DefaultJob.steps (projectpackage://pkg.pkl-lang.org/github.com/stefma/pkl-gha/com.github.action@0.0.6#/Workflow.pkl)

21 | new test.Action {
     ^^^^^^^^^^^^^^^^^
at index#jobs["a"].steps[#2] (file:///Users/stefan/Developer/pkl/pkl-intellij/.github/index.pkl, line 21)

128 | renderer.renderDocument(value)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at pkl.base#Module.output.text (https://github.com/apple/pkl/blob/0.30.0/stdlib/base.pkl#L128)

1318 | text = "# Do not modify!\n# This file was generated from a template using https://github.com/StefMa/pkl-gha\n\n\(super.text)"
                                                                                                                        ^^^^^^^^^^
at com.github.action.Workflow#output.text (projectpackage://pkg.pkl-lang.org/github.com/stefma/pkl-gha/com.github.action@0.0.6#/Workflow.pkl)

132 | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes("UTF-8")
                                                                         ^^^^
at pkl.base#Module.output.bytes (https://github.com/apple/pkl/blob/0.30.0/stdlib/base.pkl#L132)

Possible solution

Use the same import statement in both files!
Either use @gha/ or package:// in index.pkl and ver/test.pkl

Observation

Even though the import is the same, pkl doesn't know that it is "valid".
One pkl file uses the dependency notion (defined in PklProject), while the other uses the package import.

Expectation

I would expect that pkl can detect that using the @gha import is equal to the package:// import (for the same package obviously) and therefore don't error in such a import mix case.


Feel free to change the title of this issue.
I've no idea how to call this 🫣

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions